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

1.83    ! takayama    1: /* $OpenXM: OpenXM/src/asir-contrib/packages/src/os_muldif.rr,v 1.82 2021/07/10 23:18:13 takayama Exp $ */
1.57      takayama    2: /* The latest version will be at https://www.ms.u-tokyo.ac.jp/~oshima/index-j.html
1.6       takayama    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.81      takayama    9:  *          Toshio Oshima (Nov. 2007 - July 2021)
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$
1.70      takayama   24: static TeXPages$
1.6       takayama   25: static DIROUT$
1.16      takayama   26: static DIROUTD$
1.6       takayama   27: static DVIOUTL$
                     28: static DVIOUTA$
                     29: static DVIOUTB$
                     30: static DVIOUTH$
                     31: static DVIOUTF$
                     32: static LCOPT$
                     33: static COLOPT$
                     34: static LPOPT$
                     35: static LFOPT$
                     36: static ErMsg$
                     37: static FLIST$
                     38: static IsYes$
                     39: static XYPrec$
                     40: static XYcm$
                     41: static TikZ$
                     42: static XYLim$
                     43: static Canvas$
                     44: static ID_PLOT$
                     45: static Rand$
                     46: static LQS$
1.45      takayama   47: static SVORG$
1.6       takayama   48: localf spType2$
                     49: localf erno$
                     50: localf chkfun$
                     51: localf makev$
                     52: localf shortv$
                     53: localf makenewv$
                     54: localf vweyl$
                     55: localf mycat$
                     56: localf mycat0$
1.9       takayama   57: localf fcat$
1.6       takayama   58: localf findin$
                     59: localf countin$
                     60: localf mycoef$
                     61: localf mydiff$
                     62: localf myediff$
1.56      takayama   63: localf mypdiff$
                     64: localf pTaylor$
1.57      takayama   65: localf pwTaylor$
1.6       takayama   66: localf m2l$
                     67: localf m2ll$
                     68: localf mydeg$
                     69: localf pfctr$
                     70: localf mymindeg$
                     71: localf m1div$
                     72: localf mulsubst$
                     73: localf cmpsimple$
                     74: localf simplify$
                     75: localf monotos$
                     76: localf minustos$
                     77: localf monototex$
                     78: localf vnext$
                     79: localf ldict$
                     80: localf ndict$
                     81: localf nextsub$
                     82: localf nextpart$
                     83: localf transpart$
                     84: localf trpos$
                     85: localf sprod$
                     86: localf sinv$
                     87: localf slen$
1.77      takayama   88: localf sexps$
1.6       takayama   89: localf sord$
                     90: localf vprod$
                     91: localf dvangle$
                     92: localf dvprod$
                     93: localf dnorm$
1.71      takayama   94: localf dext$
1.6       takayama   95: localf mulseries$
                     96: localf pluspower$
                     97: localf vtozv$
                     98: localf dupmat$
                     99: localf matrtop$
                    100: localf mytrace$
                    101: localf mydet$
1.71      takayama  102: localf permanent$
1.6       takayama  103: localf mperm$
                    104: localf mtranspose$
                    105: localf mtoupper$
                    106: localf mydet2$
                    107: localf myrank$
                    108: localf meigen$
                    109: localf transm$
                    110: localf vgen$
                    111: localf mmc$
                    112: localf lpgcd$
                    113: localf mdivisor$
                    114: localf mdsimplify$
                    115: localf m2mc$
                    116: localf easierpol$
                    117: localf paracmpl$
                    118: localf mykernel$
                    119: localf myimage$
                    120: localf mymod$
                    121: localf mmod$
                    122: localf ladd$
1.71      takayama  123: localf lsub$
1.6       takayama  124: localf lchange$
                    125: localf llsize$
                    126: localf llbase$
1.60      takayama  127: localf llget$
1.6       takayama  128: localf lsort$
1.44      takayama  129: localf rsort$
1.22      takayama  130: localf lpair$
1.6       takayama  131: localf lmax$
                    132: localf lmin$
                    133: localf lgcd$
                    134: localf llcm$
                    135: localf ldev$
                    136: localf lsol$
                    137: localf lnsol$
                    138: localf l2p$
                    139: localf m2v$
                    140: localf lv2m$
                    141: localf m2lv$
                    142: localf s2m$
                    143: localf c2m$
                    144: localf m2diag$
                    145: localf myinv$
                    146: localf madjust$
                    147: localf mpower$
                    148: localf mrot$
                    149: localf texlen$
                    150: localf isdif$
1.69      takayama  151: localf isfctr$
1.6       takayama  152: localf fctrtos$
                    153: localf texlim$
                    154: localf fmult$
                    155: localf radd$
                    156: localf getel$
                    157: localf ptol$
                    158: localf rmul$
                    159: localf mtransbys$
1.58      takayama  160: localf trcolor$
1.61      takayama  161: localf mcolor$
1.6       takayama  162: localf drawopt$
                    163: localf execdraw$
                    164: localf execproc$
                    165: localf myswap$
                    166: localf mysubst$
                    167: localf evals$
                    168: localf myval$
                    169: localf myeval$
                    170: localf mydeval$
                    171: localf myfeval$
                    172: localf myf2eval$
                    173: localf myf3eval$
                    174: localf myfdeval$
                    175: localf myf2deval$
                    176: localf myf3deval$
                    177: localf myexp$
                    178: localf mycos$
                    179: localf mysin$
                    180: localf mytan$
                    181: localf myarg$
                    182: localf myasin$
                    183: localf myacos$
                    184: localf myatan$
                    185: localf mylog$
1.57      takayama  186: localf nlog$
1.6       takayama  187: localf mypow$
1.13      takayama  188: localf scale$
1.71      takayama  189: localf iceil$
1.6       takayama  190: localf arg$
                    191: localf sqrt$
                    192: localf gamma$
                    193: localf lngamma$
                    194: localf digamma$
                    195: localf dilog$
                    196: localf zeta$
                    197: localf eta$
                    198: localf jell$
                    199: localf frac$
                    200: localf erfc$
1.20      takayama  201: localf orthpoly$
                    202: localf schurpoly$
1.6       takayama  203: localf fouriers$
                    204: localf todf$
                    205: localf f2df$
                    206: localf df2big$
                    207: localf compdf$
                    208: localf fzero$
                    209: localf fmmx$
                    210: localf flim$
                    211: localf fcont$
                    212: localf fresidue$
                    213: localf mmulbys$
                    214: localf appldo$
                    215: localf appledo$
                    216: localf muldo$
                    217: localf jacobian$
                    218: localf hessian$
                    219: localf wronskian$
                    220: localf adj$
                    221: localf laplace1$
                    222: localf laplace$
                    223: localf mce$
                    224: localf mc$
                    225: localf rede$
                    226: localf ad$
                    227: localf add$
                    228: localf vadd$
                    229: localf addl$
                    230: localf cotr$
                    231: localf rcotr$
                    232: localf muledo$
                    233: localf mulpdo$
                    234: localf transpdosub$
                    235: localf transpdo$
                    236: localf translpdo$
                    237: localf rpdiv$
                    238: localf mygcd$
                    239: localf mylcm$
                    240: localf sftpexp$
                    241: localf applpdo$
                    242: localf tranlpdo$
                    243: localf divdo$
                    244: localf qdo$
                    245: localf sqrtdo$
                    246: localf ghg$
                    247: localf ev4s$
                    248: localf b2e$
                    249: localf sftpow$
                    250: localf sftpowext$
                    251: localf polinsft$
                    252: localf pol2sft$
                    253: localf polroots$
1.70      takayama  254: localf sgnstrum$
                    255: localf polstrum$
                    256: localf polrealroots$
                    257: localf polradiusroot$
1.6       takayama  258: localf fctri$
                    259: localf binom$
                    260: localf expower$
                    261: localf seriesHG$
                    262: localf seriesMc$
                    263: localf seriesTaylor$
1.27      takayama  264: localf mulpolyMod$
1.46      takayama  265: localf solveEq$
1.70      takayama  266: localf res0$
                    267: localf eqs2tex$
1.45      takayama  268: localf baseODE$
1.70      takayama  269: localf baseODE0$
1.26      takayama  270: localf taylorODE$
1.6       takayama  271: localf evalred$
                    272: localf toeul$
                    273: localf fromeul$
                    274: localf sftexp$
                    275: localf fractrans$
                    276: localf soldif$
                    277: localf chkexp$
                    278: localf sqrtrat$
                    279: localf getroot$
                    280: localf expat$
                    281: localf polbyroot$
                    282: localf polbyvalue$
                    283: localf pcoef$
1.58      takayama  284: localf pmaj$
1.6       takayama  285: localf prehombf$
                    286: localf prehombfold$
                    287: localf sub3e$
                    288: localf fuchs3e$
                    289: localf okubo3e$
                    290: localf eosub$
                    291: localf even4e$
                    292: localf odd5e$
                    293: localf extra6e$
                    294: localf rigid211$
                    295: localf solpokuboe$
                    296: localf stoe$
                    297: localf dform$
                    298: localf polinvsym$
                    299: localf polinsym$
                    300: localf tohomog$
                    301: localf substblock$
                    302: localf okuboetos$
                    303: localf heun$
                    304: localf fspt$
                    305: localf abs$
1.20      takayama  306: localf sgn$
1.6       takayama  307: localf calc$
                    308: localf isint$
                    309: localf israt$
                    310: localf iscrat$
                    311: localf isalpha$
                    312: localf isnum$
                    313: localf isalphanum$
1.8       takayama  314: localf isdecimal$
1.6       takayama  315: localf isvar$
                    316: localf isyes$
                    317: localf isall$
                    318: localf iscoef$
                    319: localf iscombox$
                    320: localf sproot$
                    321: localf spgen$
1.53      takayama  322: localf spbasic$
1.6       takayama  323: localf chkspt$
                    324: localf cterm$
                    325: localf terms$
                    326: localf polcut$
                    327: localf redgrs$
                    328: localf cutgrs$
                    329: localf mcgrs$
                    330: localf mc2grs$
                    331: localf mcmgrs$
1.38      takayama  332: localf spslm$
1.6       takayama  333: localf anal2sp$
                    334: localf delopt$
                    335: localf str_char$
                    336: localf str_pair$
                    337: localf str_cut$
                    338: localf str_str$
                    339: localf str_subst$
                    340: localf str_times$
                    341: localf str_tb$
                    342: localf strip$
                    343: localf i2hex$
                    344: localf sjis2jis$
                    345: localf jis2sjis$
                    346: localf s2os$
                    347: localf l2os$
                    348: localf r2os$
                    349: localf s2euc$
                    350: localf s2sjis$
                    351: localf r2ma$
                    352: localf evalma$
1.73      takayama  353: localf evalcoord$
                    354: localf readTikZ$
1.6       takayama  355: localf ssubgrs$
                    356: localf verb_tex_form$
                    357: localf tex_cuteq$
                    358: localf my_tex_form$
                    359: localf texket$
                    360: localf smallmattex$
                    361: localf divmattex$
                    362: localf dviout0$
                    363: localf myhelp$
                    364: localf isMs$
1.55      takayama  365: localf getline$
1.6       takayama  366: localf showbyshell$
                    367: localf readcsv$
                    368: localf tocsv$
                    369: localf getbyshell$
                    370: localf show$
                    371: localf dviout$
                    372: localf rtotex$
1.79      takayama  373: localf togreek$
1.6       takayama  374: localf mtotex$
                    375: localf ltotex$
                    376: localf texbegin$
                    377: localf texcr$
                    378: localf texsp$
                    379: localf getbygrs$
                    380: localf mcop$
                    381: localf shiftop$
1.56      takayama  382: localf shiftPfaff;
1.6       takayama  383: localf conf1sp$
1.34      takayama  384: localf confexp$
1.36      takayama  385: localf confspt$
1.76      takayama  386: localf vConv$
1.50      takayama  387: localf mcvm$
1.44      takayama  388: localf s2csp$
1.38      takayama  389: localf partspt$
1.6       takayama  390: localf pgen$
                    391: localf diagm$
                    392: localf mgen$
                    393: localf madj$
                    394: localf newbmat$
                    395: localf unim$
                    396: localf pfrac$
                    397: localf cfrac$
                    398: localf cfrac2n$
                    399: localf sqrt2rat$
                    400: localf s2sp$
                    401: localf sp2grs$
                    402: localf fimag$
                    403: localf trig2exp$
                    404: localf intpoly$
                    405: localf integrate$
1.22      takayama  406: localf rungeKutta$
1.6       takayama  407: localf simplog$
                    408: localf fshorter$
                    409: localf isshortneg$
                    410: localf intrat$
                    411: localf powsum$
                    412: localf bernoulli$
                    413: localf lft01$
                    414: localf linfrac01$
                    415: localf nthmodp$
                    416: localf issquaremodp$
                    417: localf rootmodp$
                    418: localf rabin$
                    419: localf primroot$
                    420: localf varargs$
                    421: localf ptype$
                    422: localf pfargs$
1.58      takayama  423: localf regress$
1.6       takayama  424: localf average$
1.23      takayama  425: localf tobig$
1.6       takayama  426: localf sint$
                    427: localf frac2n$
1.58      takayama  428: localf openGlib$
1.6       takayama  429: localf xyproc$
                    430: localf xypos$
                    431: localf xyput$
                    432: localf xybox$
                    433: localf xyline$
                    434: localf xylines$
                    435: localf xycirc$
                    436: localf xybezier$
                    437: localf lbezier$
                    438: localf draw_bezier$
                    439: localf tobezier$
                    440: localf velbezier$
                    441: localf ptbezier$
                    442: localf cutf$
                    443: localf fsum$
                    444: localf fint$
                    445: localf periodicf$
                    446: localf cmpf$
                    447: localf areabezier$
                    448: localf saveproc$
1.57      takayama  449: localf xyplot$
1.63      takayama  450: localf xyaxis$
1.6       takayama  451: localf xygraph$
                    452: localf xy2graph$
1.22      takayama  453: localf addIL$
1.19      takayama  454: localf xy2curve$
1.18      takayama  455: localf xygrid$
1.6       takayama  456: localf xyarrow$
                    457: localf xyarrows$
                    458: localf xyang$
                    459: localf xyoval$
1.33      takayama  460: localf xypoch$
1.72      takayama  461: localf xycircuit$
1.70      takayama  462: localf ptline$
1.6       takayama  463: localf ptcommon$
1.83    ! takayama  464: localf ptinversion$
1.71      takayama  465: localf ptcontain$
1.6       takayama  466: localf ptcopy$
                    467: localf ptaffine$
                    468: localf ptlattice$
                    469: localf ptpolygon$
                    470: localf ptwindow$
1.81      takayama  471: localf pt5center$
1.70      takayama  472: localf ptconvex$
1.6       takayama  473: localf ptbbox$
1.71      takayama  474: localf darg$
                    475: localf dwinding$
1.6       takayama  476: localf lninbox$
                    477: localf ptcombezier$
                    478: localf ptcombz$
                    479: localf lchange$
                    480: localf init$
                    481: localf powprimroot$
                    482: localf distpoint$
                    483: localf ntable$
                    484: localf keyin$
                    485: localf mqsub$
                    486: localf msort$
                    487: #else
                    488: extern Muldif.rr$
                    489: extern TeXEq$
                    490: extern TeXLim$
1.70      takayama  491: extern TeXPages$
1.6       takayama  492: extern DIROUT$
1.16      takayama  493: extern DIROUTD$
1.6       takayama  494: extern DVIOUTL$
                    495: extern DVIOUTA$
                    496: extern DVIOUTB$
                    497: extern DVIOUTH$
                    498: extern DVIOUTF$
                    499: static LCOPT$
                    500: static COLOPT$
                    501: static LPOPT$
                    502: static LFOPT$
                    503: extern TikZ$
                    504: extern ErMsg$
                    505: extern FLIST$
                    506: extern IsYes$
                    507: extern XYPrec$
                    508: extern XYcm$
                    509: extern TikZ$
                    510: extern XYLim$
1.70      takayama  511: extern TeXPages$
1.6       takayama  512: extern Canvas$
                    513: extern ID_PLOT$
                    514: extern Rand$
                    515: extern LQS$
1.57      takayama  516: extern SV=SVORG$
1.6       takayama  517: #endif
                    518: static S_Fc,S_Dc,S_Ic,S_Ec,S_EC,S_Lc$
1.16      takayama  519: static S_FDot$
1.6       takayama  520: extern AMSTeX$
1.58      takayama  521: extern Glib_math_coordinate$
                    522: extern Glib_canvas_x$
                    523: extern Glib_canvas_y$
1.83    ! takayama  524: Muldif.rr="00210716"$
1.6       takayama  525: AMSTeX=1$
                    526: TeXEq=5$
                    527: TeXLim=80$
1.70      takayama  528: TeXPages=20$
1.6       takayama  529: TikZ=0$
                    530: XYcm=0$
                    531: XYPrec=3$
                    532: XYLim=4$
                    533: Rand=0$
                    534: DIROUT="%HOME%\\tex"$
                    535: DVIOUTL="%ASIRROOT%\\bin\\risatex0.bat"$
                    536: DVIOUTA="%ASIRROOT%\\bin\\risatex.bat"$
                    537: DVIOUTB="%ASIRROOT%\\bin\\risatex1%TikZ%.bat"$
                    538: DVIOUTH="start dviout -2 -hyper=0x90 \"%ASIRROOT%\\help\\os_muldif.dvi\" #%LABEL%"$
                    539: DVIOUTF=0$
                    540: LCOPT=["red","green","blue","yellow","cyan","magenta","black","white","gray"]$
                    541: COLOPT=[0xff,0xff00,0xff0000,0xffff,0xffff00,0xff00ff,0,0xffffff,0xc0c0c0]$
                    542: LPOPT=["above","below","left","right"]$
                    543: LFOPT=["very thin","thin","dotted","dashed"]$
1.45      takayama  544: SVORG=["x","y","z","w","u","v","p","q","r","s"]$
1.6       takayama  545: Canvas=[400,400]$
                    546: LQS=[[1,0]]$
                    547:
                    548: ErMsg = newvect(3,[
                    549:  "irregal argument", /* 0 */
                    550:  "too big size",     /* 1 */
                    551:  "irregal option"    /* 2 */
                    552: ])$
                    553: FLIST=0$
                    554: IsYes=[]$
                    555: ID_PLOT=-1$
                    556:
                    557: def erno(N)
                    558: {
                    559:        /* extern ErMsg; */
                    560:        print(ErMsg[N]);
                    561: }
                    562:
                    563: def chkfun(Fu, Fi)
                    564: {
                    565:        /* extern FLIST; */
                    566:        /* extern Muldif.rr; */
                    567:
                    568:        if(type(Fu) <= 1){
                    569:                if(Fu==1)
                    570:                        mycat(["Loaded os_muldif Ver.", Muldif.rr, "(Toshio Oshima)"]);
                    571:                else
                    572:                        mycat(["Risa/Asir Ver.", version()]);
                    573:                return 1;
                    574:        }
                    575:        if(type(FLIST) < 4)
                    576:                FLIST = flist();
                    577:        if(type(Fu) == 4){
                    578:                for(; Fu != [] ;Fu = cdr(Fu))
                    579:                        if(chkfun(car(Fu),Fi) == 0) return 0;
                    580:                return 1;
                    581:        }
                    582:        if(findin(Fu, FLIST) >= 0)
                    583:                return 1;
                    584:        FLIST = flist();
                    585:        if(findin(Fu, FLIST) >= 0)
                    586:                return 1;
                    587:        if(type(Fi)==7){
                    588:                mycat0(["load(\"", Fi,"\") -> try again!\n"],1);
                    589:                load(Fi);
                    590:        }
                    591:        return 0;
                    592: /*
                    593:        if(type(Fi) == 7)
                    594:                Fi = [Fi];
                    595:        for( ; Fi != []; Fi = cdr(Fi))
                    596:                load(car(Fi));
                    597:        FLIST = flist();
                    598:        return (findin(Fu,FLIST)>=0)?1:0;
                    599: */
                    600: }
                    601:
                    602: def makev(L)
                    603: {
                    604:        S = "";
                    605:        Num=getopt(num);
                    606:        while(length(L) > 0){
                    607:                VL = car(L); L = cdr(L);
                    608:                if(type(VL) == 7)
                    609:                        S = S+VL;
                    610:                else if(type(VL) == 2 || VL < 10)
                    611:                        S = S+rtostr(VL);
                    612:                else if(VL<46 && Num!=1)
                    613:                        S = S+asciitostr([VL+87]);
                    614:                else
                    615:                        S = S+rtostr(VL);
                    616:        }
                    617:        return strtov(S);
                    618: }
                    619:
                    620: def makenewv(L)
                    621: {
                    622:        if((V=getopt(var))<2) V="z_";
                    623:        else if(isvar(V)) V=rtostr(V);
                    624:        if(type(N=getopt(num))!=1) N=0;
1.21      takayama  625:        Var=varargs(L|all=2);
1.6       takayama  626:        for(XX=[],I=J=0;;I++){
                    627:                X=strtov(V+rtostr(I));
                    628:                if(findin(X,Var)<0){
                    629:                        XX=cons(X,XX);
                    630:                        if(++J>N) return X;
                    631:                        else if(J==N)  return reverse(XX);
                    632:                }
                    633:        }
                    634: }
                    635:
                    636: def shortv(P,L)
                    637: {
                    638:        V=vars(P);
                    639:        if(type(T=getopt(top))==2) T=strtoascii(rtostr(T))[0]-87;
                    640:        else T=10;
                    641:        for(;L!=[];L=cdr(L)){
                    642:                for(J=0;J<36;J++){
                    643:                        if(findin(X=makev([car(L),J]|num=1),V)>=0){
                    644:                                while(findin(Y=makev([T]),V)>=0) T++;
                    645:                                if(T>35) return P;
                    646:                                P=subst(P,X,Y);
                    647:                                T++;
                    648:                        }else if(J>0) break;
                    649:                }
                    650:        }
                    651:        return P;
                    652: }
                    653:
                    654: def vweyl(L)
                    655: {
                    656:        if(type(L) == 4){
                    657:                if(length(L) == 2)
                    658:                        return L;
                    659:                else
                    660:                        return [L[0],makev(["d",L[0]])];
                    661:        }
                    662:        /* else if(type(L)<2) return L; */
                    663:        return [L,makev(["d", L])];
                    664: }
                    665:
                    666: def mycat(L)
                    667: {
                    668:        if(type(L) != 4){
                    669:                print(L);
                    670:                return;
                    671:        }
                    672:        Opt = getopt(delim);
                    673:        Del = (type(Opt) >= 0)?Opt:" ";
                    674:        Opt = getopt(cr);
                    675:        CR = (type(Opt) >= 0)?0:1;
                    676:        while(L != []){
                    677:                if(Do==1)
                    678:                        print(Del,0);
                    679:                print(car(L),0);
                    680:                L=cdr(L);
                    681:                Do = 1;
                    682:        }
                    683:        if(CR) print("");
1.46      takayama  684:        else print("",2);
1.6       takayama  685: }
                    686:
1.9       takayama  687: def fcat(S,X)
                    688: {
                    689:        if(type(S)!=7){
1.18      takayama  690:                if(type(DIROUTD)!=7){
                    691:                        DIROUTD=str_subst(DIROUT,["%HOME%","%ASIRROOT%","\\"],
                    692:                                [getenv("HOME"),get_rootdir(),"/"])+"/";
                    693:                        if(isMs()) DIROUTD=str_subst(DIROUTD,"/","\\"|sjis=1);
                    694:                }
1.16      takayama  695:                T="fcat";
                    696:                if(S>=2&&S<=9) T+=rtostr(S);
                    697:                T=DIROUTD+T+".txt";
                    698:                if(S==-1) return T;
                    699:                if(S!=0&&access(T)) remove_file(T);
                    700:                S=T;
1.9       takayama  701:        }
1.19      takayama  702:        R=output(S);
1.9       takayama  703:        print(X);
                    704:        output();
1.16      takayama  705:        if(getopt(exe)==1) shell("\""+S+"\"");
1.19      takayama  706:        return R;
1.9       takayama  707: }
                    708:
1.6       takayama  709: def mycat0(L,T)
                    710: {
                    711:        Opt = getopt(delim);
                    712:        Del = (type(Opt) >= 0)?Opt:"";
1.20      takayama  713:        if(type(L)!=4) L=[L];
1.6       takayama  714:        while(L != []){
                    715:                if(Do==1)
                    716:                        print(Del,0);
                    717:                print(car(L),0);
                    718:                L=cdr(L);
                    719:                Do = 1;
                    720:        }
                    721:        if(T) print("");
1.46      takayama  722:        else print("",2);
1.6       takayama  723: }
                    724:
                    725: def findin(M,L)
                    726: {
                    727:        if(type(L)==4){
                    728:                for(I = 0; L != []; L = cdr(L), I++)
                    729:                        if(car(L) == M) return I;
                    730:        }else if(type(L)==5){
                    731:                K=length(L);
                    732:                for(I = 0; I < K; I++)
                    733:                        if(L[I] == M) return I;
                    734:        }else return -2;
                    735:        return -1;
                    736: }
                    737:
                    738: def countin(S,M,L)
                    739: {
1.10      takayama  740:        Step=getopt(step);
                    741:        if(type(Step)==1){
                    742:                N=(Step>0)?Step:-Step;
1.7       takayama  743:                if(type(L)==5) L=vtol(L);
                    744:                L=qsort(L);
                    745:                while(car(L)<S&&L!=[]) L=cdr(L);
                    746:                S+=M;
1.10      takayama  747:                for(R=[],C=I=0;L!=[];){
                    748:                        if(car(L)<S||(Step>0&&car(L)==S)){
1.7       takayama  749:                                C++;
                    750:                                L=cdr(L);
                    751:                        }else{
                    752:                                R=cons(C,R);C=0;S+=M;
1.10      takayama  753:                                if(N>1&&++I>=N) break;
1.7       takayama  754:                        }
                    755:                }
                    756:                if(C>0) R=cons(C,R);
1.10      takayama  757:                if(N>1&&(N-=length(R))>0) while(N-->0) R=cons(0,R);
1.7       takayama  758:                return reverse(R);
                    759:        }
1.6       takayama  760:        if(type(L)==4){
                    761:                for(N=0; L!=[]; L=cdr(L))
                    762:                        if(car(L)>=S && car(L)<=M) N++;
                    763:        }else if(type(L)==5){
                    764:                K=length(L);
                    765:                for(I = 0; I < K; I++)
                    766:                        if(L[I]>=S && L[I]<=M) N++;
                    767:        }else return -2;
                    768:        return N;
                    769: }
                    770:
                    771: def mycoef(P,N,X)
                    772: {
                    773:        if(type(P)<3 && type(N)<3)
                    774:                return coef(P,N,X);
                    775:        if(type(P) >= 4)
                    776: #ifdef USEMODULE
                    777:                return map(os_md.mycoef,P,N,X);
                    778: #else
                    779:                return map(mycoef,P,N,X);
                    780: #endif
                    781:        if(type(N)==4){
                    782:                for(;N!=[];N=cdr(N),X=cdr(X))
                    783:                        P=mycoef(P,car(N),car(X));
                    784:                return P;
                    785:        }
                    786:        if(deg(dn(P), X) > 0){
                    787:                P = red(P);
                    788:                if(deg(dn(P), X) > 0)
                    789:                        return 0;
                    790:        }
                    791:        return red(coef(nm(P),N,X)/dn(P));
                    792: }
                    793:
                    794: def mydiff(P,X)
                    795: {
                    796:        if(X == 0)
                    797:                return 0;
                    798:        if(type(P)<3 && type(X)<3)
                    799:                return diff(P,X);
                    800:        if(type(P) >= 4)
                    801: #ifdef USEMODULE
                    802:                return map(os_md.mydiff,P,X);
                    803: #else
                    804:                return map(mydiff,P,X);
                    805: #endif
                    806:        if(type(X)==4){
                    807:                for(;X!=[];X=cdr(X)) P=mydiff(P,car(X));
                    808:                return P;
                    809:        }
1.19      takayama  810:        if(ptype(dn(P),X)<2)
1.6       takayama  811:                return red(diff(nm(P),X)/dn(P));
                    812:        return red(diff(P,X));
                    813: }
                    814:
                    815: def myediff(P,X)
                    816: {
                    817:        if(X == 0)
                    818:                return 0;
                    819:        if(type(P) < 3)
                    820:                 return ediff(P,X);
                    821:        if(type(P) >= 4)
                    822: #ifdef USEMODULE
                    823:                return map(os_md.myediff,P,X);
                    824: #else
                    825:                return map(myediff,P,X);
                    826: #endif
                    827:        if(deg(dn(P),X) == 0)
                    828:                return red(ediff(nm(P),X)/dn(P));
                    829:        return red(X*diff(P,X));
                    830: }
                    831:
1.56      takayama  832: def mypdiff(P,L)
                    833: {
                    834:        if(type(P)>3) return map(os_md.mypdiff,P,L);
                    835:        for(Q=0;L!=[];L=cdr(L)){
                    836:                Q+=mydiff(P,car(L))*L[1];
                    837:                L=cdr(L);
                    838:        }
                    839:        return red(Q);
                    840: }
                    841:
1.57      takayama  842: def pTaylor(S,X,N)
1.56      takayama  843: {
1.57      takayama  844:        if(!isvar(T=getopt(time))) T=t;
                    845:        if(type(S)<4) S=[S];
                    846:        if(type(X)<4) X=[X];
                    847:        if(findin(T,varargs(S|all=2))>=0){
                    848:                S=cons(z_z,S);X=cons(z_z,X);FT=1;
                    849:        }else FT=0;
                    850:        LS=length(S);
                    851:        FR=(getopt(raw)==1)?1:0;
                    852:        if(!FR) R=newvect(LS);
1.56      takayama  853:        else R=R1=[];
1.57      takayama  854:        for(L=[],I=0,TS=S,TX=X;I<LS;I++,TS=cdr(TS),TX=cdr(TX)){
                    855:                if(!FR) R[I]=car(TX)+car(TS)*T;
1.56      takayama  856:                else{
1.57      takayama  857:                        R=cons(car(TX),R);R1=cons(car(TS),R1);
1.56      takayama  858:                }
1.57      takayama  859:                L=cons(car(TS),cons(car(TX),L));
1.56      takayama  860:        }
1.57      takayama  861:        L=reverse(L);
                    862:        if(FR) R=[reverse(R1),reverse(R)];
1.56      takayama  863:        for(K=M=1;N>1;N--){
                    864:                S=mypdiff(S,L);
                    865:                K*=++M;
                    866:                for(TS=S,I=0,R1=[];TS!=[];TS=cdr(TS),I++){
1.57      takayama  867:                        if(!FR) R[I]+=car(TS)*t^M/K;
1.56      takayama  868:                        else R1=cons(car(TS)/K,R1);
                    869:                }
1.57      takayama  870:                if(FR) R=cons(reverse(R1),R);
1.56      takayama  871:        }
1.57      takayama  872:        if(FT){
                    873:                if(!FR){
1.56      takayama  874:                        S=newvect(LS-1);
                    875:                        for(I=1;I<LS;I++) S[I-1]=R[I];
                    876:                }else{
                    877:                        for(S=[];R!=[];R=cdr(R)){
                    878:                                S=cons(cdr(car(R)),S);
                    879:                        }
                    880:                        R=S;
                    881:                }
                    882:                R=subst(S,z_z,0);
                    883:        }
1.57      takayama  884:        return (FR&&!FT)?reverse(R):R;
1.56      takayama  885: }
                    886:
1.6       takayama  887: def m2l(M)
                    888: {
                    889:        if(type(M) < 4)
                    890:                return [M];
                    891:        if(type(M) == 4){
                    892:                if(type(car(M))==4 && getopt(flat)==1){
                    893:                        for(MM = []; M!=[]; M=cdr(M))
                    894:                                MM = append(MM,car(M));
                    895:                        return MM;
                    896:                }
                    897:                return M;
                    898:        }
                    899:        if(type(M) == 5)
                    900:                return vtol(M);
                    901:        S = size(M);
                    902:        for(MM = [], I = S[0]-1; I >= 0; I--)
                    903:                MM = append(vtol(M[I]), MM);
                    904:        return MM;
                    905: }
                    906:
                    907: def mydeg(P,X)
                    908: {
1.56      takayama  909:        if(type(P) < 3 && type(X)==2)
1.6       takayama  910:                return deg(P,X);
1.56      takayama  911:        II=(type(X)==4)?-100000:-1;
1.6       takayama  912:        Opt = getopt(opt);
                    913:        if(type(P) >= 4){
                    914:                S=(type(P) == 6)?size(P)[0]:0;
                    915:                P = m2l(P);
1.56      takayama  916:                for(I = 0, Deg = -100000; P != []; P = cdr(P), I++){
                    917:                        if( (DT = mydeg(car(P),X)) == -2&&type(X)!=4)
1.6       takayama  918:                                return -2;
                    919:                        if(DT > Deg){
                    920:                                Deg = DT;
                    921:                                II = I;
                    922:                        }
                    923:                }
                    924:                return (Opt==1)?([Deg,(S==0)?II:[idiv(II,S),irem(II,S)]]):Deg;
                    925:        }
                    926:        P = red(P);
1.56      takayama  927:        if(type(X)==2){
                    928:                if(deg(dn(P),X) == 0)
                    929:                        return deg(nm(P),X);
                    930:        }else{
                    931:                P=nm(red(P));
                    932:                for(D=-100000,I=deg(P,X[1]);I>=0;I--){
                    933:                        if(TP=mycoef(P,I,X[1])){
                    934:                                TD=mydeg(TP,X[0])-I;
                    935:                                if(D<TD) D=TD;
                    936:                        }
                    937:                }
                    938:                return D;
                    939:        }
1.6       takayama  940:        return -2;
                    941: }
                    942:
                    943: def pfctr(P,X)
                    944: {
                    945:        P=red(P);
                    946:        if((T=ptype(P,X))>3) return [];
                    947:        if(T==3){
                    948:                G=pfctr(dn(P),X);
                    949:                F=pfctr(nm(P),X);
                    950:                R=[[car(F)[0]/car(G)[0],1]];
                    951:                for(F=cdr(F);F!=[];F=cdr(F)) R=cons(car(F),R);
                    952:                for(G=cdr(G);G!=[];G=cdr(G)) R=cons([car(G)[0],-car(G)[1]],R);
                    953:                return reverse(R);
                    954:        }
                    955:        F=fctr(nm(P));
                    956:        for(R=[],C=1/dn(P);F!=[];F=cdr(F))
                    957:                if(mydeg(car(F)[0],X)>0) R=cons(car(F),R);
                    958:        else C*=car(F)[0]^car(F)[1];
                    959:        return cons([C,1],reverse(R));
                    960: }
                    961:
                    962: def mymindeg(P,X)
                    963: {
                    964:        if(type(P) < 3)
                    965:                return mindeg(P,X);
                    966:        II = -1;T=60;
                    967:        Opt = getopt(opt);
                    968:        if(type(P) >= 4){
                    969:                S=(type(P) == 6)?size(P)[0]:0;
                    970:                P = m2l(P);
                    971:                for(I = 0, Deg = -3; P != []; P = cdr(P), I++){
                    972:                        if(car(P) == 0)
                    973:                                continue;
                    974:                        if( (DT = mydeg(car(P),X)) == -2)
                    975:                                return -2;
                    976:                        if(DT < Deg || Deg == -3){
                    977:                                if(DT==0){
                    978:                                        if(type(car(P))>=T) continue;
                    979:                                        T=type(car(P));
                    980:                                }
                    981:                                Deg = DT;
                    982:                                II = I;
                    983:                        }
                    984:                }
                    985:                return (Opt==1)?([Deg,(S==0)?II:[idiv(II,S),irem(II,S)]]):Deg;
                    986:        }
                    987:        P = red(P);
                    988:        if(deg(dn(P),X) == 0)
                    989:                return mindeg(nm(P),X);
                    990:        return -2;
                    991: }
                    992:
                    993: def m1div(M,N,L)
                    994: {
                    995:        L = (type(L) <= 3)?[0,L]:vweyl[L];
                    996:        DX = L[1]; X = L[0];
                    997:        if(mydeg(N,DX) != 0)
                    998:                return 0;
                    999:        DD = mydeg(M,DX);
                   1000:        MM = M;
                   1001:        while( (Deg=mydeg(MM,DX)) > 0){
                   1002:                MC = mycoef(MM,Deg,DX)*DX^(Deg-1);
                   1003:                MS = radd(MC, MS);
                   1004:                MM = radd(MM, muldo(MC,radd(-DX,N),L));
                   1005:  }
                   1006:  return [MM, MS];
                   1007: }
                   1008:
                   1009:
                   1010: def mulsubst(F,L)
                   1011: {
                   1012:        N = length(L);
                   1013:        if(N == 0)
                   1014:                return F;
                   1015:        if(type(L[0])!=4)       L=[L];
1.46      takayama 1016:        if(getopt(lpair)==1||(type(L[0])==4&&length(L[0])>2)) L=lpair(L[0],L[1]);
1.6       takayama 1017:        if(getopt(inv)==1){
                   1018:                for(R=[];L!=[];L=cdr(L)) R=cons([car(L)[1],car(L)[0]],R);
                   1019:                L=reverse(R);
                   1020:        }
                   1021:        if(length(L)==1)        return mysubst(F,L);
                   1022:        L1 = newvect(N);
                   1023:        for(J = 0; J < N ; J++)
                   1024:                L1[J] = uc();
                   1025:        L2 = newvect(N);
                   1026:        for(J = 0; J < N; J++){
                   1027:                S = L[J][1];
                   1028:                for(I = 0; I < N; I++)
                   1029:                        S = mysubst(S,[L[I][0],L1[I]]);
                   1030:                L2[J] = S;
                   1031:        }
                   1032:        for(J = 0; J < N; J++)
                   1033:                F = mysubst(F, [L[J][0],L2[J]]);
                   1034:        for(J = 0; J < N; J++)
                   1035:                F = mysubst(F, [L1[J],L[J][0]]);
                   1036:        return F;
                   1037: }
                   1038:
                   1039: def cmpsimple(P,Q)
                   1040: {
                   1041:        T = getopt(comp);
                   1042:        if(P == Q)
                   1043:                return 0;
                   1044:        D = 0;
                   1045:        if(type(T) < 0)
                   1046:                T = 7;
                   1047:        if(iand(T,1))
                   1048:                D = length(vars(P)) - length(vars(Q));
                   1049:        if(!D && iand(T,2))
                   1050:                D = nmono(P) - nmono(Q);
                   1051:        if(!D && iand(T,4))
                   1052:                D = str_len(rtostr(P)) - str_len(rtostr(Q));
                   1053:        if(!D){
                   1054:                 if(P > Q) D++;
                   1055:                 else D--;
                   1056:        }
                   1057:        return D;
                   1058: }
                   1059:
                   1060: def simplify(P,L,T)
                   1061: {
1.79      takayama 1062:        if(type(P) > 3){
1.6       takayama 1063: #ifdef USEMODULE
                   1064:                return map(os_md.simplify,P,L,T);
                   1065: #else
                   1066:                return map(simplify,P,L,T);
                   1067: #endif
1.79      takayama 1068:        }
1.6       takayama 1069:        if(type(L[0]) == 4){
                   1070:                if(length(L[0]) > 1)
                   1071: #if USEMODULE
                   1072:                        return fmult(os_md.simplify,P,L,[T]);
                   1073: #else
                   1074:                        return fmult(simplify,P,L,[T]);
                   1075: #endif
                   1076:                L = L[0];
                   1077:        }
                   1078:        if(type(Var=getopt(var)) == 4 && Var!=[]){
                   1079:                if(type(P) == 3)
                   1080:                        return simplify(nm(P),P,L,T|var=Var)/simplify(dn(P),P,L,T|var=Var);
                   1081:                V = car(Var);
                   1082:                if((I = mydeg(P,V)) > 0){
                   1083:                        Var = cdr(Var);
                   1084:                        for(Q=0; I>=0 ; I--)
                   1085:                                Q += simplify(mycoef(P,I,V), L, T|var=Var)*V^I;
                   1086:                        return Q;
                   1087:                }
                   1088:        }
                   1089:        if(length(L) == 1){
                   1090:                L = car(L);
                   1091:                for(V = vars(L); V != []; V = cdr(V)){
                   1092:                        VT = car(V);
                   1093:                        if(deg(L,VT) != 1) continue;
                   1094:                        P = simplify(P, [VT, -red(coef(L,0,VT)/coef(L,1,VT))], T);
                   1095:                }
                   1096:                return P;
                   1097:        }
                   1098:        Q = mysubst(P,[L[0],L[1]]);
                   1099:        return (cmpsimple(P,Q|comp=T) <= 0)?P:Q;
                   1100: }
                   1101:
                   1102: def monotos(P)
                   1103: {
                   1104:        if(nmono(P) <= 1)
                   1105:                return rtostr(P);
                   1106:        return "("+rtostr(P)+")";
                   1107: }
                   1108:
                   1109:
                   1110: def monototex(P)
                   1111: {
                   1112:        Q=my_tex_form(P);
                   1113:        if(nmono(P)<2 && (getopt(minus)!=1 || str_str(Q,"-"|top=0,end=0)<0))
                   1114:                return Q;
                   1115:        return "("+Q+")";
                   1116: }
                   1117:
                   1118: def minustos(S)
                   1119: {
                   1120:        if(str_str(S,"-"|top=0,end=0)<0) return S;
                   1121:        return "("+S+")";
                   1122: }
                   1123:
                   1124: def vnext(V)
                   1125: {
                   1126:        S = length(V);
                   1127:        for(I = S-1; I > 0; I--){
                   1128:                if(V[I-1] < V[I]){
                   1129:                        V0 = V[I-1];
                   1130:                        for(J = I+1; J < S; J++)
                   1131:                                if(V0 >= V[J]) break;
                   1132:                        V[I-1] = V[--J];
                   1133:                        V[J] = V0;
                   1134:                        for(J = S-1; I < J; I++, J--){
                   1135:                                V0 = V[I];
                   1136:                                V[I] = V[J];
                   1137:                                V[J] = V0;
                   1138:                        }
                   1139:                        return 1;
                   1140:                }
                   1141:        }
                   1142:        return 0;
                   1143: }
                   1144:
                   1145: def ldict(N, M)
                   1146: {
                   1147:        Opt = getopt(opt);
                   1148:        R = S = [];
                   1149:        for(I = 2; N > 0; I++){
                   1150:                R = cons(irem(N,I), R);
                   1151:                N = idiv(N,I);
                   1152:        }
                   1153:        L = LL = length(R);
                   1154:        T=newvect(LL+1);
                   1155:        while(L-- > 0){
                   1156:                V = car(R); R = cdr(R);
                   1157:                for(I = J = 0; J <= V ; I++){
                   1158:                        if(T[I] == 0)
                   1159:                                J++;
                   1160:                }
                   1161:                T[I-1] = 1;
                   1162:                S = cons(LL-I+1, S);
                   1163:        }
                   1164:        for(I = 0; I <= LL; I++){
                   1165:                if(T[I] == 0){
                   1166:                        S = cons(LL-I, S);
                   1167:                        break;
                   1168:                }
                   1169:        }
                   1170:        if(M == 0)
                   1171:                return S;
                   1172:        if(M <= LL){
                   1173:                print("too small size");
                   1174:                return 0;
                   1175:        }
                   1176:        T = [];
                   1177:        for(I = --M; I > LL; I--)
                   1178:                T = cons(I,T);
                   1179:        S = append(S,T);
                   1180:        if(Opt == 2 || Opt == 3)
                   1181:                S = reverse(S);
                   1182:        if(Opt != 1 && Opt != 3)
                   1183:                return S;
                   1184:        for(T = []; S != []; S = cdr(S))
                   1185:                T = cons(M-car(S),T);
                   1186:        return T;
                   1187: }
                   1188:
                   1189: def ndict(L)
                   1190: {
                   1191:        Opt = getopt(opt);
                   1192:        R = [];
                   1193:        if(Opt != 1 && Opt != 2)
                   1194:                L = reverse(L);
                   1195:        T = (Opt == 1 || Opt == 3)?1:0;
                   1196:        for( ; L != []; L = cdr(L)){
                   1197:                for(I = 0, V = car(L), LT = cdr(L); LT != []; LT = cdr(LT))
                   1198:                        if(T == 0){
                   1199:                                if(V < car(LT)) I++;
                   1200:                        }else if (V > car(LT)) I++;
                   1201:                R = cons(I, R);
                   1202:        }
                   1203:        R = reverse(R);
                   1204:        for(V = 0, I = length(R); I > 0; R = cdr(R), I--)
                   1205:                V = V*I + car(R);
                   1206:        return V;
                   1207: }
                   1208:
                   1209: def nextsub(L,N)
                   1210: {
                   1211:        if(type(L) == 1){
                   1212:                for(LL = [], I = L-1; I >= 0; I--)
                   1213:                        LL = cons(I,LL);
                   1214:                return LL;
                   1215:        }
                   1216:        M = length(L = ltov(L));
                   1217:        K = N-M;
                   1218:        for(I = M-1; I >= 0; I--)
                   1219:                if(L[I] < I+K) break;
                   1220:        if(I < 0)
                   1221:                return 0;
                   1222:        for(J = L[I]+1; I < M; I++, J++)
                   1223:                L[I] = J;
                   1224:        return vtol(L);
                   1225: }
                   1226:
                   1227: def nextpart(L)
                   1228: {
                   1229:        if(car(L) <= 1)
                   1230:                return 0;
                   1231:        for(I = 0, L = reverse(L); car(L) == 1; L=cdr(L))
                   1232:                I++;
                   1233:        I += (K = car(L));
                   1234:        R = irem(I,--K);
                   1235:        R = (R==0)?[]:[R];
                   1236:        for(J = idiv(I,K); J > 0; J--)
                   1237:                R = cons(K,R);
                   1238:        L = cdr(L);
                   1239:        while(L!=[]){
                   1240:                R = cons(car(L), R);
                   1241:                L = cdr(L);
                   1242:        }
                   1243:        return R;
                   1244: }
                   1245:
                   1246: def transpart(L)
                   1247: {
                   1248:        L = reverse(L);
                   1249:        for(I=1, R=[]; L!= []; I++){
                   1250:                R = cons(length(L), R);
                   1251:                while(L != [] && car(L) <= I)
                   1252:                        L = cdr(L);
                   1253:        }
                   1254:        return reverse(R);
                   1255: }
                   1256:
                   1257: def trpos(A,B,N)
                   1258: {
                   1259:        S = newvect(N);
                   1260:        for(I = 0; I < N; I++)
                   1261:                S[I]=(I==A)?B:((I==B)?A:I);
                   1262:        return S;
                   1263: }
                   1264:
                   1265: def sprod(S,T)
                   1266: {
                   1267:        L = length(S);
                   1268:        V = newvect(L);
                   1269:        while(--L >= 0)
                   1270:                V[L] = S[T[L]];
                   1271:        return V;
                   1272: }
                   1273:
                   1274: def sinv(S)
                   1275: {
                   1276:        L = length(S);
                   1277:        V = newvect(L);
                   1278:        while(--L >= 0)
                   1279:                V[S[L]] = L;
                   1280:        return V;
                   1281: }
                   1282:
                   1283: def slen(S)
                   1284: {
                   1285:        L = length(S);
                   1286:        for(V = 0, J = 2; J < L; i++){
                   1287:                for(I = 0; I < J; I++)
                   1288:                        if(S[I] > S[J]) V++;
                   1289:        }
                   1290:        return V;
                   1291: }
                   1292:
1.77      takayama 1293: def sexps(S)
                   1294: {
                   1295:        K=length(S);S=ltov(S);
                   1296:        for(R=[],I=0;I<K-1;I++){
                   1297:                for(J=I;J>=0&&S[J]>S[J+1];J--){
                   1298:                        T=S[J];S[J]=S[J+1];S[J+1]=T;
                   1299:                        R=cons(J,R);
                   1300:                }
                   1301:        }
                   1302:        return R;
                   1303: }
                   1304:
1.6       takayama 1305: def sord(W,V)
                   1306: {
                   1307:        L = length(W);
                   1308:        W0 = nevect(L);
                   1309:        V0 = newvect(L);
                   1310:        for(I = F = C = 0; I < L; I++){
                   1311:                C = 0;
                   1312:                if( (W1 = W[I]) > (V1 = V[I]) ){
                   1313:                        if(F < 0) C = 1;
                   1314:                        else if(F==0) F = 1;
                   1315:                }else if(W1 < V1){
                   1316:                        if(F > 0) C = 1;
                   1317:                        else if(F==0) F = -1;
                   1318:                }
                   1319:                for(J = I;--J >= 0 && W0[J] > W1; ) W0[J+1] = W0[J];
                   1320:                W0[J+1] = W1;
                   1321:                for(J = I;--J >= 0 && V0[J] > V1; ) V0[J+1] = V0[J];
                   1322:                V0[J+1] = V1;
                   1323:                if(C){
                   1324:                        for(J = I; J >= 0; J--){
                   1325:                                if((W1=W0[J]) == (V1=V0[J])) continue;
                   1326:                                if(W1 > V1){
                   1327:                                        if(F < 0) return 2;
                   1328:                                }
                   1329:                                else if(F > 0) return 2;
                   1330:                        }
                   1331:                }
                   1332:        }
                   1333:        return F;
                   1334: }
                   1335:
                   1336: def vprod(V1,V2)
                   1337: {
1.71      takayama 1338:        V1=lsub(V1);V2=lsub(V2);
1.6       takayama 1339:        for(R = 0, I = length(V1)-1; I >= 0; I--)
                   1340:                R = radd(R, rmul(V1[I], V2[I]));
                   1341:        return R;
                   1342: }
                   1343:
                   1344: def dnorm(V)
                   1345: {
1.61      takayama 1346:        if(type(V)<2) return ctrl("bigfloat")?abs(V):dabs(V);
1.58      takayama 1347:        if((M=getopt(max))==1||M==2){
                   1348:                if(type(V)==5) V=vtol(V);
                   1349:                for(S=0;V!=[];V=cdr(V)){
1.61      takayama 1350:                        if(M==2) S+=ctrl("bigfloat")?abs(car(V)):dabs(car(V));
1.58      takayama 1351:                        else{
1.61      takayama 1352:                                if((T=ctrl("bigfloat")?abs(car(V)):dabs(car(V)))>S) S=T;
1.58      takayama 1353:                        }
                   1354:                }
                   1355:                return S;
                   1356:        }
1.6       takayama 1357:        R=0;
                   1358:        if(type(V)!=4)
1.58      takayama 1359:                for (I = length(V)-1; I >= 0; I--) R+= real(V[I])^2+imag(V[I])^2;
1.6       takayama 1360:        else{
                   1361:                if(type(V[0])>3){
                   1362:                        V=ltov(V[0])-ltov(V[1]);
                   1363:                        return dnorm(V);
                   1364:                }
1.58      takayama 1365:                for(;V!=[]; V=cdr(V))   R+=real(car(V))^2+imag(car(V))^2;
1.6       takayama 1366:        }
1.61      takayama 1367:        return ctrl("bigfloat")?pari(sqrt,R):dsqrt(R);
1.6       takayama 1368: }
                   1369:
                   1370: def dvprod(V1,V2)
                   1371: {
                   1372:        if(type(V1)<2) return V1*V2;
                   1373:        R=0;
1.71      takayama 1374:        V1=lsub(V1);
                   1375:        V2=lsub(V2);
1.6       takayama 1376:        if(type(V1)!=4)
                   1377:                for(I = length(V1)-1; I >= 0; I--)
                   1378:                        R += V1[I]*V2[I];
                   1379:        else{
                   1380:                for(; V1!=[]; V1=cdr(V1),V2=cdr(V2))
                   1381:                        R+=car(V1)*car(V2);
                   1382:        }
                   1383:        return R;
                   1384: }
                   1385:
1.70      takayama 1386: def ptline(L,R)
                   1387: {
                   1388:        P=L[0];Q=L[1];
                   1389:        return (Q[1]-P[1])*(R[0]-P[0])-(Q[0]-P[0])*(R[1]-P[1]);
                   1390: }
                   1391:
                   1392:
1.6       takayama 1393: def dvangle(V1,V2)
                   1394: {
                   1395:        if(V2==0 && type(V1)==4 && length(V1)==3 &&
                   1396:          (type(V1[0])==4 || type(V1[0])==5 || type(V1[1])==4 || type(V1[1])==5 ||
                   1397:           type(V1[2])==4 || type(V1[2])==5) ){
                   1398:                if(V1[0]==0 || V1[1]==0 || V1[2]==0) return 1;
                   1399:                PV2=V1[1];
                   1400:                if(type(PV2)==4){
                   1401:                        PV2=ltov(PV2);
                   1402:                        return dvangle(PV2-ltov(V1[0]),ltov(V1[2])-PV2);
                   1403:                }else
                   1404:                        return dvangle(PV2-V1[0],V1[2]-PV2);
                   1405:        }
                   1406:        if((L1=dnorm(V1))==0 || (L2=dnorm(V2))==0) return 1;
                   1407:        return dvprod(V1,V2)/(L1*L2);
                   1408: }
                   1409:
                   1410: def mulseries(V1,V2)
                   1411: {
                   1412:        L = length(V1);
                   1413:        if(size(V2) < L)
                   1414:                L = size(V2);
                   1415:        VV = newvect(L);
                   1416:        for(J = 0; J < L; J++){
                   1417:                for(K = R = 0; K <= J; K++)
                   1418:                        R = radd(R,rmul(V1[K],V2[J-K]));
                   1419:                VV[J] = R;
                   1420:        }
                   1421:        return VV;
                   1422: }
                   1423:
1.13      takayama 1424: def scale(L)
                   1425: {
1.23      takayama 1426:        T=F=0;LS=1;
1.18      takayama 1427:        Pr=getopt(prec);
1.23      takayama 1428:        Inv=getopt(inv);
                   1429:        Log10=dlog(10);
                   1430:        if(type(L)==7){
                   1431:                V=findin(L,["CI","DI","CIF","CIF'","DIF","DIF'","SI","TI1","TI2","STI"]);
                   1432:                if(V>=0){
                   1433:                        L=["C","D","CF","CF'","DF","DF'","S","T1","T2","ST"];
                   1434:                        Inv=1;L=L[V];
                   1435:                }
                   1436:                V=findin(L,["C","A","K","CF","CF'","S","T1","T2","ST","LL0","LL1","LL2","LL3","LL00",
                   1437:                        "LL01","LL02","LL03"])+1;
                   1438:                if(V==0) V=findin(L,["D","B","K","DF","DF'"])+1;
                   1439:                if(V>0) L=V;
                   1440:        }
                   1441:        if(type(OL=L)!=4){
1.15      takayama 1442:                if(L==2){
1.23      takayama 1443:                        L=(Pr==0)?
1.18      takayama 1444:                          [[[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 1445:                   [[1,2,1/10],[2,5,1/2], [10,20,1],[20,50,5]],
1.18      takayama 1446:                   [[1,2,1/2],[2,10,1], [10,20,5],[20,100,10]]]:
                   1447:                           [[[1,2,1/50],[2,5,1/20],[5,10,1/10], [10,20,1/5],[20,50,1/2],[50,100,1]],
                   1448:                                [[1,5,1/10],[5,10,1/2], [10,20,1],[50,100,5]],
                   1449:                                [[1,5,1/2],[5,10,1], [10,50,5],[50,100,10]]];
1.23      takayama 1450:                        LS=2;M2=[[1,10,1],[10,100,10]];
1.15      takayama 1451:                }else if(L==3){
1.23      takayama 1452:                        L=(Pr==0)?
1.18      takayama 1453:                          [[[1,2,1/20],[2,5,1/10],[5,10,1/5], [10,20,1/2],[20,50,1],[50,100,2],
                   1454:                   [100,200,5],[200,500,10],[500,1000,20]],
1.15      takayama 1455:                        [[1,2,1/10],[2,5,1/2], [10,20,1],[20,50,5], [100,200,10],[200,500,50]],
1.18      takayama 1456:                        [[1,2,1/2],[2,10,1], [10,20,5],[20,100,10], [100,200,50],[200,1000,100]]]:
                   1457:                          [[[1,2,1/50],[2,5,1/20],[5,10,1/10],[10,20,1/5],[20,50,1/2],[50,100,1],
                   1458:                              [100,200,2],[200,500,5],[500,1000,10]],
                   1459:                                [[1,5,1/10],[5,10,1/2], [10,50,1],[50,100,5], [100,500,10],[500,1000,50]],
1.23      takayama 1460:                                [[1,5,1/2],[5,10,1],[10,50,5],[50,100,10], [100,500,50],[500,1000,100]]];
                   1461:                        LS=3;M2=[[1,5,1],[10,50,10],[100,500,100],[500,1000,500]];
                   1462:                }else if(L>9&&L<18){
1.26      takayama 1463:                        if(L<18){       /* LL0 - LL3, LL00 - LL03 */
1.23      takayama 1464:                                if(L==10){
                   1465:                                        L=[ [[1.001,1.002,0.00001],[1.002,1.005,0.00002],[1.005,1.0105,0.00005]],
                   1466:                                                [[1.001,1.002,0.00005],[1.002,1.005,0.0001], [1.005,1.0105,0.0001]],
                   1467:                                                [[1.001,1.002,0.0001],[1.002,1.005,0.0005], [1.005,1.0105,0.0005]]];
                   1468:                                        M2=[1.001,1.0015,1.002,1.003,1.004,1.005,1.006,1.007,1.008,1.009,1.01];
                   1469:                                }
                   1470:                                if(L==11){
                   1471:                                        L=[ [[1.01,1.02,0.0001],[1.02,1.05,0.0002],[1.05,1.105,0.0005]],
                   1472:                                                [[1.01,1.02,0.0005],[1.02,1.05,0.001], [1.05,1.105,0.001]],
                   1473:                                                [[1.01,1.02,0.001],[1.02,1.05,0.005], [1.05,1.105,0.005]]];
                   1474:                                        M2=[1.01,1.015,1.02,1.03,1.04,1.05,1.06,1.07,1.08,1.09,1.10];
                   1475:                                }else if(L==12){
                   1476:                                        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],
                   1477:                                              [2.5,2.72,0.02]],
                   1478:                                                [[1.105,1.2,0.005],[1.2,1.4,0.01],[1.4,1.8,0.01],[1.8,2.5,0.05],
                   1479:                                              [2.5,2.72,0.1]],
                   1480:                                                [[1.105,1.2,0.01],[1.2,1.4,0.05],[1.4,1.8,0.05],[1.8,2.5,0.1],
                   1481:                                              [2.5,2.72,0.1]]];
1.26      takayama 1482:                                        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 1483:                                }else if(L==13){
                   1484:                                        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],
                   1485:                                                 [50,100,2],[100,200,5],[200,400,10],[400,500,20],[500,1000,50],
                   1486:                                                 [1000,2000,100],[2000,5000,200],[5000,10000,500],[10000,22000,1000]],
                   1487:                                                [[2.7,4,0.1],[4,6,0.1],[6,10,0.5],[10,15,1],[15,30,1],[30,50,5],
                   1488:                                                 [50,100,10],[100,200,10],[200,400,50],[400,500,100],[500,1000,100],
                   1489:                                                 [1000,2000,500],[2000,5000,1000],[5000,10000,1000],[10000,22000,5000]],
                   1490:                                                [[3,4,0.5],[4,6,0.5],[6,10,1],[10,15,5],[15,30,5],[30,50,10],
                   1491:                                                 [50,100,50],[100,200,50],[200,400,100],[400,500,100],[500,1000,500],
                   1492:                                                 [1000,2000,1000],[2000,5000,3000],[5000,10000,5000],[10000,22000,10000]]];
                   1493:                                        M2=[3,4,5,6,7,8,9,10,15,20,30,40,50,100,200,500,1000,2000,5000,10000,20000];
                   1494:                                }else if(L==14){
1.26      takayama 1495:                                        L=[ [[0.998,0.999,0.00001],[0.995,0.998,0.00002],[0.99,0.995,0.00005]],
                   1496:                                                [[0.998,0.999,0.00005],[0.995,0.998,0.0001],[0.99,0.995,0.0001]],
                   1497:                                                [[0.998,0.999,0.0001],[0.995,0.998,0.0005],[0.99,0.995,0.0005]]];
1.23      takayama 1498:                                        M2=[0.999,0.9985,0.998,0.997,0.996,0.995,0.994,0.993,0.992,0.991,0.99];
                   1499:                                }else if(L==15){
1.26      takayama 1500:                                        L=[ [[0.98,0.9901,0.0001],[0.95,0.98,0.0002],[0.905,0.95,0.0005]],
                   1501:                                                [[0.98,0.99,0.0005],[0.95,0.98,0.001], [0.905,0.95,0.001]],
1.23      takayama 1502:                                                [[0.98,0.99,0.001],[0.95,0.98,0.005], [0.91,0.95,0.005]]];
                   1503:                                        M2=[0.99,0.985,0.98,0.97,0.96,0.95,0.94,0.93,0.92,0.91];
                   1504:                                }else if(L==16){
1.26      takayama 1505:                                        L=[ [[0.8,0.906,0.001],[0.6,0.8,0.002],[0.37,0.6,0.005]],
                   1506:                                                [[0.8,0.906,0.005],[0.6,0.8,0.01],[0.37,0.6,0.01]],
                   1507:                                                [[0.8,0.9,0.01],[0.6,0.8,0.05],[0.4,0.6,0.05]]];
                   1508:                                        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 1509:                                }else{
1.26      takayama 1510:                                        L=[ [[0.05,0.37,0.002],[0.02,0.05,0.001],[0.01,0.02,0.0005],
                   1511:                                                 [0.005,0.01,0.0002],[0.001,0.005,0.0001],
                   1512:                                                 [0.0005,0.001,0.00002],[0.0001,0.0005,0.00001],[0.00005,0.0001,0.000002]],
                   1513:                                                [[0.05,0.37,0.01],[0.02,0.05,0.002],[0.01,0.02,0.001],
                   1514:                                                 [0.005,0.01,0.001],[0.001,0.005,0.0002],
                   1515:                                                 [0.0005,0.001,0.0001],[0.0001,0.0005,0.00002],[0.00005,0.0001,0.00001]],
                   1516:                                                [[0.05,0.37,0.05],[0.02,0.05,0.01],[0.01,0.02,0.005],
                   1517:                                                 [0.005,0.01,0.005],[0.002,0.005,0.001],
                   1518:                                                 [0.0005,0.001,0.0005],[0.0001,0.0005,0.0001],[0.00005,0.0001,0.00005]]];
                   1519:                                        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 1520:                                }
                   1521:                        }
1.15      takayama 1522:                }else{
1.23      takayama 1523:                        if(L==6){       /* S */
                   1524:                                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]],
                   1525:                                        [[6-1/6,15,1/6],[15,30,1/2],[30,70,1],[70,80,5],[80,90,10]],
                   1526:                                        [[6,15,1/2],[15,30,1],[30,70,5],[70,90,10]] ];
                   1527:                                M2=[6,7,8,9,10,15,20,30,40,50,60,70,90];
                   1528:                        }else if(L==7){ /* T1 */
                   1529:                                F=log(tan(x*3.1416/180))/Log10+1;
                   1530:                                L=[ [[6-1/3,15,1/12],[15,45,1/6]],
                   1531:                                        [[6-1/3,15,1/6],[15,45,1/2]],
                   1532:                                        [[6,45,1]] ];
                   1533:                                M2=[6,7,8,9,10,15,20,30,40,45];
                   1534:                        }else if(L==8){ /* T2 */
                   1535:                                L=[ [[45,75,1/6],[75,84+1/6,1/12]],
                   1536:                                        [[45,75,1],[75,84+1/6,1/6]],
                   1537:                                        [[45,84,1]] ];
                   1538:                                M2=[45,50,60,70,75,80,81,82,83,84];
                   1539:                        }else if(L==9){ /* ST */
                   1540:                                L=[ [[35/60,1,1/120],[1,2,1/60],[2,5+9/12,1/30]],
                   1541:                                        [[35/60,1,1/60],[1,2,1/6],[2,5+9/12,1/6]],
                   1542:                                        [[40/60,1,1/6],[1,2,1/2],[2,5+9/12,1]] ];
                   1543:                                M2=[1,2,3,4,5];
                   1544:                        }else{
                   1545:                                M2=(L==4||L==5)?[[1,2,1/2],[2,9,1]]:[[1,2,1/2],[2,10,1]];
                   1546:                                L=(Pr==0)?
                   1547:                                [ [[1,2,1/50],[2,5,1/20],[5,10,1/10]],
                   1548:                                  [[1,5,1/10],[5,10,1/2]],
                   1549:                                  [[1,5,1/2],[5,10,1]] ]:
                   1550:                                [[[1,2,1/100],[2,5,1/50],[5,10,1/20]],
                   1551:                              [[1,2,1/20],[2,10,1/10]],
                   1552:                              [[1,2,1/10],[2,10,1/2]] ];
                   1553:                        }
1.15      takayama 1554:                }
                   1555:        }else if(type(L[0])!=4){
                   1556:                L=[L];
                   1557:                if(length(L)!=3||L[0]+L[2]>L[1]) T=L;
1.13      takayama 1558:        }
1.15      takayama 1559:        if(T==0){
                   1560:                if(type(L[0][0])!=4) L=[L];
                   1561:                for(R=[];L!=[];L=cdr(L)){
                   1562:                        for(RR=[],LT=car(L);LT!=[];LT=cdr(LT))
                   1563:                                for(I=car(LT)[0];I<=car(LT)[1];I+=car(LT)[2]) RR=cons(I,RR);
                   1564:                RR=lsort(RR,[],1);
                   1565:                        R=cons(RR,R);
                   1566:                }
                   1567:                R=reverse(R);
                   1568:                for(T=[];R!=[];R=cdr(R)){
                   1569:                        if(length(R)>1) T=cons(lsort(R[0],R[1],"setminus"),T);
                   1570:                        else T=cons(R[0],T);
                   1571:                }
1.13      takayama 1572:        }
                   1573:        V0=dlog(10);
                   1574:        S0=S1=1;D0=D1=0;
                   1575:        SC=getopt(scale);
                   1576:        if(type(SC)==4){
                   1577:                S0=SC[0];S1=SC[1];
1.18      takayama 1578:        }else if(type(SC)==1){
                   1579:                S0=SC;S1=0;
1.13      takayama 1580:        }else return T;
                   1581:        if(type(D=getopt(shift))==4){
                   1582:                D0=D[0];D1=D[1];
1.31      takayama 1583:        }else if(type(D)<2&&type(D)>=0){
1.23      takayama 1584:                D0=0;D1=D;
1.31      takayama 1585:        };
1.23      takayama 1586:        if(Inv==1){
                   1587:                D0+=S0;S0=-S0;
1.13      takayama 1588:        }
1.23      takayama 1589:        if(type(TF=getopt(f))>1) F=TF;
                   1590:        if(F) F=f2df(F);
                   1591:        if(type(I=getopt(ol))==1&&OL>3) OL=I;
1.18      takayama 1592:        for(M=M0=[],I=length(T);T!=[];T=cdr(T),I--){
1.13      takayama 1593:                for(S=car(T);S!=[];S=cdr(S)){
1.23      takayama 1594:                        VS=car(S);
                   1595:                        if(F) V=myfdeval(F,car(S));
                   1596:                        else if(OL==4) V=frac(dlog(VS)/Log10+0.5);
                   1597:                        else if(OL==5) V=frac(dlog(VS*3.1416)/Log10);
                   1598:                        else if(OL>5&&OL<10){
                   1599:                                VS=VS*3.1416/180;
                   1600:                                if(OL==6) V=dlog(dsin(VS))/Log10+1;
                   1601:                                else if(OL==9) V=dlog(VS)/Log10+2;
                   1602:                                else V=dlog(dtan(VS))/Log10+8-OL;
                   1603:                        }
                   1604:                        else if(OL>9&&OL<14) V=dlog(dlog(VS))/Log10+13-OL;
                   1605:                        else if(OL>13&&OL<18) V=dlog(-dlog(VS))/Log10+17-OL;
                   1606:                        else V=dlog(VS)/Log10/LS;
                   1607:                        V*=S0;
1.13      takayama 1608:                        if(S1!=0){
                   1609:                                M=cons([V+D0,D1],M);
1.23      takayama 1610:                                M=cons([V+D0,((length(SC)>2)?SC[I]:(I*S1))+D1],M);
1.13      takayama 1611:                                M=cons(0,M);
1.18      takayama 1612:                        }else M0=cons(V+D0,M0);
1.13      takayama 1613:                }
1.18      takayama 1614:                if(S1==0) M=cons(reverse(M0),M);
1.13      takayama 1615:        }
                   1616:        if(S1!=0) M=cdr(M);
1.18      takayama 1617:        if(S1==0||getopt(TeX)!=1) return M;
1.13      takayama 1618:        M=reverse(M);
1.23      takayama 1619:        if(type(U=getopt(line))==4){
                   1620:                if(Inv==1) U=[U[0]+S0,U[1]+S0];
1.18      takayama 1621:                M=cons([U[0]+D0,D1],cons([U[1]+D0,D1],cons(0,M)));
1.23      takayama 1622:        }
                   1623:        if((VT=getopt(vert))==1){
                   1624:                for(N=[];M!=[];M=cdr(M)){
                   1625:                        if(type(TM=car(M))==4) N=cons([TM[1],TM[0]],N);
                   1626:                        else N=cons(TM,N);
                   1627:                }
                   1628:                M=reverse(N);
                   1629:        }
1.18      takayama 1630:        if(type(Col=getopt(col))<1) S=xylines(M);
                   1631:        else S=xylines(M|opt=Col);
                   1632:        if(type(Mes=getopt(mes))==4){
1.23      takayama 1633:                if(length(Mes)==1&&type(M2)==4) Mes=cons(car(Mes),M2);
1.18      takayama 1634:                S3=car(Mes);
                   1635:                if(type(S3)==4){
                   1636:                        Col=S3[1];
                   1637:                        S3=car(S3);
                   1638:                }else Col=0;
                   1639:                V=car(scale(cdr(Mes)));
1.23      takayama 1640:                if(!F) Mes=scale(cdr(Mes)|scale=[S0/LS,0],shift=[D0,D1],ol=OL);
1.18      takayama 1641:                else Mes=scale(cdr(Mes)|f=F,scale=[S0,0],shift=[D0,D1]);
                   1642:                for(M=car(Mes);M!=[];M=cdr(M),V=cdr(V)){
1.23      takayama 1643:                        TV=deval(car(V));
                   1644:                        if(Col!=0) TV=[Col,TV];
                   1645:                        S+=(VT==1)?xyput([S3+D1,car(M),TV]):xyput([car(M),S3+D1,TV]);
                   1646:                }
                   1647:        }
                   1648:        if(type(Mes=getopt(mes2))==4){
                   1649:                if(type(car(Mes))!=4) Mes=[Mes];
                   1650:                for(;Mes!=[];Mes=cdr(Mes)){
                   1651:                        TM=car(Mes);
                   1652:                        if(!F) V=scale([car(TM)]|scale=[S0/LS,0],shift=[D0,D1],ol=OL);
                   1653:                        else V=scale([car(TM)]|f=F,scale=[S0,0],shift=[D0,D1]);
                   1654:                        V=car(car(V));
                   1655:                        TM=cdr(TM);
                   1656:                        if(type(Col=car(TM))==4){
                   1657:                                C0=Col[0];C1=Col[1];
                   1658:                                if(length(Col)==3){
                   1659:                                        S+=(VT==1)?xyline([D1+C0,V],[D1+C1,V]|opt=Col[2])
                   1660:                                                :xyline([V,D1+C0],[V,D1+C1]|opt=Col[2]);
                   1661:                                }else S+=(VT==1)?xyline([D1+C0,V],[D1+C1,V]):xyline([V,D1+C0],[V,D1+C1]);
                   1662:                        }
                   1663:                        if(type(TM[1]<2)){
                   1664:                                TM=cdr(TM);
                   1665:                                S3=car(TM);
                   1666:                        }
                   1667:                        S+=(VT==1)?xyput([S3+D1,V,TM[1]]):xyput([V,S3+D1,TM[1]]);
1.13      takayama 1668:                }
                   1669:        }
1.18      takayama 1670:        return S;
1.13      takayama 1671: }
                   1672:
1.6       takayama 1673: def pluspower(P,V,N,M)
                   1674: {
                   1675:        RR = 1;
                   1676:        for(K = R = 1; K < M-1; I++){
                   1677:                R = R*(N-K+1)*P/K;
                   1678:                RR = radd(RR,R);
                   1679:        }
                   1680:        VV = newvect(M);
                   1681:        for(K = 0; K < M-1; K++)
                   1682:                VV[K] = red(mycoef(RR,K,V));
                   1683: }
                   1684:
                   1685: def vtozv(V)
                   1686: {
                   1687:        if(type(V)<4) V=newvect(1,[V]);
                   1688:        S = length(V);
                   1689:        VV = newvect(S);
                   1690:        Lcm = 1;
                   1691:        for(K = 0; K < S; K++){
                   1692:                VV[K] = red(V[K]);
                   1693:                Lcm = lcm(Lcm,dn(VV[K]));
                   1694:                C = ptozp(nm(VV[K])|factor=0);
                   1695:                if(K == 0){
                   1696:                        Dn  = dn(C[1]);
                   1697:                        Nm  = nm(C[1]);
                   1698:                        PNm = nm(C[0]);
                   1699:                }else{
                   1700:                        Dn  = ilcm(Dn,dn(C[1]));
                   1701:                        Nm  = igcd(Nm,nm(C[1]));
                   1702:                        PNm = gcd(PNm,nm(C[0]));
                   1703:                }
                   1704:        }
                   1705:        if(!(M=Nm*PNm)) return [VV,0];
                   1706:        Mul = (Lcm*Dn)/M;
                   1707:        for(K = 0; K < S; K++)
                   1708:                VV[K] = rmul(VV[K],Mul);
                   1709:        return [VV,Mul];
                   1710: }
                   1711:
                   1712: def dupmat(M)
                   1713: {
                   1714:        if(type(M) == 6){
                   1715:                Size = size(M);
                   1716:                MM = newmat(Size[0],Size[1]);
                   1717:                for(I = 0; I < Size[0]; I++){
                   1718:                        for(J = 0; J < Size[1]; J++)
                   1719:                                MM[I][J] = M[I][J];
                   1720:                }
                   1721:                return MM;
                   1722:        }
                   1723:        if(type(M) == 5)
                   1724:                return ltov(vtol(M));
                   1725:        return M;
                   1726: }
                   1727:
                   1728: def matrtop(M)
                   1729: {
                   1730:        S = size(M);
                   1731:        MM = dupmat(M);
                   1732:        Lcm = newvect(S[0]);
                   1733:        for(J = 0; J < S[0]; J++){
                   1734:                U = vtozv(M[J]);
                   1735:                for(K = -1, I = 0; I < S[1]; I++)
                   1736:                        MM[J][I] = U[0][I];
                   1737:                Lcm[J] = U[1];
                   1738:        }
                   1739:        return [MM,Lcm];
                   1740: }
                   1741:
                   1742: def mytrace(M)
                   1743: {
                   1744:        S=size(M);
                   1745:        if(S[0]!=S[1]) return 0;
                   1746:        for(I=V=0; I<S[0]; I++){
                   1747:                V+=M[I][I];
                   1748:        }
                   1749:        return V;
                   1750: }
                   1751:
                   1752: def mydet(M)
                   1753: {
                   1754:        MM = matrtop(M);
                   1755:        if(type(MM[0]) == 6){
                   1756:                S = size(M);
                   1757:                for(Dn = 1, I = 0; I < S[0]; I++)
                   1758:                        Dn *= MM[1][I];
                   1759:                return (!Dn)?0:red(det(MM[0])/Dn);
                   1760:        }
                   1761: }
                   1762:
1.71      takayama 1763: def permanent(M)
                   1764: {
                   1765:        SS=size(M);
                   1766:        if((S=SS[0]) != SS[1] || S==0) return 0;
                   1767:        if((Red=getopt(red))!=1){
                   1768:                MM = matrtop(M);
                   1769:                for(Dn = 1, I = 0; I < S; I++)
                   1770:                        Dn *= MM[1][I];
                   1771:                return (!Dn)?0:red(permanent(MM[0]|red=1)/Dn);
                   1772:        }
                   1773:        if(S<3){
                   1774:                if(S==1) return M[0][0];
                   1775:                else return M[0][0]*M[1][1]+M[0][1]*M[1][0];
                   1776:        }
                   1777:        LL=m2ll(M);
                   1778:        for(V=I=0;I<S;I++){
                   1779:                if(!(K=M[I][0])) continue;
                   1780:                for(TL=[],SL=LL,J=0;J<S;J++,SL=cdr(SL))
                   1781:                        if(I!=J) TL=cons(cdr(car(SL)),TL);
                   1782:                if(K) V+=K*permanent(lv2m(TL));
                   1783:        }
                   1784:        return V;
                   1785: }
                   1786:
1.6       takayama 1787: def mperm(M,P,Q)
                   1788: {
                   1789:        if(type(M) == 6){
                   1790:                S = size(M);
                   1791:                if(type(P) <= 1)
                   1792:                        P=(P==1)?Q:trpos(0,0,S[0]);
                   1793:                if(type(P) > 3 && type(P[0]) >= 4)
                   1794:                        P = trpos(P[0][0],P[0][1],S[0]);
                   1795:                else if(type(P) == 4){
                   1796:                        if(length(P)==2 && type(P[1])==4){
                   1797:                                P0=P[0];P1=car(P[1]);P=newvect(P1);
                   1798:                                for(I=0;I<P1;I++) P[I]=P0+I;
                   1799:                        }else P = ltov(P);
                   1800:                }
                   1801:                if(type(Q) <= 1)
                   1802:                        Q=(Q==1)?P:trpos(0,0,S[1]);
                   1803:                if(type(Q) > 3 && type(Q[0]) >= 4)
                   1804:                        Q = trpos(Q[0][0],Q[0][1],S[1]);
                   1805:                if(type(Q) == 4){
                   1806:                        if(length(Q)==2 && type(Q[1])==4){
                   1807:                                P0=Q[0];P1=car(Q[1]);Q=newvect(P1);
                   1808:                                for(I=0;I<P1;I++) Q[I]=P0+I;
                   1809:                        }else Q = ltov(Q);
                   1810:                }
                   1811:                MM = newmat(S0=length(P),S1=length(Q));
                   1812:                for(I = 0; I < S0; I++){
                   1813:                        MMI = MM[I]; MPI = M[P[I]];
                   1814:                        for(J = 0; J < S1; J++)
                   1815:                                MMI[J] = MPI[Q[J]];
                   1816:                }
                   1817:                return MM;
                   1818:        }
                   1819:        if((type(M) == 5 || type(M) == 4) && type(P) >= 4){
                   1820:                if(length(P) == 1 && type(car(P)) == 4)
                   1821:                        P = trpos(car(P)[0],car(P)[1],length(M));
                   1822:                MM = newvect(S = length(P));
                   1823:                for(I = 0; I < S; I++)
                   1824:                        MM[I] = M[P[I]];
                   1825:                if(type(M) == 4)
                   1826:                        MM = vtol(MM);
                   1827:                return MM;
                   1828:        }
                   1829:        return M;
                   1830: }
                   1831:
                   1832: def mtranspose(M)
                   1833: {
                   1834:        if(type(M)==4){
                   1835:                MV=ltov(M);
                   1836:                II=length(MV);
                   1837:                for(I=L=0; I<II; I++){
                   1838:                        if(type(MV[I])!=4)      return M;
                   1839:                        MV[I]=ltov(MV[I]);
                   1840:                }
                   1841:                for(R=[],J=0; ;J++){
                   1842:                        for(T=[],I=F=0; I<II; I++){
                   1843:                                if(length(MV[I])>J){
                   1844:                                        F=1;
                   1845:                                        T=cons(MV[I][J],T);
                   1846:                                }
                   1847:                        }
                   1848:                        if(F==0)        return reverse(R);
                   1849:                        if(F==1)        R=cons(reverse(T),R);
                   1850:                }
                   1851:        }
                   1852:        if(type(M) != 6)
                   1853:                return M;
                   1854:        S = size(M);
                   1855:        MM = newmat(S[1],S[0]);
                   1856:        for(I = 0; I < S[0]; I++){
                   1857:                for(J = 0; J < S[1]; J++)
                   1858:                        MM[J][I] = M[I][J];
                   1859:        }
                   1860:        return MM;
                   1861: }
                   1862:
                   1863: def mtoupper(MM, F)
                   1864: {
                   1865:        TeXs=["\\ -=\\ ","\\ +=\\ "];
                   1866:        Lins=[" -= line"," += line"];
                   1867:        Assume=["If","Assume"];
                   1868:        if(type(St = getopt(step))!=1) St=0;
                   1869:        Opt = getopt(opt);
                   1870:        if(type(Opt)!=1) Opt=0;
1.43      takayama 1871:        if(type(Main=getopt(main))!=1) Main=0;
1.6       takayama 1872:        TeX=getopt(dviout);
                   1873:        if(type(Tab=getopt(tab))!=1 && Tab!=0) Tab=2;
                   1874:        Line="\\text{line}";
                   1875:        if(type(TeX)!=1 || !St) TeX=0;
                   1876:        Size = size(MM);
                   1877:        if(F==-1){
                   1878:                M = newmat(Size[0], Size[1]+1);
                   1879:                for(I = 0; I < Size[0]; I++){
                   1880:                        for(J = 0; J < Size[1]; J++)
                   1881:                                M[I][J] = MM[I][J];
                   1882:                        M[I][Size[1]] = zz^I;
                   1883:                }
                   1884:                Size = size(M);
                   1885:                F = 1;
                   1886:        }else if(F<0){
                   1887:                F=Size[0];
                   1888:                M = newbmat(1,2,[[MM,mgen(F,0,[1],0)]]);
                   1889:                Size=[Size[0],F+Size[1]];
                   1890:        }else
                   1891:                M = dupmat(MM);
                   1892:        if(St){
                   1893:                if(TeX) Lout=[[dupmat(M)]];
                   1894:                else mycat0([M,"\n\n"],0);
                   1895:        }
                   1896:        Top="";
                   1897:        if(Opt>3){
                   1898:                for(I=Opt; I>4; I--)
                   1899:                        Top+=(TeX)?"\\ ":" ";
                   1900:        }
                   1901:        PC=IF=1;
1.43      takayama 1902:        if(Opt>3){
                   1903:                for(P=[1],K=0;K<Size[1]-F;K++){
                   1904:                        for(J=0;J<Size[0];J++)
                   1905:                                if(type(dn(M[J][K]))==2) P=cons(dn(M[J][K]),P);
                   1906:                }
                   1907:                PC=llcm(P|poly=1);
                   1908:        }
1.6       takayama 1909:        for(K = JJ = 0; K < Size[1] - F; K++){
                   1910:                for(J = JJ; J < Size[0]; J++){
                   1911:                        if(M[J][K] != 0){               /* search simpler element */
                   1912:                                if(Opt>2 && (Mul=M[J][K])!=1){
                   1913:                                        for(FF=0,JT=J; JT<Size[0]; JT++){
                   1914:                                                if((Val=M[JT][K])==1){  /* 1 */
                   1915:                                                        Mul=1;J=JT; break;
                   1916:                                                }
                   1917:                                                if(Val==0 || type(Val)>type(Mul)) continue;
                   1918:                                                if(type(Val)<type(Mul) || (Val==-1 && Mul!=-1)){
                   1919:                                                        Mul=Val; J=JT;          /* smaller type */
                   1920:                                                }
                   1921:                                                else if(Opt>3){
                   1922:                                                        if(isint(Val)==1){      /* integer elememt */
                   1923:                                                                if(isint(Mul)!=1){
                   1924:                                                                        Mul=Val; J=JT;  /* integer */
                   1925:                                                                }
                   1926:                                                                if(FF<3||(FF==3&&Val>0)){
                   1927:                                                                        for(JK=K+1;;){
                   1928:                                                                                if(JK>=Size[1]-F){
                   1929:                                                                                        J=JT;
                   1930:                                                                                        FF=((Mul=Val)>0)?4:3;
                   1931:                                                                                        break;  /* divisible int => 4: pos_int 3: neg_int */
                   1932:                                                                                }
                   1933:                                                                                if(isint(M[JT][JK++]/Val)!=1) break;
                   1934:                                                                        }
                   1935:                                                                }
                   1936:                                                        }else if(!FF){
                   1937:                                                                for(JK=K+1; JK<Size[1]-F; JK++){
                   1938:                                                                        if(isint(M[JT][JK]/Val)!=1) break;
                   1939:                                                                        J=JT; FF=1;             /* divisible => 1: non integer */
                   1940:                                                                }
                   1941:                                                        }
                   1942:                                                }
                   1943:                                        }
                   1944:                                        if(FF==0 && Opt>3 && Mul!=1 && Mul!=-1){        /* FF > 0 => divisible */
                   1945:                                                for(FF=0,J0=J; J0<Size[0]-1 && FF!=9; J0++){
                   1946:                                                        VV0=M[J0][K];
                   1947:                                                        if(VV0==0 || isint(VV0)==0) continue;
                   1948:                                                        for(J1=J0+1;J1<Size[0] && FF!=9; J1++){
                   1949:                                                                VV1=M[J1][K];
                   1950:                                                                if(VV1==0 || isint(VV1)==0) continue;
                   1951:                                                                for(C=FT=0,V0=VV0,V1=VV1; C<2 && FF!=10; C++,V1=V0,V0=VV1){
                   1952:                                                                        for(CC=0,RC=ceil(V0/V1);CC<2;CC++,RC--){
                   1953:                                                                                if((CD=V0-RC*V1)==0 && (RC==1 || RC==-1)){
                   1954:                                                                                        FT=1; FF=10;            /* 10: vanish by +- */
                   1955:                                                                                }else if(CD==1){
                   1956:                                                                                        FV=(vars(M[J0])==[]&&vars(M[J1])==[])?1:0;
                   1957:                                                                                        if((RC==1 || RC==-1) && FF<8+FV){
                   1958:                                                                                                FT=1; FF=8+FV;  /* 8/9: 1 by +- */
                   1959:                                                                                        }else if(FF<6+VF){
                   1960:                                                                                                FT=1; FF=6+FV;  /* 6/7: 1 by times */
                   1961:                                                                                        }
                   1962:                                                                                }else if(CD==-1){
                   1963:                                                                                        FV=(vars(M[J0])==[]&&vars(M[J1])==[])?1:0;
                   1964:                                                                                        if((RC==1 || RC==-1) && FF<4+FV){
                   1965:                                                                                                FT=1; FF=4+FV;  /* 4/5: 1 by +- */
                   1966:                                                                                        }else if(FF<2+VF){
                   1967:                                                                                                FT=1; FF=2+FV;  /* 2/3: 1 by times */
                   1968:                                                                                        }
                   1969:                                                                                }
                   1970:                                                                                if(FT==1){
                   1971:                                                                                        FT=0; KRC=RC;
                   1972:                                                                                        if(C==0){
                   1973:                                                                                                KJ0=J0; KJ1=J1;
                   1974:                                                                                        }else{
                   1975:                                                                                                KJ0=J1; KJ1=J0;
                   1976:                                                                                        }
                   1977:                                                                                }
                   1978:                                                                        }
                   1979:                                                                }
                   1980:                                                        }
                   1981:                                                }
                   1982:                                                if(FF>0){
                   1983:                                                        for(I=K;I<Size[1];I++)
                   1984:                                                                M[KJ0][I]=radd(M[KJ0][I],rmul(M[KJ1][I],-KRC));
                   1985:                                                        if(KRC<0){
                   1986:                                                                KRC=-KRC;Sgn=1;
                   1987:                                                        }else
                   1988:                                                                Sgn=0;
1.43      takayama 1989:                                                        if(St&&!Main){
1.6       takayama 1990:                                                                if(TeX){
                   1991:                                                                        if(KRC==1)
                   1992:                                                                                Lout=cons([Top+"\\xrightarrow{", Line,KJ0+1,TeXs[Sgn],
                   1993:                                                                                        Line,KJ1+1,"}",dupmat(M)],Lout);
                   1994:                                                                        else
                   1995:                                                                                Lout=cons([Top+"\\xrightarrow{", Line,KJ0+1,TeXs[Sgn],
                   1996:                                                                                        Line,KJ1+1,"\\times\\left(",KRC,"\\right)}",
                   1997:                                                                                        dupmat(M)],Lout);
                   1998:
                   1999:                                                                }else{
                   2000:                                                                        if(KRC==1)
                   2001:                                                                                mycat([Top+"line",KJ0+1,Lins[Sgn],KJ1+1,"\n",M,"\n"]);                                                                          else
                   2002:                                                                                mycat([Top+"line",KJ0+1,Lins[Sgn],KJ1+1," * (",KRC,")\n",M,"\n"]);
                   2003:                                                                }
                   2004:                                                        }
                   2005:                                                        Mul=M[KJ0][K]; J=KJ0;
                   2006:                                                        if(FF==10){
                   2007:                                                                J--; continue;
                   2008:                                                        }
                   2009:                                                }
                   2010:                                        }
                   2011:                                }
                   2012:                        /* a parameter Var */
                   2013:                                Var=0;
1.43      takayama 2014: /* mycat(["start",J,K]); */
1.6       takayama 2015:                                if(St && Opt>4 && length(Var=vars(nm(M[J][K])))==1){
                   2016:                                        J0=J;Jv=mydeg(nm(M[J0][K]),car(Var));
                   2017:                                        for(I=JJ;I<Size[0]; I++){
                   2018:                                                if((MIK=M[I][K])==0) continue;
                   2019:                                                if((T=vars(MIK=nm(MIK)))==[]){  /* 1/poly */
                   2020:                                                        J=I;Var=[]; break;
                   2021:                                                }
                   2022:                                                if(length(T)>1) continue;
                   2023:                                                if(mydeg(MIK,T[0])<Jv){
1.39      takayama 2024:                                                        J0=I;Jv=mydeg(MIK,T[0]);Var=T;  /* search minimal degree */
1.6       takayama 2025:                                                }
                   2026:                                        }
                   2027:                                        if(length(Var)==1){
                   2028:                                                Var=car(Var);
                   2029:                                                Q=nm(M[J0][K]);
1.43      takayama 2030: /* mycat(["min",Q,M[J0][K],"J0=",J0,"J=",J,"JJ=",JJ,K,M]); */
                   2031: J=J0;
1.6       takayama 2032:                                                for(I=JJ; I<Size[0]; I++){
                   2033:                                                        if(I==J0 || mydeg(nm(M[I][K]),Var)<0) continue;
                   2034:                                                        T=rpdiv(nm(M[I][K]),Q,Var);
                   2035:                                                        if(T[0]!=0 && (vars(T)==[] || vars(T)==[Var])) break;   /* dec. deg */
                   2036:                                                }
                   2037:                                        }
                   2038:                                }
                   2039:                                if(type(Var)==2){ /* 1 variable */
                   2040:                                        if(I==Size[0]){
                   2041:                                                for(QF=0,Q0=1,QR=getroot(Q,Var|mult=1);QR!=[];QR=cdr(QR)){
1.43      takayama 2042: /* mycat(["root",Q,QR,PC]); */
1.6       takayama 2043:                                                        if(deg(T=QR[0][1],Var)>0){
                   2044:                                                                QF=1;Q0*=T; continue;
                   2045:                                                        }
                   2046:                                                        if(subst(PC,Var,T)==0) continue;
                   2047:                                                        Q0*=(Var-(T=QR[0][1]));
                   2048:                                                        if(type(T)<2){
                   2049:                                                                M0=subst(M,Var,T);
                   2050:                                                                if(TeX){
                   2051:                                                                        Lout=cons(["\\hspace{",Tab*(St-3)-1,"mm}\\text{If }",
                   2052:                                                                                Var,"=",T,","] ,Lout);
1.43      takayama 2053:                                                                        Lout=append(mtoupper(M0,F|step=St+1,opt=Opt,dviout=-2,tab=Tab,main=Main),Lout);
1.6       takayama 2054:                                                                }else{
                   2055:                                                                        mycat([str_times(" ",St-1)+"If",Var,"=",T,","]);
1.43      takayama 2056:                                                                        mtoupper(M0,F|step=St+1,opt=Opt,main=Main);
1.6       takayama 2057:                                                                }
                   2058:                                                        }
                   2059:                                                }
                   2060:                                                if(Q0!=1){
                   2061:                                                        if(TeX)
                   2062:                                                                Lout=cons(["\\hspace{",Tab*(St-3)-1,"mm}\\text{"+Assume[QF]+" }",
                   2063:                                                                        Q0/=fctr(Q0)[0][0],"\\ne0,"],Lout);
                   2064:                                                        else
                   2065:                                                                mycat([str_times(" ",St-1)+Assume[QF],Q0,"!=0,"]);
                   2066:                                                        PC*=Q0;
                   2067:                                                }
                   2068:                                                IF=0;St++;
                   2069:                                        }else{
                   2070:                                                KRC=-red((T[2]*dn(M[J0][K]))/(T[1]*dn(M[I][K])));
                   2071:                                                for(II=K;II<Size[1];II++)
                   2072:                                                        M[I][II]=radd(M[I][II],rmul(M[J0][II],KRC));
1.43      takayama 2073:                                                if(!Main){
                   2074:                                                        if(TeX)
                   2075:                                                                Lout=cons([Top+"\\xrightarrow{", Line,I+1,"\\ +=\\ ",Line,
                   2076:                                                                        J0+1,"\\times\\left(",KRC,"\\right)}",dupmat(M)],Lout);
                   2077:                                                        else
                   2078:                                                                mycat([Top+"line",I+1,"+=",Line,J0+1," * (",KRC,")\n",M,"\n"]);
                   2079:                                                }
1.6       takayama 2080:                                                J=JJ-1;
                   2081:                                                continue;
                   2082:                                        }
                   2083:                                }
                   2084:                                if(J != JJ){
                   2085:                                        for(I = K; I < Size[1]; I++){
                   2086:                                                Temp = M[JJ][I];
                   2087:                                                M[JJ][I] = M[J][I];
                   2088:                                                M[J][I] = (Opt>=2)?Temp:-Temp;
                   2089:                                        }
                   2090:                                        if(St){
                   2091:                                                if(TeX)
                   2092:                                                        Lout=cons([Top+"\\xrightarrow{",Line,JJ+1,"\\ \\leftrightarrow\\ ",
                   2093:                                                                Line,J+1,"}",dupmat(M)],Lout);
                   2094:                                                else
                   2095:                                                        mycat0([Top+"line",JJ+1," <-> line",J+1,"\n",M,"\n\n"],0);
                   2096:                                        }
                   2097:                                }
                   2098:                                /* Assume PC != 0 */
                   2099:                                if(Opt>1){
                   2100:                                        Mul = M[JJ][K];
                   2101:                                        if(Opt > 5 && St && IF && (Var=vars(MIK=nm(Mul)))!=[]){
                   2102:                                                TF=fctr(MIK);
                   2103:                                                for(FF=0,Q0=1,TP=cdr(TF);TP!=[];TP=cdr(TP)){
                   2104:                                                        if(type(dn(red(PC/(TP0=car(car(TP))))))<2) continue; /* divisible */
                   2105:                                                        Q0*=TP0;
                   2106:                                                        for(Var=vars(TP0);Var!=[];Var=cdr(Var)){
                   2107:                                                                if(mydeg(TP0,X=car(Var))==1 && type(dn(red(PC/mycoef(TP0,1,X))))<2){
                   2108:                                                                        /* TP0=A*X+B with non-vanishing A */
                   2109:                                                                        T=red(-mycoef(TP0,0,X)/mycoef(TP0,1,X));
                   2110:                                                                        M0=mysubst(M,[X,T]);
                   2111:                                                                        if(TeX){
                   2112:                                                                                Lout=cons(["\\hspace{",Tab*(St-3)-1,"mm}\\text{If }",
                   2113:                                                                                        X,"=",T,","] ,Lout);
1.43      takayama 2114:                                                                                Lout=append(mtoupper(M0,F|step=St+1,opt=Opt,dviout=-2,tab=Tab,main=Main),
1.6       takayama 2115:                                                                                        Lout);
                   2116:                                                                        }else{
                   2117:                                                                                mycat([str_times(" ",St-1)+"If",X,"=",T,","]);
1.43      takayama 2118:                                                                                mtoupper(M0,F|step=St+1,opt=Opt,main=Main);
1.6       takayama 2119:                                                                        }
                   2120:                                                                        break;
                   2121:                                                                }
                   2122:                                                        }
                   2123:                                                        if(Var==[] && Opt>6){
                   2124:                                                                for(Var=vars(TP0);Var!=[];Var=cdr(Var)){
                   2125:                                                                        if(mydeg(TP0,X=car(Var))==1){
                   2126:                                                                                /* TP0=A*X+B, A is a poly of X0 with rational funct */
                   2127:                                                                                T=nm(mycoef(TP0,1,X));
                   2128:                                                                                for(Var0=vars(T);Var0!=[]; Var0=cdr(Var0)){
                   2129:                                                                                        X0=car(Var0);
                   2130:                                                                                        if(type(dn(red(PC/type(mycoef(T,mydeg(T,X0),X0)))))>1) continue;
                   2131:                                                                                        TR=getroot(T,X0|mult=1);
                   2132:                                                                                        if(findin(X0,vars(TR))<0) break;
                   2133:                                                                                }
                   2134:                                                                                if(Var0==[]) continue;
                   2135:                                                                                for(;TR!=[0];TR=cdr(TR)){
                   2136:                                                                                        if(TR==[]){
                   2137:                                                                                                TR=[0,0];
                   2138:                                                                                                T0=-mycoef(TP0,0,X)/mycoef(TP0,1,X);
                   2139:                                                                                                X0=X;
                   2140:                                                                                        }else T0=car(TR)[1];
                   2141:                                                                                        M0=mysubst(M,[X0,T0]);
                   2142:                                                                                        if(TeX){
                   2143:                                                                                                Lout=cons(["\\hspace{",Tab*(St-3)-1,"mm}\\text{If }",
                   2144:                                                                                                        X0,"=",T0,","] ,Lout);
1.43      takayama 2145:                                                                                                Lout=append(mtoupper(M0,F|step=St+1,opt=Opt,dviout=-2,tab=Tab,main=Main),
1.6       takayama 2146:                                                                                                        Lout);
                   2147:                                                                                        }else{
                   2148:                                                                                                mycat([str_times(" ",St-1)+"If",X0,"=",T0,","]);
1.43      takayama 2149:                                                                                                mtoupper(M0,F|step=St+1,opt=Opt,main=Main);
1.6       takayama 2150:                                                                                        }
                   2151:                                                                                }
                   2152:
                   2153:                                                                        }
                   2154:                                                                        break;
                   2155:                                                                }
                   2156:                                                        }
                   2157:                                                        if(Var==[]){
                   2158:                                                                FF=1;
                   2159:                                                        }
                   2160:                                                }
                   2161:                                                if(Q0!=1){
                   2162:                                                        if(FF) FF=1;
                   2163:                                                        if(TeX) Lout=cons(["\\hspace{",Tab*(St-3)-1,"mm}\\text{"+Assume[FF]+" }",Q0/=fctr(Q0)[0][0],"\\ne0,"],
                   2164:                                                                Lout);
                   2165:                                                        else mycat([str_times(" ",St-1)+Assume[FF],Q0,"!=0,"]);
                   2166:                                                        PC*=Q0;St++;
                   2167:                                                }
                   2168:                                        }
                   2169:                                        IF=M[JJ][K]=1;
                   2170:                                        if(Mul!=1){
                   2171:                                                for(L=K+1; L<Size[1]; L++)
                   2172:                                                        M[JJ][L]=red(M[JJ][L]/Mul);
                   2173:                                                if(St){
                   2174:                                                        if(TeX)
                   2175:                                                                Lout=cons([Top+"\\xrightarrow{",Line,JJ+1,
                   2176:                                                                        "\\ \\times=\\ \\left(",red(1/Mul),"\\right)}",
                   2177:                                                                        dupmat(M)],Lout);
                   2178:                                                        else
                   2179:                                                                mycat0([Top+"line",JJ+1, " *= (",red(1/Mul), ")\n",M,"\n\n"],0);
                   2180:                                                }
                   2181:                                        }
                   2182:
                   2183:                                }
                   2184:                                for(J = (Opt>0)?0:(JJ+1); J < Size[0]; J++){
                   2185:                                        if(J == JJ)
                   2186:                                                continue;
                   2187:                                        Mul = -M[J][K];
                   2188:                                        if(Mul!=0){
                   2189:                                                if(Opt!=2)      Mul=rmul(Mul,1/M[JJ][K]);
                   2190:                                                for(I = K+1; I < Size[1]; I++)
                   2191:                                                        M[J][I] = radd(M[J][I],rmul(M[JJ][I],Mul));
                   2192:                                                M[J][K] = 0;
1.43      takayama 2193:                                                if(St&&!Main){
1.6       takayama 2194:                                                        if(Mul<0){
                   2195:                                                                Mul=-Mul;Sgn=0;
                   2196:                                                        }else   Sgn=1;
                   2197:                                                        if(TeX){
                   2198:                                                                if(Mul==1)
                   2199:                                                                        Lout=cons([Top+"\\xrightarrow{", Line,J+1,TeXs[Sgn],Line,JJ+1,
                   2200:                                                                                "}",dupmat(M)],Lout);
                   2201:                                                                else Lout=cons([Top+"\\xrightarrow{", Line,J+1,TeXs[Sgn],Line,JJ+1,
                   2202:                                                                                "\\times\\left(",Mul,"\\right)}",dupmat(M)],Lout);
                   2203:                                                        }else{
                   2204:                                                                if(Mul==1)
                   2205:                                                                        mycat0([Top+"line",J+1, Lins[Sgn],JJ+1,"\n",M,"\n\n"],0);
                   2206:                                                                else
                   2207:                                                                        mycat0([Top+"line",J+1, Lins[Sgn],JJ+1," * (",Mul,")\n",M,"\n\n"],0);
                   2208:                                                        }
                   2209:                                                }
                   2210:                                        }
                   2211:                                }
                   2212:                                JJ++;
                   2213:                        }
                   2214:                }
                   2215:        }
                   2216:        if(TeX){
                   2217:                if(TeX==-2) return Lout;
                   2218:                Lout=reverse(Lout);
                   2219:                Br="\\allowdisplaybreaks";
                   2220:                Cr="\\\\\n &";
                   2221:                if(getopt(pages)==1) Cr=Br+Cr;
                   2222:                if(type(S=getopt(cr))==7) Cr=S;
                   2223:                if(type(Lim=getopt(lim))==1){
                   2224:                        if(Lim>0){
                   2225:                                if(Lim<30) Lim=TeXLim;
                   2226:                                Lim*=2;
                   2227:                        }
                   2228:                }else Lim=0;
                   2229:                Out = ltotex(Lout|opt=["cr","spts0"],str=1,cr=Cr,lim=Lim);
                   2230:                if(TeX<0) return Out;
                   2231:                dviout(Out|eq=(str_str(Cr,Br)>=0)?6:5,keep=(TeX==1)?0:1);
                   2232:        }
                   2233:        return M;
                   2234: }
                   2235:
                   2236: def mydet2(M)
                   2237: {
                   2238:        S = size(M);
                   2239:        Det = 1;
                   2240:        MM = mtoupper(M,0);
                   2241:        for(I = 0; I < S[0]; I++)
                   2242:                Det = rmul(Det,MM[I][I]);
                   2243:        return Det;
                   2244: }
                   2245:
                   2246: def myrank(MM)
                   2247: {
                   2248:        S = size(MM);
                   2249:        M = dupmat(MM);
                   2250:        M = mtoupper(M,0);
                   2251:        C = 0;
                   2252:        for(I = K = 0; I < S[0]; I++){
                   2253:                for(J = K; J < S[1]; J++){
                   2254:                        if(M[I][J] != 0){
                   2255:                         C++; K++;
                   2256:                         break;
                   2257:                        }
                   2258:                }
                   2259:        }
                   2260:        return C;
                   2261: }
                   2262:
                   2263: def meigen(M)
                   2264: {
                   2265:        F = getopt(mult);
                   2266:        if(type(M)==4 || type(M)==5){
                   2267:                II=length(M);
                   2268:                for(R=[],I=II-1; I>=0; I--){
                   2269:                        if(F==1)
                   2270:                                R=cons(meigen(M[I]|mult=1),R);
                   2271:                        else
                   2272:                                R=cons(meigen(M[I]),R);
                   2273:                }
                   2274:                return R;
                   2275:        }
                   2276:        S = size(M)[0];
                   2277:        P = mydet2(mgen(S,0,[zz],0)-M);
                   2278:        return (F==1)?getroot(P,zz|mult=1):getroot(P,zz);
                   2279: }
                   2280:
                   2281: def transm(M)
                   2282: {
                   2283:        if(type(M)!=6) M=s2m(M);
                   2284:        if(type(M)!=6){
                   2285:                errno(0);
                   2286:                return 0;
                   2287:        }
                   2288:        L=[M];TeX="";
                   2289:        Line=["\\text{line}","\\text{col}"];
                   2290:        if((DVI=getopt(dviout)) !=1) DVI=0;
                   2291:        else dviout(M);
                   2292:        for(;;){
                   2293:                print(L0=dupmat(car(L)));
                   2294:                Sz=size(L0);
                   2295:                S=keyin("? ");
                   2296:                N=0;
                   2297:                if(str_len(S)<=1){
                   2298:                        if(S=="q") return L;
                   2299:                        if(S=="t"){
                   2300:                                N=mtranspose(L0);
                   2301:                                TeX=["\\text{transpose}"];
                   2302:                        }
                   2303:                        else if(S=="f"){
                   2304:                                if(length(L)>1){
                   2305:                                        if(LF!=0) TeX="";
                   2306:                                        L=cdr(L);LF=L0;
                   2307:                                        if(DVI){
                   2308:                                                dviout0(-1);
                   2309:                                                dviout(" ");
                   2310:                                        }
                   2311:                                }
                   2312:                        }else if(S=="g"){
                   2313:                                if(LF!=0) N=LF;
                   2314:                        }else if(S=="0"){
                   2315:                                N=M;L=[];TeX=[];
                   2316:                        }else if(S=="a"||S=="A"){
                   2317:                                if(DVI&&S=="A") mtoupper(L0,0|step=1,opt=10,dviout=1);
                   2318:                                else mtoupper(L0,0|step=1,opt=10);
                   2319:                        }else{
                   2320:                                mycat0([
                   2321:        "2,5    : line2 <-> line5",
                   2322:        "2,5,-2 ; line2 += (-2)*line5",
                   2323:        "2,2,-2 : line2 *= -2",
                   2324:        "2,5,0  : line2 += (?)*line5 for reduction",
                   2325:        "r,2,5  : raw2 <-> raw5 (r,2,5,-2  etc.)",
                   2326:        "s,x,2  : subst(*,x,2)",
                   2327:        "t      : transpose",
                   2328:        "0      : first matrix",
                   2329:        "f      : previous matrix",
                   2330:        "g      : next matrix (only after f)",
                   2331:        "A      : auto (a : without TeX)",
                   2332:        "q      : quit"
                   2333:                                ],1|delim="\n");
                   2334:                        }
                   2335:                }else{
                   2336:                        FR=0;
                   2337:                        S=evals(S|del=",");
                   2338:                        if(S[0]==r){
                   2339:                                FR=1; S=cdr(S);
                   2340:                        }
                   2341:                        if((LL=length(S))>=2){
                   2342:                                S0=S[0]-1;S1=S[1]-1;
                   2343:                                if(S[0]==s){
                   2344:                                        if(length(S)==3) N=subst(L0,S[1],S[2]);
                   2345:                                        if(DVI) TeX=[S[1],"\\mapsto",S[2]];
                   2346:                                }else if(FR==0){
                   2347:                                        if(S0<0 || S0>=Sz[0] || S1<0 || S1>=Sz[0]) continue;
                   2348:                                        if(LL==2){
                   2349:                                                N=rowx(L0,S0,S1);
                   2350:                                                if(DVI) TeX=[Line[0],S[0],"\\ \\leftrightarrow\\ ",Line[0],S[1]];
                   2351:                                        }else{
                   2352:                                                S2=S[2];
                   2353:                                                if(S0==S1){
                   2354:                                                        N=rowm(L0,S0,S2);
                   2355:                                                        if(DVI) TeX=[Line[0],S[0],"\\ \\times=\\ ",S2];
                   2356:                                                }else{
                   2357:                                                        if(S2==0){
                   2358:                                                                for(J=0;J<Sz[1] && L0[S1][J]==0;J++);
                   2359:                                                                if(J<Sz[1]) S2=-L0[S0][J]/L0[S1][J];
                   2360:                                                        }
                   2361:                                                        if(S2!=0){
                   2362:                                                                N=rowa(L0,S0,S1,S2);
                   2363:                                                                if(DVI) TeX=[Line[0],S[0],"\\ +=\\ ",Line[0],
                   2364:                                                                        S[1],"\\ \\times\\ (",S2,")"];
                   2365:                                                        }
                   2366:                                                }
                   2367:                                        }
                   2368:                                }else{
                   2369:                                        if(S0<0 || S0>=Sz[1] || S1<0 && S1>=Sz[1]) continue;
                   2370:                                        if(LL==2){
                   2371:                                                N=colx(L0,S0,S1);
                   2372:                                                if(DVI) TeX=[Line[1],S[0],"\\ \\leftrightarrow\\ ",Line[1],S[1]];
                   2373:                                        }else{
                   2374:                                                S2=S[2];
                   2375:                                                if(S0==S1){
                   2376:                                                        N=colm(L0,S0,S2);
                   2377:                                                        if(DVI) TeX=[Line[1],S[0],"\\ \\times=\\ ",S[2]];
                   2378:                                                }else{
                   2379:                                                        if(S2!=0){
                   2380:                                                                for(J=0; I1<Sz[0] && L0[I1][J]==0; J++);
                   2381:                                                                if(J<Sz[0]) S2=-L0[J][S0]/L0[J][S1];
                   2382:                                                        }if(S2!=0){
                   2383:                                                                N=cola(L0,S0,S1,S2);
                   2384:                                                                if(DVI) TeX=[Line[1],S[0],"\\ +=\\ ",Line[1],
                   2385:                                                                        S[1],"\\ \\times\\ (",S2,")"];
                   2386:                                                        }
                   2387:                                                }
                   2388:                                        }
                   2389:                                }
                   2390:                        }
                   2391:                }
                   2392:                if(N!=0){
                   2393:                        LF=0;L=cons(N,L);
                   2394:                        if(DVI) dviout("\\xrightarrow{"+ltotex(TeX|opt="spts0",str=1)+"}"+mtotex(N)|eq=8);
                   2395:                }
                   2396:        }
                   2397: }
                   2398:
                   2399: def vgen(V,W,S)
                   2400: {
                   2401:        IM=length(V);
                   2402:        I=(getopt(opt)==0)?IM:0;
                   2403:        for(SS=0; I<IM && (SS==0 || V[I]<=W[I]); I++)
                   2404:                SS += W[I];
                   2405:        if(I<IM){
                   2406:                W[I]++;
                   2407:                SS--;
                   2408:        }else
                   2409:                SS=S;
                   2410:        for(J=0;J<I;J++){
                   2411:                 W[J] = (SS<=V[J])?SS:V[J];
                   2412:                 SS -= W[J];
                   2413:        }
                   2414:        if(SS>0)
                   2415:                return -1;
                   2416:        return(I==IM)?0:I;
                   2417: }
                   2418:
                   2419: def mmc(M,X)
                   2420: {
1.81      takayama 2421:        if(getopt(full)==1){
                   2422:                M=mmc(M,X|option_list=delopt(getopt(),"full"));
                   2423:                if(type(M)<4) return -1;
                   2424:                L=length(M);
                   2425:                Mt=getopt(mult);
                   2426:                if((L>=6 && Mt!=0)||(L==3&&Mt==1)){
                   2427:                        for(SS=2,I=3; I<L; I+=(++SS));
                   2428:                        if(I==L) Mt=1;
                   2429:                        else Mt=0;
                   2430:                }
                   2431:                if(Mt!=1){
                   2432:                        for(R=[],I=S=0;I<L;I++){
                   2433:                                S=radd(S,M[I]);
                   2434:                                R=cons([[0,I+1],M[I]],R);
                   2435:                        }
                   2436:                        R=cons([[0,I+1],-S],R);
                   2437:                        return reverse(R);
                   2438:                }
                   2439:                for(R=[],I=S=0;I<SS;I++)
                   2440:                        for(J=I+1;J<=SS;J++,S++) R=cons([[I,J],M[S]],R);
                   2441:                for(I=0;I<=SS;I++){
                   2442:                        for(J=S=0;J<=SS;J++){
                   2443:                                if(I==J) continue;
                   2444:                                S=radd(S,delopt(R,(I<J)?[I,J]:[J,I]|get=1));
                   2445:                        }
                   2446:                        R=cons([[I,SS+1],-S],R);
                   2447:                }
                   2448:                return qsort(R);
                   2449:        }
                   2450:
1.6       takayama 2451:        Mt=getopt(mult);
1.50      takayama 2452:        if(type(M)==7) M=s2sp(M);
1.81      takayama 2453:        if(type(M)!=4&&type(M)!=5) return 0;
1.50      takayama 2454:        if(type(M[0])<=3){
1.81      takayama 2455:                if(type(M)==5) M=vtol(M);
1.50      takayama 2456:                for(RR=[];M!=[];M=cdr(M)) RR=cons(mat([car(M)]),RR);
                   2457:                M=reverse(RR);
                   2458:        }
1.6       takayama 2459:        if(type(M[0])!=6){                      /* spectre type -> GRS */
1.81      takayama 2460:                G=M;
1.6       takayama 2461:                L=length(G);
                   2462:                for(V=[],I=L-2;I>=0;I--) V=cons(makev([I+10]),V);
                   2463:                V=cons(makev([L+9]),V);
                   2464:                G=sp2grs(G,V,[1,length(G[0]),-1]|mat=1);
                   2465:                if(getopt(short)!=0){
                   2466:                        V=append(cdr(V),[V[0]]);
                   2467:                        G=shortv(G,V);
                   2468:                }
                   2469:                R=chkspt(G|mat=1);
                   2470:                if(Mt!=1) Mt=0;
                   2471:                if(R[2]!=2 || R[3]!=0 || !(R=getbygrs(G,1|mat=1))) return 0;
                   2472:                MZ=newmat(1,1);
1.81      takayama 2473:                SS=length(G)-1;
                   2474:                if(Mt==1) SS=SS*(SS+1)/2;
1.6       takayama 2475:                for(M=[],I=0;I<SS;I++) M=cons(MZ,M);
                   2476:                for(RR=R; RR!=[]; RR=cdr(RR)){
                   2477:                        RT=car(RR)[0];
                   2478:                        if(type(RT)==4){
                   2479:                                if(RT[0]!=0) M=mmc(M,[RT[0]]|simplify=Simp);
1.81      takayama 2480:                                for(TT=cdr(RT);TT!=[];TT=cdr(TT)){
                   2481:                                        if(car(TT)!=0){
                   2482:                                                M=mmc(cdr(M),cdr(RT));
                   2483:                                                break;
                   2484:                                        }
                   2485:                                }
1.6       takayama 2486:                        }
                   2487:                }
                   2488:        }
                   2489:        if(X==0) return M;
                   2490:        L=length(M);
                   2491:        if((L>=6 && Mt!=0)||(L==3&&Mt==1)){
                   2492:                for(SS=2,I=3; I<L; I+=(++SS));
                   2493:                if(I!=L) return -1;
                   2494:                Mt=1;
                   2495:        }else{
                   2496:                SS=L;Mt=0;
                   2497:        }
1.81      takayama 2498:        if(type(X[0])==4){
                   2499:                for(;X!=[];X=cdr(X)) M=mmc(M,car(X));
                   2500:                return M;
                   2501:        }
1.6       takayama 2502:        if(length(X)==SS+1){
1.81      takayama 2503:                if(car(X)!=0) M=mmc(M,[car(X)]|simplify=Simp);
                   2504:                return mmc(M,cdr(X));
1.6       takayama 2505:        }
                   2506:        for(I=X;I!=[];I=cdr(I)) if(I[0]!=0) break;
                   2507:        if(I==[]) return M;
                   2508:        Simp=getopt(simplify);
                   2509:        if(Simp!=0 && type(Simp)!=1) Simp=2;
                   2510:        N=newvect(L);
                   2511:        for(I=0;I<L;I++) N[I]=dupmat(M[I]);
                   2512:        S=size(N[0])[0];
1.81      takayama 2513:        if(type(X)==4&&length(X)>=SS){  /* addition */
                   2514:                for(I=0;I<SS;I++,X=cdr(X)) if(car(X) != 0) N[I] = radd(N[I],diagm(S,[car(X)]));
1.6       takayama 2515:        }
1.81      takayama 2516:        if(length(X)!=1||!X[0]) return N;
1.6       takayama 2517:        X=X[0];
                   2518:        MZ = newmat(S,S);
                   2519:        MM = newvect(L);
                   2520:        for(M1=J=0; J<SS; J++){
                   2521:                for(R=[],I=SS-1; I>=0; I--){
                   2522:                        if(I==J){
                   2523:                                for(RR=[],K=SS-1; K>=0; K--)
                   2524:                                        RR=cons((K==I)?N[K]+diagm(S,[X]):N[K],RR);
                   2525:                                R=cons(RR,R);
                   2526:                        }else R=cons([MZ],R);
                   2527:                }
                   2528:                MM[J]=newbmat(SS,SS,R);
                   2529:                if(J==0) M1=MM[0];
                   2530:                else M1=radd(M1,MM[J]);
                   2531:        }
                   2532:        /* middle convolution */
                   2533:        for(P=0,Q=1;J<L;J++){   /* A_{P,Q} */
                   2534:                for(R=[],I=SS-1; I>=0; I--){
                   2535:                        for(RR=[],K=SS-1;K>=0;K--){
                   2536:                                MT=MZ;
                   2537:                                if(I==K){
                   2538:                                        MT=N[J];
                   2539:                                        if(I==P) MT-=N[Q];
                   2540:                                        else if(I==Q) MT-=N[P];
                   2541:                                }else if(I==P && K==Q) MT=N[Q];
                   2542:                                 else if(I==Q && K==P) MT=N[P];
                   2543:                                RR=cons(MT,RR);
                   2544:                        }
                   2545:                        R=cons(RR,R);
                   2546:                }
                   2547:                MM[J]=newbmat(SS,SS,R);
                   2548:                if(++Q==SS){
                   2549:                        P++;Q=P+1;
                   2550:                }
                   2551:        }
                   2552:        for(R=[],I=SS-1; I>=0; I--){
                   2553:                for(RR=[N[I]],J=0; J<I; J++) RR=cons(MZ,RR);
                   2554:                R=cons(RR,R);
                   2555:        }
                   2556:        M0 = newbmat(SS,SS,R);
                   2557:        KE = append(mykernel(M0|opt=1),mykernel(M1|opt=1));
                   2558:        if(length(KE) == 0) return MM;
                   2559:        KK = mtoupper(lv2m(KE),0);
                   2560:        for(I=0;I<L;I++) MM[I] = mmod(MM[I],KK);
1.81      takayama 2561:        if(Simp!=0){
                   2562:                MM = mdsimplify(MM|type=Simp,show=1);
                   2563:                if(getopt(verb)) show([size(MM[0][0]),MM[1]]);
                   2564:                MM=MM[0];
                   2565:        }
1.6       takayama 2566:        return MM;
                   2567: }
                   2568:
                   2569: def lpgcd(L)
                   2570: {
                   2571:        for(F=[]; L!=[]; L=cdr(L)){
                   2572:                if((P=car(L))==0) continue;
                   2573:                        if(F==[]){
                   2574:                                F=fctr(P);
                   2575:                                S=length(F);
                   2576:                                S--;
                   2577:                                V=newvect(S);
                   2578:                                M=newvect(S);
                   2579:                                for(I=0; I<S; I++){
                   2580:                                        M[I] = F[I+1][1];
                   2581:                                        V[I] = F[I+1][0];
                   2582:                                }
                   2583:                                N=nm(ptozp(P|factor=1)[1]);
                   2584:                                continue;
                   2585:                 }
                   2586:                 N=igcd(ptozp(P|factor=1)[1],N);
                   2587:                 for(I=0; I<S; I++){
                   2588:                         for(Q=P,CT=0; CT<M[I]; CT++)
                   2589:                                 if((Q=tdiv(Q,V[I])) == 0) break;
                   2590:                         if(CT<M[I]) M[I]=CT;
                   2591:                 }
                   2592:        }
                   2593:        if(F==[]) return 0;
                   2594:        for(Q=N,I=0;I<S; I++){
                   2595:                while(M[I]>0){
                   2596:                        Q *= V[I];
                   2597:                        M[I]--;
                   2598:                }
                   2599:        }
                   2600:        return Q;
                   2601: }
                   2602:
                   2603: def mdivisor(M,X)
                   2604: {
                   2605:        S=size(M=dupmat(M));
                   2606:        XX=(type(X)==4||X==0)?X:[0,X];
                   2607:        S0=S[0]; S1=S[1];
                   2608:        if((Tr=getopt(trans))==1||Tr==2){
                   2609:                Tr0=1;
                   2610:                GR=mgen(S0,0,1,0); GC=mgen(S1,0,1,0);
                   2611:        }else Tr=Tr0=0;
                   2612:         /* 0,a,b       : (a,b)->(1,1)
                   2613:                1               : (1,1) invertible
                   2614:                2,i,M   : line 0,i by M
                   2615:                3,j,M   : col  0,j by M
                   2616:                4,j             : col  1 += col j
                   2617:                5,j,T   : line j by T
                   2618:                6,j,T   : col  1 += col j by T (non-com)
                   2619:                7,j             : line 2<->j  (non-com)
                   2620:         */
                   2621:        if(type(V=getopt(dviout))==1){
                   2622:                if(type(XX)==4 && type(XX[0])>1) Var=[XX[1],"\\partial"];
                   2623:                else    Var=0;
                   2624:                Tr=(abs(V)==3)?0:1;
                   2625:                MM=dupmat(M);
                   2626:                II=((S[0]>S[1])?S[1]:S[0])+1;
                   2627:                if(abs(V)>1){
                   2628:                        Is1=Js1=S[0]+S[1];
                   2629:                        Is=Js=[0,[Is1]];
                   2630:                }else{
                   2631:                        Is=[0,[Is1=S[0]]];Js=[0,[Js1=S[1]]];
                   2632:                }
                   2633:                VV=V;
                   2634:                V=newvect(II);
                   2635:                for(I=0;I<II;I++) V[I]=[];
                   2636:                N=newbmat(2,2,[[M,mgen(S[0],0,[1],0)],[mgen(S[1],0,[1],0)]]);
                   2637:                mdivisor(M,X|step=1,dviout=V);
                   2638:                L=S[0]+S[1];
                   2639:                if(Tr){
                   2640:                        NN=mperm(N,Is1,Js1);
                   2641:                        for(K=S[0];K<Is1;K++){
                   2642:                                for(L=S[1];L<Js1;L++)
                   2643:                                        NN[K][L]=" ";
                   2644:                        }
                   2645:                        Out=[[mperm(NN,Is,Js)]];
                   2646:                }
                   2647:                for(I=1;I<II;I++){
                   2648:                        I0=I-1;
                   2649:                        if(V[I]==[]) continue;
                   2650:                        for(T=reverse(V[I]);T!=[];T=cdr(T)){
                   2651:                                St=[];
                   2652:                                C=car(R=car(T));
                   2653:                                if(C==0){
                   2654:                                        N=mperm(N,(R[1]==0)?0:[[R[1]+I0,I0]],(R[2]==0)?0:[[R[2]+I0,I0]]);
                   2655:
                   2656:                                        if(Tr){
                   2657:                                                if(R[2]!=0) St=append(["C",I,"\\leftrightarrow C",R[2]+I],St);
                   2658:                                                if(R[1]!=0){
                   2659:                                                        if(R[2]!=0) St=cons(",\\ ",St);
                   2660:                                                        St=append(["L",I,"\\leftrightarrow L",R[1]+I],St);
                   2661:                                                }
                   2662:                                                Out=cons(St,Out);
                   2663:                                        }
                   2664:                                }else if(C==1){
                   2665:                                        P=1/N[I0][I0];N[I0][I0]=1;
                   2666:                                        if(P!=1){
                   2667:                                                for(J=I;J<L;J++)
                   2668:                                                        N[I0][J]=muldo(P,N[I0][J],XX);
                   2669:
                   2670:                                                if(Tr){
                   2671:                                                        St=append(["L",I,"\\leftarrow(",P,")","\\times L",I],St);
                   2672:                                                        Out=cons(St,Out);
                   2673:                                                        NN=mperm(N,Is1,Js1);
                   2674:                                                        for(K=S[0];K<Is1;K++){
                   2675:                                                                for(L=S[1];L<Js1;L++)
                   2676:                                                                        NN[K][L]=" ";
                   2677:                                                        }
                   2678:                                                        Out=cons(["\\to",mperm(NN,Is,Js)],Out);
                   2679:                                                }
                   2680:                                        }
                   2681:                                        for(F=0,J=I;J<S[0];J++){
                   2682:                                                if((P=N[J][I0])==0) continue;
                   2683:                                                F++;
                   2684:                                                N[J][I0]=0;
                   2685:                                                for(K=I;K<L;K++)
                   2686:                                                        N[J][K]=red(N[J][K]-muldo(P,N[I0][K],XX));
                   2687:
                   2688:                                        }
                   2689:                                        if(F){
                   2690:                                                if(Tr){
                   2691:                                                        Out=cons(["Li\\ -\\!=\\ \\circ\\times L",I,"\\quad(i>",I,")"],Out);
                   2692:                                                        NN=mperm(N,Is1,Js1);
                   2693:                                                        for(K=S[0];K<Is1;K++){
                   2694:                                                                for(L=S[1];L<Js1;L++)
                   2695:                                                                        NN[K][L]=" ";
                   2696:                                                        }
                   2697:                                                        Out=cons(["\\to",mperm(NN,Is,Js)],Out);
                   2698:                                                }
                   2699:                                        }
                   2700:                                        for(F=0,J=I;J<S[1];J++){
                   2701:                                                if((P=N[I0][J])==0) continue;
                   2702:                                                F++;
                   2703:                                                N[I0][J]=0;
                   2704:                                                for(K=I;K<L;K++)
                   2705:                                                        N[K][J]=red(N[K][J]-muldo(N[K][I0],P,XX));
                   2706:                                        }
                   2707:                                        if(F&&Tr) Out=cons(["Cj\\ -\\!=\\ C",I,"\\times\\circ\\quad(j>",I,")"],Out);
                   2708:                                        else continue;
                   2709:                                }else if(C==2){
                   2710:                                        C=mat(N[I0],N[R[1]+I0]);C=muldo(R[2],C,XX);
                   2711:                                        for(J=0;J<L;J++){
                   2712:                                                N[I0][J]=C[0][J];N[R[1]+I0][J]=C[1][J];
                   2713:                                        }
                   2714:                                        if(Tr) Out=cons([dupmat(R[2]),"\\begin{pmatrix}L",I,"\\\\L",R[1]+I,
                   2715:                                                "\\end{pmatrix}"],Out);
                   2716:                                }else if(C==3){
                   2717:                                        C=newmat(L,2);
                   2718:                                        for(J=0;J<L;J++){
                   2719:                                                C[J][0]=N[J][I0];C[J][1]=N[J][R[1]+I0];
                   2720:                                        }
                   2721:                                        C=muldo(C,R[2],XX);
                   2722:                                        for(J=0;J<L;J++){
                   2723:                                                N[J][I0]=C[J][0];N[J][R[1]+I0]=C[J][1];
                   2724:                                        }
                   2725:                                        if(Tr) Out=cons(["\\begin{pmatrix}C",I,"&C",R[1]+I,"\\end{pmatrix}",
                   2726:                                                dupmat(R[2])],Out);
                   2727:                                }else if(C==4){
                   2728:                                        for(J=0;J<L;J++)
                   2729:                                                N[J][I0]=red(N[J][I0]+N[J][R[1]+I0]);
                   2730:                                        if(Tr) Out=cons(["C",I,"\\ +\\!=\\ C",R[1]+I],Out);
                   2731:                                }else if(C==5){
                   2732:                                        for(J=0;J<L;J++)
                   2733:                                                N[I0+R[1]][J]=red(R[2]*N[I0+R[1]][J]);
                   2734:                                        if(Tr) Out=cons(["L",I+R[1],"\\leftarrow(", R[2],")\\times L",I+R[1]],
                   2735:                                                Out);
                   2736:                                }else if(C==6){
                   2737:                                        for(J=0;J<L;J++)
                   2738:                                                N[J][I0]=N[J][I0]+muldo(N[J][I0+R[1]],R[2],XX);
                   2739:                                        if(Tr) Out=cons(["C",I,"\\ +\\!=\\ C",I+R[1],"\\times(", R[2],")"],
                   2740:                                                Out);
                   2741:                                }else if(C==7){
                   2742:                                        mycat(["line",I+1,"\\leftrightarrow",R[1]+I]);
                   2743:                                        for(J=0;J<L;J++){
                   2744:                                                C=N[I][J];N[I][J]=N[R[1]+I0][J];N[R[1]+I0][J]=C;
                   2745:                                        }
                   2746:                                        if(Tr) Out=cons(["L",I+1,"\\leftrightarrow L",R[1]+I],Out);
                   2747:                                }
                   2748:                                if(Tr){
                   2749:                                        NN=mperm(N,Is,Js);
                   2750:                                        for(K=S[0];K<Is1;K++){
                   2751:                                                for(L=S[1];L<Js1;L++)
                   2752:                                                        NN[K][L]=" ";
                   2753:                                        }
                   2754:                                        Out=cons(["\\to",NN],Out);
                   2755:                                }
                   2756:                        }
                   2757:                }
                   2758:                if(!Tr){
                   2759:                        NN=mperm(N,Is,Js);
                   2760:                        Out=[];
                   2761:                }
                   2762:                if(S[0]+S[1]==Is1){
                   2763:                        N1=mperm(NN,[0,[S[0]]],[S[1],[S[0]]]);
                   2764:                        N2=mperm(NN,[S[0],[S[1]]],[0,[S[1]]]);
                   2765:                        N3=mperm(NN,[0,[S[0]]],[0,[S[1]]]);
                   2766:                        R1=mdivisor(N1,X|trans=1)[1];
                   2767:                        R2=mdivisor(N2,X|trans=1)[1];
                   2768:                        if(Tr){
                   2769:                                Out=cons(["\\text{As a result,}"],Out);
                   2770:                                Out=cons([N3,"=",N1,MM,N2],Out);
                   2771:                                if(S[0]==S[1] && N3==mgen(S[0],0,1,0)){
                   2772:                                        Out=cons(["=",muldo(N2,N1,XX),MM,"."],Out);
                   2773:                                }else{
                   2774:                                        Out=cons([N1,"^{-1}=",R1,","],Out);
                   2775:                                        Out=cons([N2,"^{-1}=",R2,"."],Out);
                   2776:                                }
                   2777:                        }else{
                   2778:                                Out=cons([N3,"=P",MM,"Q,"],Out);
                   2779:                                Out=cons(["P=",N1,"=",R1,"^{-1},"],Out);
                   2780:                                Out=cons(["Q=",N2,"=",R2,"^{-1}."],Out);
                   2781:                        }
                   2782:                }
                   2783:                Out = ltotex(reverse(Out)|opt=["cr","spts0"],str=1,cr=15,var=Var);
                   2784:                if(S[0]+S[1]==Is1)
                   2785:                        Out=str_subst(Out,"\\texttt{ }","");
                   2786:                if(VV>0){
                   2787:                        dviout(Out|eq=6);
                   2788:                        return NN;
                   2789:                }
                   2790:                return Out;
                   2791:        }else if(type(V)!=5) V=0;
                   2792:
                   2793:        if(type(St=getopt(step))!=1) St=0;
                   2794:        for(FF=": start";;){
                   2795:                if(St && V==0){
                   2796:                        if(Tr){
                   2797:                                mycat0([St,FF,"\n"],0);
                   2798:                                mycat([GR,"\n"]);mycat([M,"\n"]);mycat([GC,"\n"]);
                   2799:                        }
                   2800:                        else    mycat0([St,FF,"\n",M,"\n"],0);
                   2801:                }
                   2802:                if(X==0||X==[0,0]){ /* search minimal non-zero element */
                   2803:                        for(K=F=I=0; I<S0; I++){
                   2804:                                for(J=0; J<S1; J++){
                   2805:                                        if((P=abs(M[I][J]))!=0 && (K>P || K==0)){
                   2806:                                                K=P; R=[I,J];
                   2807:                                        }
                   2808:                                }
                   2809:                        }
                   2810:                        R=cons(K-1,[R]);
                   2811:                }
                   2812:                else R=mymindeg(M,XX[1]|opt=1);
                   2813:                if(R[0]<0){             /*zero matrix */
                   2814:                        if(Tr) return [[],mgen(S0,0,1,0),mgen(S1,0,1,0)];
                   2815:                        return [];
                   2816:                }
                   2817:                R0=R[1][0];R1=R[1][1];
                   2818:                if(R0!=0){
                   2819:                        M=rowx(M,0,R0);
                   2820:                        if(Tr) GR=rowx(GR,0,R0);
                   2821:                }
                   2822:                if(R1!=0){
                   2823:                        M=colx(M,0,R1);
                   2824:                        if(Tr) GC=colx(GC,0,R1);
                   2825:                }
                   2826:                if(St>0 && (R0!=0 || R1!=0))
                   2827:                        if(type(V)==5) V[St]=cons([0,R0,R1],V[St]);
                   2828:                        else if(Tr){
                   2829:                                mycat0([St,": (",R0+1,",",R1+1,") -> (1,1)\n"],0);
                   2830:                                mycat([GR,"\n"]);mycat([M,"\n"]);mycat([GC,"\n"]);
                   2831:                        }else mycat0([St,": (",R0+1,",",R1+1,") -> (1,1)\n",M,"\n"],0);
                   2832:                if(R[0]==0){            /* (1,1) : invertible */
                   2833:                        if(type(V)==5) V[St]=cons([1],V[St]);
                   2834:                        P=M[0][0]; M[0][0]=1;
                   2835:                        for(J=0;J<S1;J++){      /* (1,1) -> 1 */
                   2836:                                if(J>0) M[0][J]= red(M[0][J]/P);
                   2837:                                if(Tr) GR[0][J]=red(GR[0][J]/P);
                   2838:                        }
                   2839:                        if(S0>1 && S1>1) N=newmat(S0-1,S1-1);
                   2840:                        else N=0;
                   2841:                        for(I=1;I<S0;I++){
                   2842:                                P=M[I][0]; M[I][0]=0;
                   2843:                                for(J=1;J<S1;J++)
                   2844:                                        N[I-1][J-1]=M[I][J]=red(M[I][J] - muldo(P,M[0][J],XX));
                   2845:                                if(Tr){
                   2846:                                        for(J=0;J<S0;J++)
                   2847:                                                GR[I][J] = red(GR[I][J] -muldo(P,GR[0][J],XX));
                   2848:                                }
                   2849:                        }
                   2850:                        if(Tr){
                   2851:                                for(J=1;J<S1; J++){
                   2852:                                        for(I=0;I<S1;I++) GC[I][J]=red(GC[I][J]-muldo(GC[I][0],M[0][J],XX));
                   2853:                                        M[0][J]=0;
                   2854:                                }
                   2855:                        }
                   2856:                        if(St>0 && V==0){
                   2857:                                if(Tr){
                   2858:                                        mycat0([St,": unit\n"],0);
                   2859:                                        mycat([GR,"\n"]);mycat([M,"\n"]);mycat([GC,"\n"]);
                   2860:                                }
                   2861:                                else mycat0([St,": unit\n",M,"\n"],0);
                   2862:                        }
                   2863:                        if(N==0){
                   2864:                                if(!Tr) return [1];
                   2865:                                if(Tr==2){
                   2866:                                        GR0=mdivisor(GR,X|trans=1)[1];
                   2867:                                        GC0=mdivisor(GC,X|trans=1)[1];
                   2868:                                        return [[1],GR,GC,GR0,GC0];
                   2869:                                }
                   2870:                                return [[1],GR,GC];
                   2871:                        }
                   2872:                        R=mdivisor(N,XX|dviout=V,trans=Tr0,step=(St>0)?St+1:St);
                   2873:                        if(!Tr) return cons(1,R);
                   2874:                        GR=muldo(newbmat(2,2,[[1],[0,R[1]]]),GR,XX);
                   2875:                        GC=muldo(GC,newbmat(2,2,[[1],[0,R[2]]]),XX);
                   2876:                        if(S0==S1 && countin(1,1,R[0])==S0-1){
                   2877:                                GR=muldo(GC,GR,XX); GC=mgen(S0,0,1,0);
                   2878:                        }
                   2879:                        if(Tr==2){
                   2880:                                GR0=mdivisor(GR,X|trans=1)[1];
                   2881:                                GC0=mdivisor(GC,X|trans=1)[1];
                   2882:                                return [cons(1,R[0]),GR,GC,GR0,GC0];
                   2883:                        }
                   2884:                        return [cons(1,R[0]),GR,GC];
                   2885:                }
                   2886:                for(I=1;I<S0;I++){
                   2887:                        if(M[I][0]!=0){
                   2888: /* Error! when mygcd(A,B,0) with A<=0 or B<=0 */
                   2889:                                R=mygcd(M[I][0],M[0][0],XX);    /* R[0]=R[1]*M[I][0]+R[2]*M[0][0] */
                   2890:                                M[0][0]=R[0]; M[I][0]=0;        /*    0=R[3]*M[I][0]+R[4]*M[0][0] */
                   2891:                                for(J=1;J<S1;J++){
                   2892:                                        T=red(muldo(R[1],M[I][J],XX)+muldo(R[2],M[0][J],XX));
                   2893:                                        M[I][J]=red(muldo(R[3],M[I][J],XX)+muldo(R[4],M[0][J],XX));
                   2894:                                        M[0][J]=T;
                   2895:                                }
                   2896:                                if(Tr){
                   2897:                                        for(J=0;J<S0;J++){
                   2898:                                                T=red(muldo(R[1],GR[I][J],XX)+muldo(R[2],GR[0][J],XX));
                   2899:                                                GR[I][J]=red(muldo(R[3],GR[I][J],XX)+muldo(R[4],GR[0][J],XX));
                   2900:                                                GR[0][J]=T;
                   2901:                                        }
                   2902:                                }
                   2903:                                if(St && V==0){
                   2904:                                        mycat([" [",R[2],R[1],"]*"]);
                   2905:                                        mycat([" [",R[4],R[3],"]"]);
                   2906:                                }
                   2907:                                if(type(V)==5) V[St]=cons([2,I,mat([R[2],R[1]],[R[4],R[3]])],V[St]);
                   2908:                                FF=": line 1 & "+rtostr(I+1); I=S0;
                   2909:                        }
                   2910:                }
                   2911:                if(I>S0) continue;
                   2912:                for(J=1;J<S1;J++){
                   2913:                        if(M[0][J]!=0){
                   2914:                                R=mygcd(M[0][J],M[0][0],XX|rev=1); /* R[0]=M[0][J]*R[1]+M[0][0]*R[2] */
                   2915:                                M[0][0]=R[0]; M[0][J]=0;                 /*    0=M[0][J]*R[3]+M[0][0]*R[4] */
                   2916:                                for(I=1;I<S0;I++){
                   2917:                                        T=red(muldo(M[I][J],R[1],XX)+muldo(M[I][0],R[2],XX));
                   2918:                                        M[I][J]=red(muldo(M[I][J],R[3],XX)+muldo(M[I][0],R[4],XX));
                   2919:                                        M[I][0]=T;
                   2920:                                }
                   2921:                                if(Tr){
                   2922:                                        for(I=0;I<S1;I++){
                   2923:                                                T=red(muldo(GC[I][J],R[1],XX)+muldo(GC[I][0],R[2],XX));
                   2924:                                                GC[I][J]=red(muldo(GC[I][J],R[3],XX)+muldo(GC[I][0],R[4],XX));
                   2925:                                                GC[I][0]=T;
                   2926:                                        }
                   2927:                                }
                   2928:                                if(type(V)==5) V[St]=cons([3,J,mat([R[2],R[4]],[R[1],R[3]])],V[St]);
                   2929:                                FF=": column 1 & "+rtostr(J+1);J=S1;
                   2930:                                if(St && V==0){
                   2931:                                        mycat([" *[",R[2],R[4],"]"]);
                   2932:                                        mycat(["  [",R[1],R[3],"]"]);
                   2933:                                }
                   2934:                        }
                   2935:                }
                   2936:                if(J>S1) continue;
                   2937:                if(S0==1 || S1==1){
                   2938:                        P=M[0][0];
                   2939:                        if(X==0){
                   2940:                                if(P<0){
                   2941:                                        P=-P;
                   2942:                                        if(Tr) for(J=0;J<S0;J++) GR[0][J]=-GR[0][J];
                   2943:                                        if(type(V)==5) V[St]=cons([5,0,-1],V[St]);
                   2944:                                }
                   2945:                        }else{
                   2946:                                P=nm(P);
                   2947:                                if((R=fctr(P)[0][0])!=1){
                   2948:                                        P/=R;
                   2949:                                        if(Tr) for(J=0;J<S0;J++) GR[0][J]/=R;
                   2950:                                        if(type(V)==5) V[St]=cons([5,0,1/R],V[St]);
                   2951:                                }
                   2952:                        }
                   2953:                        if(!Tr) return [P];
                   2954:                        if(Tr==2){
                   2955:                                GR0=mdivisor(GR,X|trans=1)[1];
                   2956:                                GC0=mdivisor(GC,X|trans=1)[1];
                   2957:                                return [[P],GR,GC,GR0,GC0];
                   2958:                        }
                   2959:                        return [[P],GR,GC];
                   2960:                }
                   2961:                if(XX==0 || (type(XX)==4 && XX[0]==0)){                 /* commutative case */
                   2962:                        P=M[0][0];
                   2963:                        for(I=1; I<S0; I++){
                   2964:                                for(J=1; J<S1; J++)
                   2965:                                        if(divdo(M[I][J],P,XX)[1]!=0) break;
                   2966:                                if(J<S1){
                   2967:                                        if(type(V)==5) V[St]=cons([4,J],V[St]);
                   2968:                                        FF=": column 1 += col"+rtostr(J+1);
                   2969:                                        for(I=1;I<S0;I++) M[I][0]=M[I][J];
                   2970:                                        if(Tr) for(I=0;I<S1;I++) GC[I][0]=red(GC[I][0]+GC[I][J]);
                   2971:                                        break;
                   2972:                                }
                   2973:                        }
                   2974:                        if(J<S1) continue;
                   2975:                        N=newmat(S0-1,S1-1);
                   2976:                        for(I=1;I<S0;I++)
                   2977:                                for(J=1;J<S1;J++) N[I-1][J-1]=red(M[I][J]/P);
                   2978:                        if(X==0){
                   2979:                                if(P<0) P=-P;
                   2980:                                if(Tr) for(J=0;J<S0;J++) GR[0][J]=-GR[0][J];
                   2981:                        }else{
                   2982:                                P=M[0][0];
                   2983:                                P=nm(P);
                   2984:                                P/=fctr(P)[0][0];
                   2985:                                if(Tr) for(J=0;J<S0;J++) GR[0][J]/=fctr(P)[0][0];
                   2986:                        }
                   2987:                        R=mdivisor(N,XX|dviout=V,trans=Tr0,step=(St>0)?St+1:St);
                   2988:                        RT=(Tr)?R[0]:R;
                   2989:                        for(RR=[],L=reverse(RT);L!=[];L=cdr(L))
                   2990:                                RR=cons(red(P*car(L)),RR);
                   2991:                        RR=cons(P,RR);
                   2992:                        if(!Tr) return RR;
                   2993:                        GR=muldo(newbmat(2,2,[[1],[0,R[1]]]),GR,XX);
                   2994:                        GC=muldo(GC,newbmat(2,2,[[1],[0,R[2]]]),XX);
                   2995:                        if(S0==S1 && countin(1,1,RR)==S0){
                   2996:                                GR=muldo(GC,GR,XX); GC=mgen(S0,0,1,0);
                   2997:                        }
                   2998:                        if(Tr==2){
                   2999:                                GR0=mdivisor(GR,X|trans=1)[1];
                   3000:                                GC0=mdivisor(GC,X|trans=1)[1];
                   3001:                                return [RR,GR,GC,GR0,GC0];
                   3002:                        }
                   3003:                        return [RR,GR,GC];
                   3004:                }  /* End of commutative case */
                   3005:                for(I=1; I<S0; I++){
                   3006:                        for(J=1; J<S1; J++){
                   3007:                                if(M[I][J] != 0){
                   3008:                                        for(T=1;I<S0;T*=XX[0]){
                   3009:                                                R=divdo(muldo(M[I][J],T,XX),M[0][0],XX);
                   3010:                                                if(R[1]!=0){
                   3011:                                                        if(type(V)==5) V[St]=cons([6,J,T],V[St]);
                   3012:                                                        FF=": column 1 += col"+rtostr((J+1)*T);
                   3013:                                                        if(I>1){
                   3014:                                                                M=rowx(M,1,I);
                   3015:                                                                if(Tr) GR=rowx(GR,1,I);
                   3016:                                                                if(type(V)==5) V[St]=cons([7,I],V[St]);
                   3017:                                                                FF+=", line 2<->"+rtostr(I+1);
                   3018:                                                        }
                   3019:                                                        for(I=1;I<S0;I++)   M[I][0]=muldo(M[I][J],T,XX);
                   3020:                                                        if(Tr)
                   3021:                                                                for(I=1;I<S1;I++) GC[I][0]=red(GC[I][0]+muldo(GC[I][J],T,XX));
                   3022:                                                        I=S0+1; J=S1;
                   3023:                                                        break;
                   3024:                                                }
                   3025:                                        }
                   3026:                                }
                   3027:                        }
                   3028:                        if(I>S0) break;
                   3029:                }
                   3030:                if(I==S0) return [];  /* zero matrix : never happen */
                   3031:        }
                   3032: }
                   3033:
                   3034: def mdsimplify(L)
                   3035: {
                   3036:        T=getopt(type);
                   3037:        SS=0;
                   3038:        if(type(L)==6){
                   3039:                L=[L]; SS=1;
                   3040:        }
                   3041:        if(type(L)==5){
                   3042:                SS=2;
                   3043:                L = vtol(L);
                   3044:        }
                   3045:        M=car(L);
                   3046:        S=size(M)[0];
                   3047: #if 0
                   3048:        MN=newmat(S,S);
                   3049:        MD=newmat(S,S);
                   3050:        for(I=0;I<S;I++){
                   3051:                for(J=0;J<S;J++){
                   3052:                        TN=0;TD=1;
                   3053:                        for(PL=L;PL!=[];PL=cdr(PL)){
                   3054:                                TM=red(car(PL)[I][J]);
                   3055:                                TN=lgcd([TN,nm(TM)]|pol=1);
                   3056:                                TD=llcm([TD,dn(TM)]|pol=1);
                   3057:                        }
                   3058:                        MN[I][J]=TM;
                   3059:                        MD[I][J]=TN;
                   3060:                }
                   3061:        }
                   3062:        for(I=0;I<S;I++){
                   3063:                for(J=0;J<S;J++){
                   3064:                        if(I==J||type(TD[I][J])<2||type(TN[J][I])<2) continue;
                   3065:                        for(FC=cdr(fctr(TD[I][J]));FC!=[];){
                   3066:                                TFC=car(FC);
                   3067:                                if(type(red(TN[J][I]/TFC[0]))>2) continue;
                   3068:                        }
                   3069:                }
                   3070:        }
                   3071: #endif
                   3072:        DD=newvect(S);
                   3073:        for(I=0; I<S; I++){
                   3074:                LN=RN=[];
                   3075:                LD=RD=1;
                   3076:                for(LL=L; LL!=[]; LL=cdr(LL)){
                   3077:                        M = car(LL);
                   3078:                        for(J=0; J<S; J++){
                   3079:                                if(J==I) continue;
                   3080:                                if((MM=M[I][J]) != 0){
                   3081:                                        LN = cons(nm(MM),LN);
                   3082:                                        if(type(MM)==3 && tdiv(LD,P=dn(MM))==0)
                   3083:                                                LD=tdiv(LD*P,gcd(LD,P));
                   3084:                                }
                   3085:                                if((MM=M[J][I]) != 0){
                   3086:                                        RN = cons(nm(MM),RN);
                   3087:                                        if(type(MM)==3 && tdiv(RD,P=dn(MM))==0)
                   3088:                                                RD=tdiv(RD*P,gcd(RD,P));
                   3089:                                }
                   3090:                        }
                   3091:                }
                   3092:                if(T==1 || T==3) LQ=RD;
                   3093:                else{
                   3094:                        P=lpgcd(LN);
                   3095:                        LQ=gcd(P,RD);
                   3096:                        if(P!=0) LQ *= nm(fctr(P)[0][0]);
                   3097:                }
                   3098:                if(T==1 || T==2) RQ=LD;
                   3099:                else{
                   3100:                        P=lpgcd(RN);
                   3101:                        RQ=gcd(P,LD);
                   3102:                        if(P!=0) RQ *= nm(fctr(P)[0][0]);
                   3103:                }
                   3104:                if((P=gcdz(LQ,RQ))!=1){
                   3105:                        LQ = red(LQ/P); RQ=red(RQ/P);
                   3106:                }
                   3107:                DD[I]=red(LQ/RQ);
                   3108:                if(LQ!=1 || RQ!=1){
                   3109:                        for(LA=[],LL=L; LL!=[]; LL=cdr(LL)){
                   3110:                                M = car(LL);
                   3111:                                for(J=0; J<S; J++){
                   3112:                                        if(I!=J){
                   3113:                                                if(LQ!=1){
                   3114:                                                        M[I][J] = red(M[I][J]/LQ);
                   3115:                                                        M[J][I] = red(M[J][I]*LQ);
                   3116:                                                }
                   3117:                                                if(RQ!=1){
                   3118:                                                        M[J][I] = red(M[J][I]/RQ);
                   3119:                                                        M[I][J] = red(M[I][J]*RQ);
                   3120:                                                }
                   3121:                                        }
                   3122:                                }
                   3123:                        }
                   3124:                }
                   3125:        }
                   3126:        if(SS==2) L=ltov(L);
                   3127:        if(SS==1) L=L[0];
                   3128:        if(getopt(show)==1) L=[L,DD];
                   3129:        return L;
                   3130: }
                   3131:
1.81      takayama 3132: #if 1
1.6       takayama 3133: def m2mc(M,X)
                   3134: {
                   3135:        if(type(M)<2){
                   3136:        mycat([
                   3137: "m2mc(m,t) or m2mc(m,[t,s])\t Calculation of Pfaff system of two variables\n",
                   3138: " m : list of 5 residue mat. or GRS/spc for rigid 4 singular points\n",
                   3139: " t : [a0,ay,a1,c], swap, GRS, GRSC, sp, irreducible, pair, pairs, Pfaff, All\n",
                   3140: " s : TeX, dviout, GRSC\n",
                   3141: " option : swap, small, simplify, operator, int\n",
                   3142: " Ex: m2mc(\"21,21,21,21\",\"All\")\n"
                   3143: ]);
                   3144:                return 0;
                   3145:        }
                   3146:        if(type(M)==7) M=s2sp(M);
                   3147:        if(type(X)==7) X=[X];
                   3148:        Simp=getopt(simplify);
                   3149:        if(Simp!=0 && type(Simp)!=1) Simp=2;
                   3150:        Small=(getopt(small)==1)?1:0;
                   3151:        if(type(M[0])==4){
                   3152:                if(type(M[0][0])==1){ /* spectral type */
                   3153:                        XX=getopt(dep);
                   3154:                        if(type(XX)!=4 || type(XX[0])>1) XX=[1,length(M[0])];
                   3155:                        M=sp2grs(M,[d,a,b,c],[XX[0],XX[1],-2]|mat=1);
                   3156:                        if(XX[0]>1 && XX[1]<2) XX=[XX[0],2];
                   3157:                        if(getopt(int)!=0){
                   3158:                                T=M[XX[0]-1][XX[1]-1][1];
                   3159:                                for(V=vars(T);V!=[];V=cdr(V)){
                   3160:                                        F=coef(T,1,car(V));
                   3161:                                        if(type(F)==1 && dn(F)>1)
                   3162:                                         M = subst(M,car(V),dn(F)*car(V));
                   3163:                                }
                   3164:                        }
                   3165:                        V=vars(M);
                   3166:                        if(findin(d1,V)>=0 && findin(d2,V)<0 && findin(d3,V)<0)
                   3167:                                M=subst(M,d1,d);
                   3168:                }
                   3169:                RC=chkspt(M|mat=1);
                   3170:                if(RC[2] != 2 || RC[3] != 0){ /* rigidity idx and Fuchs cond */
                   3171:                        erno(0);return 0;
                   3172:                }
                   3173:                R=getbygrs(M,1|mat=1);
                   3174:                if(getopt(anal)==1) return R;   /* called by mc2grs() */
                   3175:                Z=newmat(1,1,[[0]]);
                   3176:                N=[Z,Z,Z,Z,Z];
                   3177:                for(RR=R; RR!=[]; RR=cdr(RR)){
                   3178:                        RT=car(RR)[0];
                   3179:                        if(type(RT)==4){
                   3180:                                if(RT[0]!=0) N=m2mc(N,RT[0]|simplify=Simp);
                   3181:                                N=m2mc(N,[RT[1],RT[2],RT[3]]|simplify=Simp);
                   3182:                        }
                   3183:                }
                   3184:                if(type(X)==4 && type(X[0])==7)
                   3185:                        return m2mc(N,X|keep=Keep,small=Small);
                   3186:                return N;
                   3187:        }
                   3188:        if(type(X)==4 && type(X[0])==7){
                   3189:                Keep=(getopt(keep)==1)?1:0;
                   3190:                if(X[0]=="All"){
                   3191:                        dviout("Riemann scheme"|keep=1);
                   3192:                        m2mc(M,[(findin("GRSC",X)>=0)?"GRSC":"GRS","dviout"]|keep=1);
                   3193:                        dviout("Spectral types : "|keep=1);
                   3194:                        m2mc(M,["sp","dviout"]|keep=1);
                   3195:                        dviout("\\\\\nBy the decompositions"|keep=1);
                   3196:                        R=m2mc(M,["pairs","dviout"]|keep=1);
                   3197:                        for(R0=R1=[],I=1; R!=[]; I++, R=cdr(R)){
                   3198:                                for(S=0,RR=car(R)[1][0];RR!=[]; RR=cdr(RR)) S+=RR[0];
                   3199:                                if(S==0) R0=cons(I,R0);
                   3200:                                else if(S<0) R1=cons(I,R1);
                   3201:                        }
                   3202:                        S="irreducibility\\ $"+((length(R0)==0)?"\\Leftrightarrow":"\\Leftarrow")
                   3203:                                +"\\ \\emptyset=\\mathbb Z\\cap$";
                   3204:                        dviout(S|keep=1);
                   3205:                        m2mc(M,["irreducible","dviout"]|keep=1);
                   3206:                        if(R0!=[])
                   3207:                                dviout(ltotex(reverse(R0))|eq=0,keep=1,
                   3208:                                 title="The following conditions may not be necessary for the irreducibility.");
                   3209:                        if(R1!=[])
                   3210:                                dviout(ltotex(reverse(R1))|eq=0,keep=1,title="The following conditions can be omitted.");
                   3211:                        if(getopt(operator)!=0){
                   3212:                                dviout("The equation in a Pfaff form is"|keep=1);
                   3213:                                m2mc(M,["Pfaff","dviout"]|keep=Keep,small=Small);
                   3214:                        }
                   3215:                        else if(Keep!=1) dviout(" ");
                   3216:                        return M;
                   3217:                }
                   3218:                Show=0;
                   3219:                if(length(X)>1){
                   3220:                        if(X[1]=="dviout") Show=2;
                   3221:                        if(X[1]=="TeX") Show=1;
                   3222:                }
1.81      takayama 3223:                if(X[0]=="GRS"||X[0]=="GRSC"||X[0]=="sp"||X[0]=="extend"){
1.6       takayama 3224:                        Y=radd(-M[0],-M[1]-M[2]);
1.81      takayama 3225:                        if(X[0]=="extend")
                   3226:                                return [M[1],M[0],M[2],Y, M[3],M[4],radd(-M[1],-M[3]-M[4]),
                   3227:                                        radd(Y,-M[3]-M[4]),radd(M[1],M[2]+M[4]), radd(M[0],M[1]+M[3])];
1.6       takayama 3228:                        if(X[0]!="GRSC"){
                   3229:                                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);
                   3230:                                if(X[0]=="sp"){
                   3231:                                        L=chkspt(L|opt="sp");
                   3232:                                        V=[L[1],L[0],L[2],L[5]]; W=[L[1],L[3],L[4],L[6]];
                   3233:                                        if(Show==2) dviout(s2sp(V)+" : "+s2sp(W)|keep=Keep);
                   3234:                                        return [V,W];
                   3235:                                }
                   3236:                                S="x=0&x=y&x=1&y=0&y=1&x=\\infty&y=\\infty&x=y=\\infty\\\\\n";
                   3237:                        }else{
                   3238:                                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]),
                   3239:                                        radd(M[0],M[1]+M[3]),radd(M[1],M[2]+M[4])]|mult=1);
                   3240:                                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";
                   3241:                        }
                   3242:                        T=ltotex(L|opt="GRS",pre=S,small=Small);
                   3243:                        if(Show==2) dviout(T|eq=0,keep=Keep);
                   3244:                        if(Show==1) L=T;
                   3245:                        return L;
                   3246:                }
                   3247:                if(X[0]=="Pfaff"){
                   3248:                        S=ltotex(M|opt=["Pfaff",u,x,x-y,x-1,y,y-1],small=Small);
                   3249:                        if(Show==2) dviout(S|eq=0,keep=Keep);
                   3250:                        return S;
                   3251:                }
                   3252:                if(X[0]=="irreducible"){
                   3253:                        L=meigen([M[0],M[1],M[2],radd(-M[0],-M[1]-M[2])]|mult=1);
                   3254:                        S=getbygrs(L,10|mat=1);
                   3255:                        if(Show==2) dviout(ltotex(S)|eq=0,keep=Keep);
                   3256:                        return S;
                   3257:                }
                   3258:                if(X[0]=="pairs"||X[0]=="pair"){
                   3259:                        L=meigen([M[0],M[1],M[2],radd(-M[0],-M[1]-M[2])]|mult=1);
                   3260:                        S=chkspt(L|opt=0);
                   3261:                        V=(Show==2)?1:0;
                   3262:                        S=sproot(L,X[0]|dviout=V,keep=Keep);
                   3263:                        return S;
                   3264:                }
                   3265:                if(X[0]=="swap"){
                   3266:                        Swap=getopt(swap);
                   3267:                        if(type(Swap)<1 || Swap==1)
                   3268:                                return newvect(5,[M[3],M[1],M[4],M[0],M[2]]);
                   3269:                        if(Swap==2)
                   3270:                                return newvect(5,[radd(M[0],M[1]+M[3]),M[4],M[2],radd(-M[1],-M[3]-M[4]),M[1]]);
                   3271:                        if(type(Swap)==4 && length(Swap)==3){
                   3272:                                MX=radd(-M[0],-M[1]-M[2]); MY=radd(-M[3],-M[1]-M[4]);
                   3273:                                if(Swap[0]==1){
                   3274:                                        MX0=M[2];MY0=M[4];
                   3275:                                }
                   3276:                                else if(Swap[0]==2){
                   3277:                                        MX0=MX;MY0=MY;
                   3278:                                }else{
                   3279:                                        MX0=M[0];MY0=M[3];
                   3280:                                }
                   3281:                                if(Swap[1]==1){
                   3282:                                        MX1=M[2];MY1=M[4];
                   3283:                                }
                   3284:                                else if(Swap[1]==2){
                   3285:                                        MX1=MX;MY1=MY;
                   3286:                                }else{
                   3287:                                        MX1=M[0];MY1=M[3];
                   3288:                                }
                   3289:                                return newvect(5,MX0,M[1],MX1,MY0,MY1);
                   3290:                        }
                   3291:                }
                   3292:                return 0;
                   3293:        }
                   3294:        if(getopt(swap)==1)
                   3295:                 return m2mc(m2mc(m2mc(M,"swap"),X),"swap");
                   3296:        N=newvect(5);
                   3297:        for(I=0;I<5;I++)
                   3298:                N[I]=M[I];
                   3299:        S=size(N[0])[0];
                   3300:        if(type(X)==4){
                   3301:                 for(I=0;I<3;I++){
                   3302:                         if(X[I] != 0)
                   3303:                                        N[I] = radd(N[I],X[I]);
                   3304:                 }
                   3305:                 if(length(X)==3) return N;
                   3306:                 X=X[3];
                   3307:        }
                   3308:        MZ = newmat(S,S);
                   3309:        ME = mgen(S,0,[X],0);
                   3310:        MM = newvect(5);
                   3311:        MM[0] = newbmat(3,3, [[N[0]+ME,N[1],N[2]], [MZ], [MZ]]);
                   3312:        MM[1] = newbmat(3,3, [[MZ], [N[0],N[1]+ME,N[2]], [MZ]]);
                   3313:        MM[2] = newbmat(3,3, [[MZ], [MZ], [N[0],N[1],N[2]+ME]]);
                   3314:        MM[3] = newbmat(3,3, [[N[3]+N[1],-N[1]], [-N[0],radd(N[0],N[3])], [MZ,MZ,N[3]]]);
                   3315:        MM[4] = newbmat(3,3, [[N[4]], [MZ,N[4]+N[2],-N[2]], [MZ,-N[1],radd(N[4],N[1])]]);
                   3316:        M0 = newbmat(3,3, [[N[0]], [MZ,N[1]], [MZ,MZ,N[2]]]);
                   3317:        M1 = radd(MM[0],MM[1]+MM[2]);
                   3318:        KE = append(mykernel(M0|opt=1),mykernel(M1|opt=1));
                   3319:        if(length(KE) == 0) return MM;
                   3320:        KK = mtoupper(lv2m(KE),0);
                   3321:        for(I=0;I<5;I++)
                   3322:                MM[I] = mmod(MM[I],KK);
1.81      takayama 3323:        if(Simp!=0){
                   3324:                MM = mdsimplify(MM|type=Simp);
                   3325:                if(getopt(verb)) show([size(MM[0][0]),MM[1]]);
                   3326:                MM=MM[0];
                   3327:        }
                   3328:        return MM;
                   3329: }
                   3330: #else
                   3331: def m2mc(M,X)
                   3332: {
                   3333:        if(type(M)<2){
                   3334:        mycat([
                   3335: "m2mc(m,t) or m2mc(m,[t,s])\t Calculation of Pfaff system of two variables\n",
                   3336: " m : list of 5 residue mat. or GRS/spc for rigid 4 singular points\n",
                   3337: " t : [a0,ay,a1,c], swap, GRS, GRSC, sp, irreducible, pair, pairs, Pfaff, All\n",
                   3338: " s : TeX, dviout, GRSC\n",
                   3339: " option : swap, small, simplify, operator, int\n",
                   3340: " Ex: m2mc(\"21,21,21,21\",\"All\")\n"
                   3341: ]);
                   3342:                return 0;
                   3343:        }
                   3344:        if(type(M)==7) M=s2sp(M);
                   3345:        if(type(X)==7) X=[X];
                   3346:        Simp=getopt(simplify);
                   3347:        if(Simp!=0 && type(Simp)!=1) Simp=2;
                   3348:        Small=(getopt(small)==1)?1:0;
                   3349:        if(type(M[0])==4){
                   3350:                if(type(M[0][0])==1){ /* spectral type */
                   3351:                        XX=getopt(dep);
                   3352:                        if(type(XX)!=4 || type(XX[0])>1) XX=[1,length(M[0])];
                   3353:                        M=sp2grs(M,[d,a,b,c],[XX[0],XX[1],-2]|mat=1);
                   3354:                        if(XX[0]>1 && XX[1]<2) XX=[XX[0],2];
                   3355:                        if(getopt(int)!=0){
                   3356:                                T=M[XX[0]-1][XX[1]-1][1];
                   3357:                                for(V=vars(T);V!=[];V=cdr(V)){
                   3358:                                        F=coef(T,1,car(V));
                   3359:                                        if(type(F)==1 && dn(F)>1)
                   3360:                                         M = subst(M,car(V),dn(F)*car(V));
                   3361:                                }
                   3362:                        }
                   3363:                        V=vars(M);
                   3364:                        if(findin(d1,V)>=0 && findin(d2,V)<0 && findin(d3,V)<0)
                   3365:                                M=subst(M,d1,d);
                   3366:                }
                   3367:                RC=chkspt(M|mat=1);
                   3368:                if(RC[2] != 2 || RC[3] != 0){ /* rigidity idx and Fuchs cond */
                   3369:                        erno(0);return 0;
                   3370:                }
                   3371:                R=getbygrs(M,1|mat=1);
                   3372:                if(getopt(anal)==1) return R;   /* called by mc2grs() */
                   3373:                Z=newmat(1,1,[[0]]);
                   3374:                N=[Z,Z,Z,Z,Z,Z];
                   3375:                for(RR=R; RR!=[]; RR=cdr(RR)){
                   3376:                        RT=car(RR)[0];
                   3377:                        if(type(RT)==4){
                   3378:                                if(RT[0]!=0) N=m2mc(N,RT[0]|simplify=Simp);
                   3379:                                N=m2mc(N,[RT[1],RT[2],RT[3]]|simplify=Simp);
                   3380:                        }
                   3381:                }
                   3382:                if(type(X)==4 && type(X[0])==7)
                   3383:                        return m2mc(N,X|keep=Keep,small=Small);
                   3384:                return N;
                   3385:        }
                   3386:        if(type(X)==4 && type(X[0])==7){
                   3387:                Keep=(getopt(keep)==1)?1:0;
                   3388:                if(X[0]=="All"){
                   3389:                        dviout("Riemann scheme"|keep=1);
                   3390:                        m2mc(M,[(findin("GRSC",X)>=0)?"GRSC":"GRS","dviout"]|keep=1);
                   3391:                        dviout("Spectral types : "|keep=1);
                   3392:                        m2mc(M,["sp","dviout"]|keep=1);
                   3393:                        dviout("\\\\\nBy the decompositions"|keep=1);
                   3394:                        R=m2mc(M,["pairs","dviout"]|keep=1);
                   3395:                        for(R0=R1=[],I=1; R!=[]; I++, R=cdr(R)){
                   3396:                                for(S=0,RR=car(R)[1][0];RR!=[]; RR=cdr(RR)) S+=RR[0];
                   3397:                                if(S==0) R0=cons(I,R0);
                   3398:                                else if(S<0) R1=cons(I,R1);
                   3399:                        }
                   3400:                        S="irreducibility\\ $"+((length(R0)==0)?"\\Leftrightarrow":"\\Leftarrow")
                   3401:                                +"\\ \\emptyset=\\mathbb Z\\cap$";
                   3402:                        dviout(S|keep=1);
                   3403:                        m2mc(M,["irreducible","dviout"]|keep=1);
                   3404:                        if(R0!=[])
                   3405:                                dviout(ltotex(reverse(R0))|eq=0,keep=1,
                   3406:                                 title="The following conditions may not be necessary for the irreducibility.");
                   3407:                        if(R1!=[])
                   3408:                                dviout(ltotex(reverse(R1))|eq=0,keep=1,title="The following conditions can be omitted.");
                   3409:                        if(getopt(operator)!=0){
                   3410:                                dviout("The equation in a Pfaff form is"|keep=1);
                   3411:                                m2mc(M,["Pfaff","dviout"]|keep=Keep,small=Small);
                   3412:                        }
                   3413:                        else if(Keep!=1) dviout(" ");
                   3414:                        return M;
                   3415:                }
                   3416:                Show=0;
                   3417:                if(length(X)>1){
                   3418:                        if(X[1]=="dviout") Show=2;
                   3419:                        if(X[1]=="TeX") Show=1;
                   3420:                }
                   3421:                if(X[0]=="GRS"||X[0]=="GRSC"||X[0]=="sp"||X[0]=="extend"){
                   3422:                        Y=radd(-M[0],-M[1]-M[2]);
                   3423:                        if(X[0]=="extend")
                   3424:                                return [M[1],M[0],M[2],Y, M[3],M[4],radd(-M[1],-M[3]-M[4]),
                   3425:                                        radd(Y,-M[3]-M[4]),radd(M[1],M[2]+M[4]), radd(M[0],M[1]+M[3])];
                   3426:                        if(X[0]!="GRSC"){
                   3427:                                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);
                   3428:                                if(X[0]=="sp"){
                   3429:                                        L=chkspt(L|opt="sp");
                   3430:                                        V=[L[1],L[0],L[2],L[5]]; W=[L[1],L[3],L[4],L[6]];
                   3431:                                        if(Show==2) dviout(s2sp(V)+" : "+s2sp(W)|keep=Keep);
                   3432:                                        return [V,W];
                   3433:                                }
                   3434:                                S="x=0&x=y&x=1&y=0&y=1&x=\\infty&y=\\infty&x=y=\\infty\\\\\n";
                   3435:                        }else{
                   3436:                                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]),
                   3437:                                        radd(M[0],M[1]+M[3]),radd(M[1],M[2]+M[4])]|mult=1);
                   3438:                                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";
                   3439:                        }
                   3440:                        T=ltotex(L|opt="GRS",pre=S,small=Small);
                   3441:                        if(Show==2) dviout(T|eq=0,keep=Keep);
                   3442:                        if(Show==1) L=T;
                   3443:                        return L;
                   3444:                }
                   3445:                if(X[0]=="Pfaff"){
                   3446:                        S=ltotex(M|opt=["Pfaff",u,x,x-y,x-1,y,y-1],small=Small);
                   3447:                        if(Show==2) dviout(S|eq=0,keep=Keep);
                   3448:                        return S;
                   3449:                }
                   3450:                if(X[0]=="irreducible"){
                   3451:                        L=meigen([M[0],M[1],M[2],radd(-M[0],-M[1]-M[2])]|mult=1);
                   3452:                        S=getbygrs(L,10|mat=1);
                   3453:                        if(Show==2) dviout(ltotex(S)|eq=0,keep=Keep);
                   3454:                        return S;
                   3455:                }
                   3456:                if(X[0]=="pairs"||X[0]=="pair"){
                   3457:                        L=meigen([M[0],M[1],M[2],radd(-M[0],-M[1]-M[2])]|mult=1);
                   3458:                        S=chkspt(L|opt=0);
                   3459:                        V=(Show==2)?1:0;
                   3460:                        S=sproot(L,X[0]|dviout=V,keep=Keep);
                   3461:                        return S;
                   3462:                }
                   3463:                if(X[0]=="swap"){
                   3464:                        Swap=getopt(swap);
                   3465:                        if(type(Swap)<1 || Swap==1)
                   3466:                                return newvect(6,[M[3],M[1],M[4],M[0],M[2],M[5]]);
                   3467:                        if(Swap==2)
                   3468:                                return newvect(5,[radd(M[0],M[1]+M[3]),M[4],M[2],radd(-M[1],-M[3]-M[4]),M[1]]);
                   3469:                        if(type(Swap)==4 && length(Swap)==3){
                   3470:                                MX=radd(-M[0],-M[1]-M[2]); MY=radd(-M[3],-M[1]-M[4]);
                   3471:                                if(Swap[0]==1){
                   3472:                                        MX0=M[2];MY0=M[4];
                   3473:                                }
                   3474:                                else if(Swap[0]==2){
                   3475:                                        MX0=MX;MY0=MY;
                   3476:                                }else{
                   3477:                                        MX0=M[0];MY0=M[3];
                   3478:                                }
                   3479:                                if(Swap[1]==1){
                   3480:                                        MX1=M[2];MY1=M[4];
                   3481:                                }
                   3482:                                else if(Swap[1]==2){
                   3483:                                        MX1=MX;MY1=MY;
                   3484:                                }else{
                   3485:                                        MX1=M[0];MY1=M[3];
                   3486:                                }
                   3487:                                return newvect(5,MX0,M[1],MX1,MY0,MY1);
                   3488:                        }
                   3489:                }
                   3490:                return 0;
                   3491:        }
                   3492:        if(getopt(swap)==1)
                   3493:                 return m2mc(m2mc(m2mc(M,"swap"),X),"swap");
                   3494:        N=newvect(6);
                   3495:        for(I=0;I<6;I++)
                   3496:                N[I]=M[I];
                   3497:        S=size(N[0])[0];
                   3498:        if(type(X)==4){
                   3499:                 for(I=0;I<3;I++){
                   3500:                         if(X[I] != 0)
                   3501:                                        N[I] = radd(N[I],X[I]);
                   3502:                 }
                   3503:                 if(length(X)==3) return N;
                   3504:                 X=X[3];
                   3505:        }
                   3506:        MZ = newmat(S,S);
                   3507:        ME = mgen(S,0,[X],0);
                   3508:        MM = newvect(6);
                   3509:        MM[0] = newbmat(3,3, [[N[0]+ME,N[1],N[2]], [MZ], [MZ]]);        /* A01 */
                   3510:        MM[1] = newbmat(3,3, [[MZ], [N[0],N[1]+ME,N[2]], [MZ]]);        /* A02 */
                   3511:        MM[2] = newbmat(3,3, [[MZ], [MZ], [N[0],N[1],N[2]+ME]]);        /* A03 */
                   3512:        MM[3] = newbmat(3,3, [[N[3]+N[1],-N[1]], [-N[0],radd(N[0],N[3])], [MZ,MZ,N[3]]]);       /* A12 */
                   3513:        MM[4] = newbmat(3,3, [[N[4]], [MZ,N[4]+N[2],-N[2]], [MZ,-N[1],radd(N[4],N[1])]]);       /* A23 */
                   3514:        MM[5] = newbmat(3,3, [[MZ,N[5]+N[2],-N[2]], [N[5]], [MZ,-N[0],radd(N[5],N[0])]]);       /* A13 */
                   3515:        M0 = newbmat(3,3, [[N[0]], [MZ,N[1]], [MZ,MZ,N[2]]]);
                   3516:        M1 = radd(MM[0],MM[1]+MM[2]);
                   3517:        KE = append(mykernel(M0|opt=1),mykernel(M1|opt=1));
                   3518:        if(length(KE) == 0) return MM;
                   3519:        KK = mtoupper(lv2m(KE),0);
                   3520:        for(I=0;I<6;I++)
                   3521:                MM[I] = mmod(MM[I],KK);
1.6       takayama 3522:        if(Simp!=0) MM = mdsimplify(MM|type=Simp);
                   3523:        return MM;
                   3524: }
1.81      takayama 3525: #endif
1.6       takayama 3526:
                   3527: def easierpol(P,X)
                   3528: {
                   3529:        if(type(X) == 4){
                   3530:                for( Y = [] ; X != []; X = cdr(X) )
                   3531:                        Y = cons([0,car(X)], Y);
                   3532:        }else
                   3533:                Y = [0,X];
                   3534:        return rede(P,Y);
                   3535: }
                   3536:
                   3537: def l2p(L,V)
                   3538: {
                   3539:        if(type(L)==4){
                   3540:                for(S=I=0;L!=[];L=cdr(L),I++)
                   3541:                        S+=car(L)*V^I;
                   3542:                return S;
                   3543:        }else if(type(L)==5){
                   3544:                for(S=0,I=size(L)-1;I>=0;I--)
                   3545:                        S+=L[I]*V^I;
                   3546:                return S;
                   3547:        }else{
                   3548:                if(type(D=getopt(size))==1) D--;
                   3549:                else D=mydeg(L,V);
                   3550:                for(S=[];D>=0;D--)
                   3551:                        S=cons(mycoef(L,D,V),S);
                   3552:                return S;
                   3553:        }
                   3554: }
                   3555:
                   3556: def paracmpl(L,V)
                   3557: {
                   3558:        if(type(L)==4) L=ltov(L);
                   3559:        S=length(L);
                   3560:        Lim=getopt(lim);Low=getopt(low);
                   3561:        if((F=type(L[0]))>3){
                   3562:                SV=length(L[0]);
                   3563:                V0=makenewv(L);
                   3564:                for(LL=[];S>0;S--)
                   3565:                        LL=cons(l2p(L[S-1],V0),LL);
                   3566:                G=paracmpl(LL,V|option_list=getopt());
                   3567:                H=(Lim==1)?G:G[0];
                   3568:                for(HH=[];H!=[];H=cdr(H)){
                   3569:                        HT=l2p(car(H),V0|size=SV);
                   3570:                        if(F==5) HT=ltov(HT);
                   3571:                        HH=cons(HT,HH);
                   3572:                }
                   3573:                H=reverse(HH);
                   3574:                return (Lim==1)?H:[H,G[1]];
                   3575:        }
                   3576:        H=newvect(S);D=newvect(S);
                   3577:        for(Dn=1,I=0;I<S;I++){
                   3578:                P=dn(L[I]=red(L[I]));
                   3579:                Dn=red(Dn*P/gcd(Dn,P));
                   3580:        }
                   3581:        if(Dn!=1){
                   3582:                for(I=0;I<S;I++) L[I]=red(Dn*L[I]);
                   3583:        }
                   3584:        G=diagm(S,[1]);
                   3585:        if(type(V)<4) V=[V];
                   3586:        VV=lsort(vars(L),V,1);
                   3587:        V=car(V);
                   3588:        for(I=0;I<S;I++){
                   3589:                P=L[I];
                   3590:                for(J=0,C=P;J<I;J++){
                   3591:                        if(D[J]!=[]){
                   3592:                                C=mycoef(C,DT,VV);
                   3593:                                P-=C*H[J];
                   3594:                                G=cola(G,I,J,-C);
                   3595:                        }
                   3596:                }
                   3597:                if(P==0){
                   3598:                        D[I]=[];continue;
                   3599:                }
                   3600:                P0=nm(red(P));
                   3601:                K=mymindeg(P0,V);
                   3602:                C=mycoef(P0,K,V);
                   3603:                if(K>0){
                   3604:                        P=red(P/V^K);
                   3605:                        G=colm(G,I,1/V^K);
                   3606:                }
                   3607:                for(DT=[],VT=VV;VT!=[];VT=cdr(VT)){
                   3608:                        K=(Low==1)?mymindeg(C,car(VT)):mydeg(C,car(VT));
                   3609:                        C=mycoef(C,K,car(VT));
                   3610:                        DT=cons(K,DT);
                   3611:                }
                   3612:                D[I]=DT=reverse(DT);
                   3613:                for(C=P,VT=VV;VT!=[];VT=cdr(VT),DT=cdr(DT))
                   3614:                        C=mycoef(C,car(DT),car(VT));
                   3615:                H[I]=P=red(P/C);
                   3616:                G=colm(G,I,1/C);
                   3617:        }
                   3618:        if(Dn!=1){
                   3619:                for(I=0;I<S;I++){
                   3620:                        TH=red(H[I]/Dn);
                   3621:                        F=fctr(dn(TH));F=cdr(F);
                   3622:                        if(Lim!=1||subst(Dn,V,0)==0){
                   3623:                                for(;F!=[];F=cdr(F)){
                   3624:                                        if(lsort(vars(car(F)[0]),VV,2)==[]){
                   3625:                                                C=car(F)[0]^car(F)[1];
                   3626:                                                TH=red(TH*C);
                   3627:                                                G=colm(G,I,C);
                   3628:                                        }
                   3629:                                }
                   3630:                        }
                   3631:                        H[I]=TH;
                   3632:                }
                   3633:        }
                   3634:        H=vtol(H);
                   3635:        if(Lim==1){
                   3636:                H=subst(H,V,0);
                   3637:                return map(red,H);
                   3638:        }
                   3639:        return [H,map(red,G)];
                   3640: }
                   3641:
                   3642: def mykernel(M)
                   3643: {
                   3644:        if(getopt(opt) == 1)
                   3645:                M = mtranspose(M);
                   3646:        S = size(M);
                   3647:        R = [];
                   3648:        MM = mtoupper(M,-1);
                   3649:        for(I = S[0]-1; I >= 0; I--){
                   3650:                for(J = S[1]-1; J >= 0; J--){
                   3651:                        if(MM[I][J] != 0)
                   3652:                                return R;
                   3653:                }
                   3654:                P = easierpol(MM[I][S[1]],zz);
                   3655:                RR = newvect(S[0]);
                   3656:                for(J = 0; J < S[0]; J++)
                   3657:                        RR[J] = mycoef(P,J,zz);
                   3658:                R = cons(RR,R);
                   3659:        }
                   3660:        return R;
                   3661: }
                   3662:
                   3663: def myimage(M)
                   3664: {
                   3665:        if(getopt(opt) == 1)
                   3666:                M = mtranspose(M);
                   3667:        S = size(M);
                   3668:        V = [];
                   3669:        M0 = newvect(S[1]);
                   3670:        M = mtoupper(M,0|opt=1);
                   3671:        for(I = S[0]-1; I >= 0; I--)
                   3672:                if(M0 != M[I])
                   3673:                        V = cons(vtozv(M[I])[0], V);
                   3674:        return V;
                   3675: }
                   3676:
                   3677: def mymod(V,L)
                   3678: {
                   3679:        Opt = getopt(opt);
                   3680:        S = length(V);
                   3681:        VP = newvect(S);
                   3682:        if(type(L)==6)
                   3683:                L=m2lv(L);
                   3684:        CT = length(L);
                   3685:        for(LT = L; LT != []; LT = cdr(LT)){
                   3686:                for(VT = car(LT), I = 0; I < S; I++)
                   3687:                        if(VT[I] != 0) break;
                   3688:                if(I >= S){
                   3689:                        CT--;
                   3690:                        continue;
                   3691:                }
                   3692:                VP[I] = 1;
                   3693:                MI = -red(V[I]/VT[I]);
                   3694:                if(MI != 0)
                   3695:                        V = radd(V,rmul(MI,VT));
                   3696:        }
                   3697:        if(Opt==1){
                   3698:                for(I = 0; I < S; I++)
                   3699:                        if(V[I] != 0)
                   3700:                                return 1;
                   3701:                return 0;
                   3702:        }
                   3703:        if(Opt==2){
                   3704:                W=newvect(S-CT);
                   3705:                for(CC = I = 0; I < S; I++){
                   3706:                        if(VP[I]==0) W[CC++] =V[I];
                   3707:                }
                   3708:                return W;
                   3709:        }
                   3710:        return V;
                   3711: }
                   3712:
                   3713: def mmod(M,L)
                   3714: {
                   3715:        S=size(M)[1];
                   3716:        MM=mtranspose(M);
                   3717:        VP = newvect(S);
                   3718:        if(type(L)==6)
                   3719:                L=m2lv(L);
                   3720:        for(CT = 0, LT = L; LT != []; LT = cdr(LT)){
                   3721:                for(VT = car(LT), I = 0; I < S; I++){
                   3722:                        if(VT[I] != 0){
                   3723:                                VP[I] = 1;
                   3724:                                break;
                   3725:                        }
                   3726:                }
                   3727:        }
                   3728:        if(getopt(opt)==1)
                   3729:                NE=1;
                   3730:        for(D=I=0; I<S; I++){
                   3731:                if(NE != 1 && VP[I] == 1) continue;
                   3732:                T = mymod(MM[I],L|opt=2);
                   3733:                if(D==0){
                   3734:                        K=length(T);
                   3735:                        MN=newmat((NE==1)?S:K,K);
                   3736:                }
                   3737:                for(J=0;J<K;J++)
                   3738:                        MN[J][D]=T[J];
                   3739:                D++;
                   3740:        }
                   3741:        return MN;
                   3742: }
                   3743:
                   3744: def llsize(V)
                   3745: {
                   3746:        for(I=J=0;V!=[];V=cdr(V),I++)
                   3747:                if(length(car(V))>J) J=length(car(V));
                   3748:        return [I,J];
                   3749: }
                   3750:
                   3751: def llbase(VV,L)
                   3752: {
                   3753:        S = length(VV);
                   3754:        V = dupmat(VV);
                   3755:        if(type(V) == 4)
                   3756:                V = ltov(V);
                   3757:        T = length(L);
                   3758:        for(I = 0; I < S; I++)
                   3759:                V[I] = nm(red(V[I]));
                   3760:        LV = 0;
                   3761:        for(J = 0; J < T; J++){
                   3762:                X = var(L[J]); N = deg(L[J],X);
                   3763:                for(I = LV; I < S; I++){
                   3764:                        if((C2=coef(V[I],N,X)) != 0){
1.83    ! takayama 3765:                                if(type(C2)==1){
        !          3766:                                        for(K=I+1;K<S;K++){
        !          3767:                                                if(!(C1=coef(V[K],N,X))||type(C1)!=1) continue;
        !          3768:                                                if(abs(C2)<abs(C1)) I=K;
        !          3769:                                        }
        !          3770:                                }
1.6       takayama 3771:                                if(I > LV){
                   3772:                                        Temp = V[I];
                   3773:                                        V[I] = V[LV];
                   3774:                                        V[LV] = Temp;
                   3775:                                }
                   3776:                                for(I = 0; I < S; I++){
                   3777:                                        if(I == LV || (C1 = coef(V[I],N,X)) == 0)
                   3778:                                                continue;
                   3779:                                        Gcd = gcd(C1,C2);
                   3780:                                        V[I] = V[I]*tdiv(C2,Gcd)-V[LV]*tdiv(C1,Gcd);
                   3781:                                }
                   3782:                                LV++;
                   3783:                        }
                   3784:                }
                   3785:        }
                   3786:        return V;
                   3787: }
                   3788:
1.44      takayama 3789: def rsort(L,T,K)
                   3790: {
                   3791:        for(R=[];L!=[];L=cdr(L))
                   3792:                R=cons((type(car(L))==4)?rsort(car(L),T-1,K):car(L),R);
                   3793:        if(T>0||iand(T,iand(K,2)/2)) return reverse(R);
                   3794:        R=qsort(R);
                   3795:        return (iand(K,1))? reverse(R):R;
                   3796: }
                   3797:
1.60      takayama 3798: def llget(L,LL,LC)
                   3799: {
                   3800:        if(type(LL)==4){
                   3801:                LM=length(L);
                   3802:                for(R=[];LL!=[];LL=cdr(LL)){
                   3803:                        if(isint(TL=car(LL))) R=cons(TL,R);
                   3804:                        else{
                   3805:                                IM=(length(TL)==1)?(LM-1):TL[1];
                   3806:                                for(I=car(TL);I<=IM;I++) R=cons(I,R);
                   3807:                        }
                   3808:                }
                   3809:                LL=reverse(R);
                   3810:                if(LC==-1){
                   3811:                        LL=lsort(LL,[],1);
                   3812:                        return lsort(L,"num",["sub"]|c1=LL);
                   3813:                }
                   3814:                L=lsort(L,"num",["get"]|c1=LL);
                   3815:        }
                   3816:        if(type(LC)==4){
                   3817:                LM=length(L[0]);
                   3818:                for(R=[];LC!=[];LC=cdr(LC)){
                   3819:                        if(isint(TL=car(LC))) R=cons(TL,R);
                   3820:                        else{
                   3821:                                IM=(length(TL)==1)?(LM-1):TL[1];
                   3822:                                for(I>=car(TL);I<=IM;I++) R=cons(I,R);
                   3823:                        }
                   3824:                }
                   3825:                LC=reverse(R);
                   3826:                if(LL==-1){
                   3827:                        LC=lsort(LC,[],1);
                   3828:                        return lsort(L,"col",["setminus"]|c1=LC);
                   3829:                }
                   3830:                L=lsort(L,"col",["put"]|c1=LC);
                   3831:        }
1.63      takayama 3832:        if(getopt(flat)==1) L=m2l(L|flat=1);
1.60      takayama 3833:        return L;
                   3834: }
                   3835:
1.44      takayama 3836:
1.6       takayama 3837: def lsort(L1,L2,T)
                   3838: {
1.10      takayama 3839:        C1=getopt(c1);C2=getopt(c2);
1.8       takayama 3840:        if(type(T)==4){
                   3841:                K=T;
1.10      takayama 3842:                if(length(T)>0){
                   3843:                        T=K[0];
                   3844:                        K=cdr(K);
1.12      takayama 3845:                }else T=0;
1.8       takayama 3846:        }else K=0;
1.10      takayama 3847:        if(type(TT=T)==7)
                   3848:                T = findin(T,["cup","setminus","cap","reduce","sum","subst"]);
                   3849:        if(type(L2)==7&&T<0)
                   3850:                T=findin(TT,["put","get","sub"]);
                   3851:        if(K){           /* [[..],..] */
                   3852:                if(K!=[]) KN=K[0];
                   3853:                if(L2==[]||L2=="sort"){ /* sort or deduce duplication */
                   3854:                        if((T!=0&&T!=3)||length(K)!=1) return L1;
1.8       takayama 3855:                        if(KN<0){
                   3856:                                KN=-KN-1;
                   3857:                                F=-1;
                   3858:                        }else F=1;
                   3859:                        L1=msort(L1,[F,0,KN]);
1.10      takayama 3860:                        if(T==3){
1.8       takayama 3861:                                R=[car(L1)];L1=cdr(L1);
                   3862:                                for(;L1!=[];L1=cdr(L1)){
                   3863:                                        if(car(L1)[KN]!=car(R)[KN]) R=cons(car(L1),R);
                   3864:                                }
                   3865:                                L1=reverse(R);
                   3866:                        }
                   3867:                        return L1;
1.10      takayama 3868:                }else if((L2==0||L2=="col")&&type(C1)==4){
1.8       takayama 3869:                        if(T==0||T==1){ /* extract or delete columns */
                   3870:                                for(R=[];L1!=[];L1=cdr(L1)){
1.10      takayama 3871:                                        if(T==1&&C1==[0]){      /* delete top column */
1.8       takayama 3872:                                                R=cons(cdr(car(L1)),R);
                   3873:                                                continue;
                   3874:                                        }
1.10      takayama 3875:                                        LT=car(L1);RT=[];
1.8       takayama 3876:                                        if(T==0){
1.10      takayama 3877:                                                for(CT=C1;CT!=[];CT=cdr(CT)) RT=cons(LT[car(CT)],RT);
1.8       takayama 3878:                                        }else{
1.10      takayama 3879:                                                for(I=0;LT!=[];I++,LT=cdr(LT))
1.8       takayama 3880:                                                        if(findin(I,C1)<0) RT=cons(car(LT),RT);
                   3881:                                        }
1.59      takayama 3882:                                        R=cons(reverse(RT),R);
1.8       takayama 3883:                                }
                   3884:                                return reverse(R);
                   3885:                        }
1.10      takayama 3886:                }else if(type(L2)==1||type(L2)==7){
                   3887:                        if(L2==1||L2=="num"){
                   3888:                                if(T==4) T=3;
                   3889:                                I=(length(K)<2)?(-1):K[1];
                   3890:                                if(T==0||T==1||T==2||T==3){
                   3891:                                        S=F=CT=0;R=[];
                   3892:                                        if(K==[] || type((S=K[0]))==1 || S==0){
                   3893:                                                if(T==0||T==1||T==2){
                   3894:                                                        for(J;L1!=[];L1=cdr(L1),J++){
                   3895:                                                                if(T==0) R=cons(cons(J+S,car(L1)),R);
                   3896:                                                                else if(T==1){
                   3897:                                                                        for( ;C1!=[]; C1=cdr(C1))
                   3898:                                                                                R=cons(L1[car(C1)],R);
                   3899:                                                                }else{
                   3900:                                                                        if(findin(J,C1)<0) R=cons(car(L1),R);
                   3901:                                                                }
                   3902:                                                        }
                   3903:                                                        return reverse(R);
                   3904:                                                }else if(T==3) return length(L1);
                   3905:                                        }else{
                   3906:                                                if(type(S)==2&&vtype(S)>2) F=1;
                   3907:                                                else if(type(S)==4) F=2;
                   3908:                                                else if(S=="+") F=3;
                   3909:                                                else return L1;
                   3910:                                        }
                   3911:                                        for(R=[];L1!=[];L1=cdr(L1)){
                   3912:                                                L1T=car(L1);
                   3913:                                                if(F==1) V=call(S,(I<0)?L1T:L1T[I]);
                   3914:                                                else if(F==2) V=calc((I<0)?L1T:L1T[I],S);
                   3915:                                                else if(F==3){
                   3916:                                                        for(C=C1,V=0;C!=[];C=cdr(C))
                   3917:                                                                if(type(X=L1T[car(C)])==1) V+=X;
                   3918:                                                }
                   3919:                                                if(T==0) R=cons(cons(V,L1T),R);
                   3920:                                                else if(T==1){
                   3921:                                                        if(V) R=cons(L1T,R);
                   3922:                                                }else if(T==2){
                   3923:                                                        if(!V) R=cons(L1T,R);
                   3924:                                                }else if(T==3){
                   3925:                                                        if(F==3) CT+=V;
                   3926:                                                        else if(V) CT++;
                   3927:                                                }
                   3928:                                        }
                   3929:                                        return (T==3)?CT:reverse(R);
                   3930:                                }else if(TT=="col"){
                   3931:                                        J=(length(K)>0)?car(K):0;
                   3932:                                        I=length(car(L1))+J;
                   3933:                                        for(V=[];I>J;)
                   3934:                                                V=cons(--I,V);
                   3935:                                        return cons(V,L1);
                   3936:                                }
                   3937:                        }else if(L2=="transpose") return mtranspose(L1);
1.12      takayama 3938:                        else if(L2=="subst"||L2=="adjust"){
                   3939:                                Null=(!K)?"":car(K);
1.17      takayama 3940:                                if(L2=="adjust") C1=[];
1.12      takayama 3941:                                R=lv2m(L1|null="");
1.10      takayama 3942:                                for(;C1!=[];C1=cdr(C1)) R[car(C1)[0]][car(C1)[1]]=car(C1)[2];
                   3943:                                return m2ll(R);
                   3944:                        }
                   3945:                        return L1;
                   3946:                }else{           /* [[..],..], [[..],..] */
                   3947:                        if(type(L2[0])<4){
                   3948:                                for(R=[];L2!=[];L2=cdr(L2)) R=cons([car(L2)],R);
                   3949:                                L2=reverse(R);
                   3950:                        }
                   3951:                        if(TT=="sum")  T=3;
                   3952:                        if(TT=="over") T=4;
                   3953:                        if(findin(T,[0,1,2,3,4,5])<0) return L1;
                   3954:                        if(T==4||T==5){
                   3955:                                if(type(C1)<2) C1=[C1];
                   3956:                                if(type(C2)<2) C2=[C2];
                   3957:                        }
1.8       takayama 3958:                        if(type(car(L2))!=4){
                   3959:                                for(R=[];L2!=[];L2=cdr(L2)) R=cons([car(L2)],R);
                   3960:                                R=reverse(R);
                   3961:                                if(length(K)==1) K=[K[0],0];
                   3962:                                C2=0;
                   3963:                        }
1.10      takayama 3964:                        L1=lsort(L1,"num",["put",0]);           /* insert number */
                   3965:                        K0=(length(K)>0)?K[0]+1:1;
                   3966:                        K1=(length(K)>1)?K1=K[1]:0;
                   3967:                        L1=lsort(L1,"sort",[0,K0]);
                   3968:                        if(T<4&&type(C2)==4&&length(L2[0])>1){
                   3969:                                L2=lsort(L2,"col",["put"]|c1=cons(K1,C2)); /* add key and extract columns */
                   3970:                                C2=0;K1=0;
                   3971:                        }
                   3972:                        L2=lsort(L2,"sort",[0,K1]);
                   3973:                        for(R0=[],S=S1=length(L1[0]);S>0;S--) R0=cons("",R0);
                   3974:                        for(R1=[],S=length(L2[0]);S>0;S--) R1=cons("",R1);
                   3975:                        if(!K1&&T!=3) R1=cdr(R1);
                   3976:                        for(R=[];L1!=[];L1=cdr(L1)){
                   3977:                                while(L2!=[]&&car(L1)[K0]>car(L2)[K1]){
                   3978:                                        if(T==3) R=cons(append(R0,car(L2)),R);
                   3979:                                        L2=cdr(L2);
                   3980:                                }
                   3981:                                if(L2==[]||car(L1)[K0]<car(L2)[K1]){
                   3982:                                        if(T!=2) R=cons((T==1||T>3||R1==[])?car(L1):append(car(L1),R1),R);
                   3983:                                }else if(T==0||T==2||T==3){
                   3984:                                        if(R0==[]) R=append(car(L1),R);
                   3985:                                        else R=cons(append(car(L1),(!K1&&T!=3)?cdr(car(L2)):car(L2)),R);
                   3986:                                        L2=cdr(L2);
                   3987:                                }else if(T==4||T==5){
                   3988:                                        V1=ltov(car(L1));V2=ltov(car(L2));
                   3989:                                        for(D1=C1,D2=C2;D1!=[];D1=cdr(D1),D2=cdr(D2))
                   3990:                                                if((I=V2[car(D2)])!=""||T==4) V1[car(D1)+1]=I;
                   3991:                                        R=cons(vtol(V1),R);
                   3992:                                }
                   3993:                        }
                   3994:                        if(T==3){
                   3995:                                while(L2!=[]){
                   3996:                                        R=cons(append(R0,car(L2)),R);
                   3997:                                        L2=cdr(L2);
                   3998:                                }
                   3999:                        }
                   4000:                        R=lsort(R,"sort",["put",0]);    /* original order */
                   4001:                        D=(((T==0||T==2)&&!K1)||T==3)?[0]:[0,S1+K1];
                   4002:                        R=lsort(R,0,[1]|c1=D); /* delete */
                   4003:                        if(type(C1)!=4||T==1||T==4||T==5) return R;
                   4004:                        C=[];S0=size(L1[0]);
                   4005:                        for(;C1!=[];C1=cdr(C1)) C=cons(car(C1),C);
                   4006:                        for(I=0;I<S0-S1;I++) C=cons(I+S1,C);
1.8       takayama 4007:                        C=reverse(C);
1.10      takayama 4008:                        return lsort(R,"col",[1]|c1=C);
1.8       takayama 4009:                }
                   4010:        }
1.10      takayama 4011:        if(L2 == []){           /* [...] */
                   4012:                if(T==8||TT=="count") return [length(L1),length(lsort(L1,[],1))];
                   4013:                if(T==7||TT=="cut"){
                   4014:                        K=length(L1);
                   4015:                        if(C1<0) C1=K+C1;
                   4016:                        for(R=[],I=0;I<C1&&L1!=[];I++,L1=cdr(L1))
                   4017:                                R=cons(car(L1),R);
                   4018:                        for(S=[];L1!=[];L1=cdr(L1))
                   4019:                                S=cons(car(L1),S);
                   4020:                        return [reverse(R),reverse(S)];
                   4021:                }
                   4022:                if(T==2) return L2;
                   4023:                if(T==3) return [L1,L2];
1.6       takayama 4024:                L1 = ltov(L1); qsort(L1);
                   4025:                if(T != 1)
                   4026:                        return vtol(L1);
                   4027:                L3 = [];
                   4028:                for(I = length(L1)-1; I >= 0; I--){
                   4029:                        if(I > 0 && L1[I] == L1[I-1])
                   4030:                                continue;
                   4031:                        L3 = cons(L1[I], L3);
                   4032:                }
                   4033:                return L3;
                   4034:        }
1.10      takayama 4035:        if(T==8||TT=="count"){
                   4036:                K=length(lsort(L1,L2,3)[0]);
                   4037:                R=[length(L2),length(L1)];
                   4038:                L1 = lsort(L1,[],1);
                   4039:                L2 = lsort(L2,[],1);
                   4040:                R=append([length(L2),length(L1)],R);
                   4041:                R=cons(length(lsort(L1,L2,2)),R);
                   4042:                return reverse(cons(K,R));
                   4043:        }
1.12      takayama 4044:        if((T==9||TT=="cons")&&type(car(L1))==4){
                   4045:                if(type(L2)!=4) L2=[L2];
                   4046:                for(R=[];L1!=[];L1=cdr(L1)){
                   4047:                        R=cons(cons(car(L2),car(L1)),R);
                   4048:                        if(length(L2)>1) L2=cdr(L2);
                   4049:                }
                   4050:                return reverse(R);
                   4051:        }
1.13      takayama 4052:        if(T==10||TT=="cmp"){
                   4053:                if(length(L1)!=length(L2)){
                   4054:                        mycat("Different length!");
                   4055:                        return 1;
                   4056:                }
                   4057:                R=[];
                   4058:                if(type(car(L1))==4){
                   4059:                        for(U=[],I=0;L1!=[];I++,L1=cdr(L1),L2=cdr(L2)){
                   4060:                                if(length(S=car(L1))!=length(T=car(L2))){
                   4061:                                        mycat(["Different size : line ",I]);
                   4062:                                        return 0;
                   4063:                                }
                   4064:                                for(J=0;S!=[];S=cdr(S),T=cdr(T),J++)
                   4065:                                        if(car(S)!=car(T)) U=cons([[I,J],car(S),car(T)],U);
                   4066:                        }
                   4067:                        if(U!=[]) R=cons(reverse(U),R);
                   4068:                }else{
                   4069:                        for(I=0;L1!=[];L1=cdr(L1),L2=cdr(L2),I++)
                   4070:                                if(car(L1)!=car(L2)) R=cons([I,car(L1),car(L2)],R);
                   4071:                }
                   4072:                return reverse(R);
                   4073:        }
                   4074:        if(T==11||TT=="append"){
                   4075:                if(type(car(L1))!=4) return append(L1,L2);
                   4076:                for(R=[];L1!=[];L1=cdr(L1),L2=cdr(L2))
                   4077:                        R=cons(append(car(L1),car(L2)),R);
                   4078:                return reverse(R);
                   4079:        }
1.6       takayama 4080:        if(T == 1 || T == 2){
                   4081:                L1 = lsort(L1,[],1);
                   4082:                L2 = lsort(L2,[],1);
                   4083:                L3 = [];
                   4084:                if(T == 1){
                   4085:                        while(L1 != []){
                   4086:                                if(L2 == [] || car(L1) < car(L2)){
                   4087:                                 L3 = cons(car(L1), L3);
                   4088:                                 L1 = cdr(L1);
                   4089:                                        continue;
                   4090:                                }
                   4091:                                if(car(L1) > car(L2)){
                   4092:                                        L2 = cdr(L2);
                   4093:                                        continue;
                   4094:                                }
                   4095:                                L1 = cdr(L1); L2 = cdr(L2);
                   4096:                        }
                   4097:                        return reverse(L3);
                   4098:                }
                   4099:                if(T==2){
                   4100:                        while(L1 != [] && L2 != []){
                   4101:                                if(car(L1) != car(L2)){
                   4102:                                        if(car(L1) <= car(L2))
                   4103:                                                         L1 = cdr(L1);
                   4104:                                        else L2 = cdr(L2);
                   4105:                                        continue;
                   4106:                                }
                   4107:                                while(car(L1) == car(L2))
                   4108:                                        L1 = cdr(L1);
                   4109:                                L3 = cons(car(L2), L3);
                   4110:                        }
                   4111:                        return reverse(L3);
                   4112:                }
                   4113:        }
                   4114:        if(T==3){
                   4115:                L1 = qsort(L1); L2 = qsort(L2);
                   4116:                L3 = L4 = [];
                   4117:                while(L1 != [] && L2 != []){
                   4118:                        if(car(L1) == car(L2)){
                   4119:                                L1 = cdr(L1); L2 = cdr(L2);
                   4120:                        }else if(car(L1) < car(L2)){
                   4121:                                L3 = cons(car(L1),L3);
                   4122:                                L1 = cdr(L1);
                   4123:                        }else{
                   4124:                                L4 = cons(car(L2), L4);
                   4125:                                L2 = cdr(L2);
                   4126:                        }
                   4127:                }
                   4128:                L4 = append(reverse(L4),L2);
                   4129:                L3 = append(reverse(L3),L1);
                   4130:                return [L3,L4];
                   4131:        }
                   4132:        L1 = append(L1,L2);
                   4133:        return lsort(L1,[],1);
                   4134: }
                   4135:
                   4136: def mqsub(X,Y)
                   4137: {
                   4138:        for(L=LQS;L!=[];L=cdr(L)){
                   4139:                F=(T=car(L))[0];M=(T=cdr(T))[0];
                   4140:                X0=X;Y0=Y;
                   4141:                for(T=cdr(T);T!=[];T=cdr(T)){
                   4142:                        X0=X0[car(T)];Y0=Y0[car(T)];
                   4143:                }
                   4144:                if(type(M)==1){
                   4145:                        if(M==3){
                   4146:                                X0=type(X0);Y0=type(Y0);
                   4147:                        }else if(M==4&&type(X0)<2&&type(Y0)<2){
                   4148:                                X0=abs(X0);Y0=abs(Y0);
                   4149:                        }else if(M==5){
                   4150:                                X0=str_len(rtostr(X0));Y0=str_len(rtostr(Y0));
                   4151:                        }else if(type(X0)==type(Y0)&&type(X0)>3&&type(X0)<7){
                   4152:                                if(M==1){
                   4153:                                        X0=length(X0);Y0=length(Y0);
                   4154:                                }else if(M==2){
                   4155:                                        LX=length(X0);LY=length(Y0);
                   4156:                                        L0=(LX<LY)?LX:LY;
                   4157:                                        for(I=0;;I++){
                   4158:                                                if(I==L0){
                   4159:                                                        X0=LX;Y0=LY;break;
                   4160:                                                }
                   4161:                                                if(X0[I]==Y0[I]) continue;
                   4162:                                                X0=X0[I];Y0=Y0[I];break;
                   4163:                                        }
                   4164:                                }
                   4165:                        }
                   4166:                }else if(type(M)==2){
                   4167:                        X0=(*M)(X0,Y0);Y0=0;
                   4168:                }else if(type(M)==4&&length(M)==1){
                   4169:                        X0=(*car(M))(X0);Y0=(*car(M))(Y0);
                   4170:                }
                   4171:                if(X0==Y0) continue;
                   4172:                return (X0<Y0)?-F:F;
                   4173:        }
                   4174:        return 0;
                   4175: }
                   4176:
                   4177: def msort(L,S)
                   4178: {
                   4179:        if(type(S)!=4) return qsort(L);
                   4180:        if(type(S[0])!=4) S=[S];
                   4181:        LQS=S;
                   4182:        return qsort(L,os_md.mqsub);
                   4183: }
                   4184:
1.22      takayama 4185: def lpair(A,B)
                   4186: {
                   4187:        if(B==0){
                   4188:                for(S=T=[];A!=[];A=cdr(A)){
                   4189:                        S=cons(car(A)[0],S);T=cons(car(A)[1],T);
                   4190:                }
                   4191:                return [reverse(S),reverse(T)];
                   4192:        }else{
                   4193:                for(R=[];A!=[];A=cdr(A),B=cdr(B))
                   4194:                        R=cons([car(A),car(B)],R);
                   4195:                return reverse(R);
                   4196:        }
                   4197: }
                   4198:
1.6       takayama 4199: def lmax(L)
                   4200: {
                   4201:        if(type(L)==4){
                   4202:                V=car(L);
                   4203:                while((L=cdr(L))!=[])
                   4204:                        if(V < car(L)) V=car(L);
                   4205:                return V;
                   4206:        }else if(type(L)==5||type(L)==6)
                   4207:                return lmax(m2l(L));
                   4208:        return [];
                   4209: }
                   4210:
                   4211: def lmin(L)
                   4212: {
                   4213:        if(type(L)==4){
                   4214:                V=car(L);
                   4215:                while((L=cdr(L))!=[])
                   4216:                        if(V > car(L)) V=car(L);
                   4217:                return V;
                   4218:        }else if(type(L)==5||type(L)==6)
                   4219:                return lmin(m2l(L));
                   4220:        return [];
                   4221: }
                   4222:
                   4223: def lgcd(L)
                   4224: {
                   4225:        if(type(L)==4){
                   4226:                F=getopt(poly);
                   4227:                V=car(L);
                   4228:                while((L=cdr(L))!=[]&&V!=1){
                   4229:                        if(V!=0)
                   4230:                                V=(F==1)?gcd(V,car(L)):igcd(V,car(L));
                   4231:                }
                   4232:                return V;
                   4233:        }else if(type(L)==5||type(L)==6)
                   4234:                return lgcd(m2l(L)|option_list=getopt());
                   4235:        return [];
                   4236: }
                   4237:
1.56      takayama 4238: def llcm(R)
                   4239: {
1.60      takayama 4240:        if(type(R)==5||type(R)==6) R=m2l(R);
1.56      takayama 4241:        if(type(R)<4) R=[R];
                   4242:        if(type(R)!=4) return 0;
                   4243:        V=getopt(poly);
                   4244:        if(type(V)<1){
                   4245:                for(L=R;L!=[];L=cdr(L)){
                   4246:                        if(type(car(L))>1){
                   4247:                                V=1; break;
                   4248:                        }
                   4249:                }
                   4250:        }
                   4251:        if(getopt(dn)!=1){
                   4252:                for(L=[];R!=[];R=cdr(R)) if(R!=0) L=cons(1/car(R),L);
                   4253:                R=L;
                   4254:        }
                   4255:        P=1;
                   4256:        if(type(V)<1){
                   4257:                for(;R!=[];R=cdr(R)){
                   4258:                        if(!(TL=car(R))) continue;
                   4259:                        else P=ilcm(P,dn(TL));
                   4260:                }
                   4261:                return P;
                   4262:        }
                   4263:        for(;R!=[];R=cdr(R)){
                   4264:                if(!car(R)) continue;
                   4265:                D=dn(red(car(R)));
                   4266:                N=red(P/D);
                   4267:                if(type(V)<2){
                   4268:                        if(type(N)!=3) continue;
                   4269:                        P*=dn(N);
                   4270:                        continue;
                   4271:                }
                   4272:                if(ptype(N,V)>2){
                   4273:                        L=fctr(dn(N));
                   4274:                        for(;L!=[];L=cdr(L)){
                   4275:                                if(ptype(car(L)[0],V)<2) continue;
                   4276:                                P*=car(L)[0]^car(L)[1];
                   4277:                        }
                   4278:                }
                   4279:        }
                   4280:        return P;
                   4281: }
1.6       takayama 4282:
                   4283: def ldev(L,S)
                   4284: {
                   4285:        M=abs(lmax(L));N=abs(lmin(L));
                   4286:        if(M<N) M=N;
                   4287:        for(C=0,LT=L;;C++){
                   4288:                LT=ladd(LT,S,1);
                   4289:                MT=abs(lmax(LT));NT=abs(lmin(LT));
                   4290:                if(MT<NT) MT=NT;
                   4291:                if(MT>=M) break;
                   4292:                M=MT;
                   4293:        }
                   4294:        if(!C){
                   4295:                for(C=0,LT=L;;C--){
                   4296:                        LT=ladd(LT,S,-1);
                   4297:                        MT=abs(lmax(LT));NT=abs(lmin(LT));
                   4298:                        if(MT<NT) MT=NT;
                   4299:                        if(MT>=M) break;
                   4300:                        M=MT;
                   4301:                }
                   4302:        }
                   4303:        return [C,ladd(L,S,C)];
                   4304: }
                   4305:
                   4306: def lchange(L,P,V)
                   4307: {
                   4308:        if(getopt(flat)==1&&type(P)==4){
                   4309:                for(L=ltov(L);P!=[];P=cdr(P),V=cdr(V))
                   4310:                        L[car(P)]=car(V);
                   4311:                return vtol(L);
                   4312:        }
                   4313:        if(type(P)==4){
                   4314:                IP=car(P); P=cdr(P);
                   4315:        }else{
                   4316:                IP=P; P=[];
                   4317:        }
                   4318:        for(I=0, LL=[], LT=L; LT!=[]; I++,LT=cdr(LT)){
                   4319:                if(I==IP){
                   4320:                        LL=cons((P==[])?V:lchange(car(LT),P,V),LL);
                   4321:                }else
                   4322:                        LL=cons(car(LT),LL);
                   4323:        }
                   4324:        return reverse(LL);
                   4325: }
                   4326:
                   4327: def lsol(VV,L)
                   4328: {
                   4329:        if(type(VV)<4 && type(L)==2)
                   4330:                return red(L-VV/mycoef(VV,1,L));
                   4331:        S = length(VV);
                   4332:        T = length(L);
                   4333:        V = llbase(VV,L);
                   4334:        for(J = K = 0; J < T; J++){
                   4335:                X = var(L[J]); N = deg(L[J],X);
                   4336:                for(I = K; I < S; I++){
                   4337:                        if((C=mycoef(V[I], N, X)) != 0){
                   4338:                                V[I] = [L[J],red(X^N-V[I]/C)];
                   4339:                                K++;
                   4340:                                break;
                   4341:                        }
                   4342:                }
                   4343:        }
                   4344:        return V;
                   4345: }
                   4346:
                   4347: def lnsol(VV,L)
                   4348: {
                   4349:        LL=lsort(vars(VV),L,1);
                   4350:        VV=ptol(VV,LL|opt=0);
                   4351:        return lsol(VV,L);
                   4352: }
                   4353:
                   4354:
                   4355: def ladd(X,Y,M)
                   4356: {
1.58      takayama 4357:        if(Y==0){
                   4358:                Y=X[1];X=X[0];
                   4359:        }
1.22      takayama 4360:        if(type(Y)==4) Y=ltov(Y);
1.6       takayama 4361:        if(type(X)==4) X=ltov(X);
                   4362:        return vtol(X+M*Y);
                   4363: }
                   4364:
                   4365: def mrot(X)
                   4366: {
1.22      takayama 4367:        if(type(X)==4){
                   4368:                if(getopt(deg)==1)
                   4369:                        X=[deval(@pi*X[0]/180),deval(@pi*X[1]/180),deval(@pi*X[2]/180)];
                   4370:                if(getopt(conj)==1)
                   4371:                        return mrot([-X[2],-X[1],0])*mrot([X[0],X[1],X[2]]);
                   4372:                if(X[1]==0){
                   4373:                        X=[X[0]+X[2],0,0];
                   4374:                        if(X[0]==0) return diagm(3,[1]);
                   4375:                }
                   4376:                if(X[0]!=0){
                   4377:                        M=mat([dcos(X[0]),-dsin(X[0]),0],[dsin(X[0]),dcos(X[0]),0],[0,0,1]);
                   4378:                        if(X[1]==0) return M;
                   4379:                }
                   4380:                N=mat([dcos(X[1]),0,-dsin(X[1])],[0,1,0],[dsin(X[1]),0,dcos(X[1])]);
                   4381:                if(X[0]!=0) N=M*N;
                   4382:                if(X[2]==0) return N;
                   4383:                return N*mrot([X[2],0,0]);
                   4384:        }
1.6       takayama 4385:        if(getopt(deg)==1) X=@pi*X/180;
                   4386:        X=deval(X);
1.22      takayama 4387:        return mat([dcos(X),-dsin(X)],[dsin(X),dcos(X)]);
1.6       takayama 4388: }
                   4389:
                   4390: def m2v(M)
                   4391: {
                   4392:        S = size(M);
                   4393:        V = newvect(S[0]*S[1]);
                   4394:        for(I = C = 0; I < S[0]; I++){
                   4395:                MI = M[I];
                   4396:                for(J = 0; J < S[1]; J++)
                   4397:                        V[C++] = MI[J];
                   4398:        }
                   4399:        return V;
                   4400: }
                   4401:
                   4402: def lv2m(L)
                   4403: {
                   4404:        if(type(L)==5) L=vtol(L);
                   4405:        II=length(L);
                   4406:        for(J=1,T=L; T!=[]; T=cdr(T))
                   4407:                if(length(car(T))>JJ) JJ=length(car(T));
                   4408:        M = newmat(II,JJ);
                   4409:        N = getopt(null);
                   4410:        if(type(N)<0)   N=0;
                   4411:        for(I=0; I<II; I++){
                   4412:                V=car(L); L=cdr(L);
                   4413:                for(J=length(V);--J>=0;)
                   4414:                        M[I][J] = V[J];
                   4415:                if(N!=0){
                   4416:                        for(J=length(V); J<JJ; J++)
                   4417:                                M[I][J]=N;
                   4418:                }
                   4419:        }
                   4420:        return M;
                   4421: }
                   4422:
                   4423: def m2lv(M)
                   4424: {
                   4425:        I=size(M)[0];
                   4426:        for(N=[],I=size(M)[0];I-->0;)
                   4427:                N=cons(M[I],N);
                   4428:        return N;
                   4429: }
                   4430:
                   4431: def s2m(S)
                   4432: {
                   4433:        if(type(S)==6) return S;
                   4434:        if(type(S)==7){
                   4435:                if(str_chr(S,0,"[")!=0) S=s2sp(S);
                   4436:                else if(str_chr(S,0,",")>=0) return eval_str(S);
                   4437:                else{
                   4438:                        for(L=LL=[],I=0; ; ){
                   4439:                                II=str_chr(S,I+2,"]");
                   4440:                                if(II<0) return 0;
                   4441:                                J=str_chr(S,I+2," ");
                   4442:                                while(str_chr(S,J+1," ")==J+1) J++;
                   4443:                                if(J>II-2 || J<0) J=II;
                   4444:                 V=eval_str(sub_str(S,I+1,J-1));
                   4445:                                L=cons(V,L);
                   4446:                                I=J;
                   4447:                                if(J==II){
                   4448:                                        LL=cons(ltov(reverse(L)),LL);
                   4449:                                        L=[];
                   4450:                                        if((I=str_chr(S,II+1,"["))<0)
                   4451:                                                return lv2m(reverse(LL));
                   4452:                                }
                   4453:                        }
                   4454:                }
                   4455:        }
                   4456:        if(type(S)==5) S=vtol(S);
                   4457:        if(type(S[0])==5) return lv2m(S);
                   4458:        I=length(S);
                   4459:        for(J=1,T=S; T!=[]; T=cdr(T))
                   4460:                if(length(car(T))>J) J=length(car(T));
                   4461:        return newmat(I,J,S);
                   4462: }
                   4463:
                   4464: def c2m(L,V)
                   4465: {
                   4466:        if(type(Pow=getopt(pow))!=1){
                   4467:                if(isvar(V)==1){
                   4468:                        for(Pow=0,LT=L;LT!=[];LT=cdr(LT)){
                   4469:                                if(mydeg(car(LT),V)>JJ) Pow=mydeg(car(LT),V);
                   4470:                        }
                   4471:                        JJ=Pow+1;
                   4472:                }else{
                   4473:                        Pow=-1;
                   4474:                        JJ=length(V);
                   4475:                }
                   4476:        }else JJ=Pow+1;
                   4477:        M=newmat(length(L),JJ);
                   4478:        for(I=0;L!=[];L=cdr(L),I++){
                   4479:                for(J=0;J<JJ;J++){
                   4480:                        LT=car(L);
                   4481:                        M[I][J]=(Pow>=0)?mycoef(LT,J,V):mycoef(LT,1,V[J]);
                   4482:                }
                   4483:        }
                   4484:        return M;
                   4485: }
                   4486:
                   4487: #if 0
                   4488: def m2diag(M,N)
                   4489: {
                   4490:        S = size(M);
                   4491:        MM = mtoupper(M,N);
                   4492:        for(I = S[0]-1; I >= 0; I--){
                   4493:                for(J = 0; I < S[1]-N; I++){
                   4494:                        if(MM[I][J] != 0){
                   4495:                                P = MM[I][J];
                   4496:                                for(K = 0; K < I; K++){
                   4497:                                        Q = -rmul(MM[K][J],1/P);
                   4498:                                        MM[K][J] = 0;
                   4499:                                        if(Q != 0){
                   4500:                                                for(L = J+1; L < S[1]; L++){
                   4501:                                                        if(MM[I][L] != 0)
                   4502:                                                                MM[K][L] = radd(MM[K][L], rmul(MM[I][L],Q));
                   4503:                                                }
                   4504:                                        }
                   4505:                                }
                   4506:                        }
                   4507:                }
                   4508:        }
                   4509:        return MM;
                   4510: }
                   4511: #endif
                   4512:
                   4513: def myinv(M)
                   4514: {
                   4515:        S = size(M);
                   4516:        if((T=S[0]) != S[1])
                   4517:                return 0;
                   4518:        MM = mtoupper(M,-T|opt=2);
                   4519:        if(MM[T-1][T-1] != 1) return 0;
                   4520:        return mperm(MM,0,[T,[T]]);
                   4521: }
                   4522:
                   4523: def madj(G,M)
                   4524: {
                   4525:        H=myinv(G);
                   4526:        if(type(M)==6)
                   4527:                return rmul(rmul(G,M),H);
                   4528:        if(type(M)==4||type(M)==5){
                   4529:                L=length(M);
                   4530:                N=newvect(L);
                   4531:                for(I=0;I<L;I++){
                   4532:                        N[I]=rmul(rmul(G,M[I]),H);
                   4533:                }
                   4534:                if(type(N)==4) N=vtol(N);
                   4535:                return N;
                   4536:        }
                   4537:        return -1;
                   4538: }
                   4539:
                   4540: def mpower(M,N)
                   4541: {
                   4542:        if(type(M)<=3) return (red(M))^N;
                   4543:        S = size(M);
                   4544:        if(S[0] != S[1])
                   4545:                return 0;
                   4546:        if(N == 0) return mgen(S[0],0,[1],0);
                   4547:        if(N < 0)
                   4548:                return(mpower(myinv(M), -N));
                   4549:        R = dupmat(M);
                   4550:        V=1;
                   4551:        for(V=1;;){
                   4552:                if(iand(N,1)){
                   4553:                        V=map(red,R*V);
                   4554:                        N--;
                   4555:                }
                   4556:                if((N/=2)==0) break;
                   4557:                R=map(red,R*R);
                   4558:        }
                   4559:        return V;
                   4560: }
                   4561:
                   4562: def texlen(S)
                   4563: {
                   4564:        if(type(S)!=7) return 0;
                   4565:        LF=I=J=0;
                   4566:        LM=str_len(S);
                   4567:        while((I=str_str(S,"\\frac{"|top=J))>=0){
                   4568:                if(I>J) LF+=texlen(str_cut(S,J,I-1));
                   4569:                I+=6;
                   4570:                for(F=L=0,J=I;F<2 && J<LM-1;F++){
                   4571:                        for(C=1;C>0 && J<LM;){
                   4572:                                if((K0=str_char(S,J,"}"))<0) K0=LM;
                   4573:                                if((K1=str_char(S,J,"{"))<0) K1=LM;
                   4574:                                if(K0<0 && K1<0){
                   4575:                                        J = str_len(S)-1;
                   4576:                                        break;
                   4577:                                }
                   4578:                                if(K0<K1){
                   4579:                                        J=K0+1; C--;
                   4580:                                }else{
                   4581:                                        J=K1+1; C++;
                   4582:                                }
                   4583:                        }
                   4584:                        T=str_cut(S,I,J-1);
                   4585:                        if(F==0){
                   4586:                                I=J=K1+1;C=1;
                   4587:                        }else J=K0+1;
                   4588:                        if(type(T)==7 && (LL=texlen(T))>L) L=LL;
                   4589:                }
                   4590:                LF+=L;
                   4591:        }
                   4592:        if(J>0) S=str_cut(S,J,str_len(S)-1);
                   4593:        if(S==0) return LF;
                   4594:        S=ltov(strtoascii(S));
                   4595:        L=LL=length(S);
                   4596:        for(I=F=0; I<L; I++){
                   4597:                if(S[I]==92) F=1;
                   4598:                else if(F==1){
                   4599:                        if((S[I]>96     && S[I]<123)||(S[I]>64 && S[I]<91))     LL--;
                   4600:                        else F=0;
                   4601:                }
                   4602:                if(S[I]<=32||S[I]==123||S[I]==125||S[I]==94||S[I]==38) LL--;    /* {}^& */
                   4603:                else if(S[I]==95){
                   4604:                        LL--;
                   4605:                        if(I+2<L && S[I+2]==94) LL--;   /* x_2^3 */
                   4606:                        else if(I+6<L && S[I+1]==123 && S[I+4]==125){   /* x_{11}^2 */
                   4607:                                 if(S[I+5]==94 || (S[I+5]==125 && S[I+6]==94)) LL--     ;       /* x_{11}}^2 */
                   4608:                        }
                   4609:                }
                   4610:        }
                   4611:        return LL+LF;
                   4612: }
                   4613:
                   4614: def isdif(P)
                   4615: {
                   4616:        if(type(P)<1 || type(P)>3) return 0;
                   4617:        for(Var=[],R=vars(P);R!=[];R=cdr(R)){
                   4618:                V0=rtostr(car(R));
                   4619:                if(V0>"d" && V0<"e"){
                   4620:                        V=sub_str(V0,1,str_len(V0)-1);
                   4621:                        if(V>="a" && V<"{")     Var=cons([strtov(V),strtov(V0)],Var);
                   4622:                }
                   4623:        }
                   4624:        if(Var==[]) return 0;
                   4625:        for(V=Var; V!=[]; V=cdr(V))
                   4626:                if(ptype(P,car(V)[1])==3) return 0;
                   4627:        return  Var;
                   4628: }
                   4629:
                   4630: def texsp(P)
                   4631: {
                   4632:        Q=strtoascii(P);
                   4633:        if((J=str_char(Q,0,92))<0 || (C=Q[L=str_len(P)-1])==32||C==41||C==125)
                   4634:                return P;
                   4635:        for(;;){
                   4636:                if((I=str_char(Q,J+1,92))<0) break;
                   4637:                J=I;
                   4638:        };
                   4639:        for(I=J+1;I<L&&isalpha(Q[I]);I++);
                   4640:        return(I==L)?P+" ":P;
                   4641: }
                   4642:
                   4643: def fctrtos(P)
                   4644: {
                   4645:        /* extern TeXLim; */
                   4646:        if(!chkfun("write_to_tb", "names.rr"))
                   4647:                return 0;
                   4648:
                   4649:        TeX = getopt(TeX);
                   4650:        if(TeX != 1 && TeX != 2 && TeX != 3)
                   4651:                TeX = 0;
1.70      takayama 4652:        if((Dvi=getopt(dviout)==1) && TeX<2) TeX=3;
1.6       takayama 4653:        if(TeX>0){
                   4654:                Lim=getopt(lim);
                   4655:                if(Lim!=0 && TeX>1 && (type(Lim)!=1||Lim<30)) Lim=TeXLim;
                   4656:                else if(type(Lim)!=1) Lim=0;
                   4657:                CR=(TeX==2)?"\\\\\n":"\\\\\n&";
1.70      takayama 4658:                CR2="\\allowdisplaybreaks"+CR;
                   4659:                if(TeX==1 || Lim==0) CR=CR2="";
                   4660:                else if((Pages=getopt(pages))==1) CR2=CR;
1.6       takayama 4661:                if(!chkfun("print_tex_form", "names.rr"))
                   4662:                        return 0;
                   4663:                Small=getopt(small);
                   4664:        }
                   4665:        Dif=getopt(dif);
                   4666:        Var=getopt(var);
                   4667:        if(Lim>0 && type(Var)<2 && TeX!=1)      Var=[strtov("0"),""];
                   4668:        Dif=0;
                   4669:        if(Var=="dif"){
                   4670:                Dif=DV=1;
                   4671:        }else if (Var=="dif0") Dif=1;
                   4672:        else if(Var=="dif1")  Dif=2;
                   4673:        else if(Var=="dif2")  Dif=3;
                   4674:        if(Dif>0){
                   4675:                for(Var=[],R=vars(P);R!=[];R=cdr(R)){
                   4676:                        V=rtostr(car(R));
                   4677:                        if(V>"d" && V<"e"){
                   4678:                                V=sub_str(V,1,str_len(V)-1);
                   4679:                                if(V>="a" && V<"{"){
                   4680:                                        if(TeX>0){
                   4681:                                                V=my_tex_form(strtov(V));
                   4682:                                                if(Dif>=1){
                   4683:                                                        if(Dif==1){
                   4684:                                                                if(str_len(V)==1) V="\\partial_"+V;
                   4685:                                                                else    V="\\partial_{"+V+"}";
                   4686:                                                        }
                   4687:                                                        Var=cons([car(R),V],Var);
                   4688:                                                }
                   4689:                                                else Var=cons([car(R)],Var);
                   4690:                                        }else Var=cons([car(R)],Var);
                   4691:                                }
                   4692:                        }
                   4693:                }
                   4694:                if(TeX>0){
                   4695:                        if(length(Var)==1){
                   4696:                                if(DV==1 && str_len(Var[0][1])==10) Var=[[Var[0][0],"\\partial"]];
                   4697:                        }else if(DV==1){
                   4698:                                for(V=Var;V!=[];V=cdr(V)){
                   4699:                                        VV=rtostr(car(V)[0]);
                   4700:                                        if(VV<"dx0" || VV>= "dx:" || str_len(VV)>4) break;
                   4701:                                }
                   4702:                                if(V==[]){
                   4703:                                        for(VT=[],V=Var;V!=[];V=cdr(V)){
                   4704:                                                VV=str_cut(rtostr(car(V)[0]),2,3);
                   4705:                                                if(str_len(VV)==1)      VT=cons([car(V)[0],"\\partial_"+VV],VT);
                   4706:                                                else    VT=cons([car(V)[0],"\\partial_{"+VV+"}"],VT);
                   4707:                                        }
                   4708:                                        Var=reverse(VT);
                   4709:                                }
                   4710:                        }else
                   4711:                                if(Dif==2 && length(Var)>1) Dif=3;
                   4712:                }
                   4713:                if(Dif>0)       Dif--;
                   4714:        }
                   4715:        if(type(Var)>1 && Var!=[]){     /* as a polynomial of Var */
                   4716:                Add=getopt(add);
                   4717:                if(type(Add)>0){
                   4718:                        if(type(Add)!=7){
                   4719:                                Add=my_tex_form(Add);
                   4720:                                if(str_char(Add,0,"-")>=0 || str_char(Add,0,"+")>=0) Add="("+Add+")";
                   4721:                        }
                   4722:                        if(str_char(Add,0,"(")!=0) Add = " "+Add;
                   4723:                }else Add=0;
                   4724:                if(type(Var)!=4) Var=[Var];
                   4725:                if(length(Var)==2 && type(Var[1]) == 7)
                   4726:                        Var = [Var];
                   4727:                for(VV=VD=[]; Var!=[];Var=cdr(Var)){
                   4728:                        VT=(type(car(Var))==4)?car(Var):[car(Var)];
                   4729:                        VT0=var(car(VT));
                   4730:                        VV=cons(VT0,VV);
                   4731:                        if(length(VT)==1){
                   4732:                                VD=cons((TeX>=1)?my_tex_form(VT0):rtostr(VT0),VD);
                   4733:                        }else   VD=cons(VT[1],VD);
                   4734:                }
                   4735:                VV=reverse(VV);VD=reverse(VD);
                   4736:                Rev=(getopt(rev)==1)?1:0;
1.70      takayama 4737:                Rdic=0;
                   4738:                if((Dic=getopt(dic))==2){
                   4739:                        Dic=Rdic=1;
                   4740:                }else if(Dic!=1) Dic=0;
1.6       takayama 4741:                TT=terms(P,VV|rev=Rev,dic=Dic);
                   4742:                if(TeX==0){
                   4743:                        Pre="("; Post=")";
                   4744:                }else{
                   4745:                        Pre="{"; Post="}";
                   4746:                }
                   4747:                Out = string_to_tb("");
1.70      takayama 4748:                for(L=C=CC=0,Tm=TT;Tm!=[];C++,Tm=cdr(Tm)){
1.6       takayama 4749:                        for(I=0,PC=P,T=cdr(car(Tm)),PW="";T!=[];T=cdr(T),I++){
                   4750:                                PC=mycoef(PC,D=car(T),VV[I]);
                   4751:                                if(PC==0) continue;
                   4752:                                PT="";
                   4753:                                if(D!=0 && VD[I]!=""){
                   4754:                                        if(TeX==0 && PW!="") PW+="*";
                   4755:                                        if(D>1){
                   4756:                                                if(D>9) PT="^"+Pre+rtostr(D)+Post;
                   4757:                                                else    PT="^"+rtostr(D);
                   4758:                                        }
                   4759:                                        if(Dif>0)       PW+=(Dif==1)?"d":"\\partial ";
1.70      takayama 4760:                                        if(Rdic) PW=VD[I]+PT+PW;
                   4761:                                        else PW+=VD[I]+PT;
1.6       takayama 4762:                                }
                   4763:                        }
                   4764:                        D=car(Tm)[0];
                   4765:                        if(Dif>0 && D>0){
                   4766:                                Op=(Dif==1)?"\\frac{d":"\\frac{\\partial";
                   4767:                                if(D>1) Op+="^"+((D>9)?(Pre+rtostr(D)+Post):rtostr(D));
                   4768:                                PW=Op+Add+"}{"+PW+"}";
                   4769:                        }else if(Add!=0) PW=PW+Add;
1.69      takayama 4770:                        CD=0;
1.6       takayama 4771:                        if(TeX>=1){
                   4772:                                if(type(PC)==1 && ntype(PC)==0 && PC<0)
                   4773:                                        OC="-"+my_tex_form(-PC);
                   4774:                                else OC=fctrtos(PC|TeX=1,br=1);
1.69      takayama 4775:                                if(isint(PC)&&(PC<-1||PC>1)) CD=1;
1.6       takayama 4776:                        }else   OC=fctrtos(PC|br=1);
                   4777:                        if(PW!=""){
                   4778:                                if(OC == "1")        OC = "";
                   4779:                                else if(OC == "-1")  OC = "-";
                   4780:                        }
                   4781:                        if(TeX==0 && D!=0 && OC!="" && OC!="-") PW= "*"+PW;
                   4782:                        if((TOC=type(OC)) == 4){        /* rational coef. */
                   4783:                                if(Lim>0 && (texlen(OC[0])>Lim || texlen(OC[0])>Lim)){
                   4784:                                        OC = (Small==1)?"("+OC[0]+")/("+OC[1]+")"
                   4785:                                                        :"\\Bigl("+OC[0]+"\\Bigr)\\Bigm/\\Bigl("+OC[1]+"\\Bigr)";
                   4786:                                        TOC = 7;
                   4787:                                }else{
                   4788:                                        if(str_char(OC[0],0,"-")==0){
                   4789:                                                OC = fctrtos(-PC|TeX=1,br=1);
                   4790:                                                OC = "-\\frac{"+OC[0]+"}{"+OC[1]+"}";
                   4791:                                        }
                   4792:                                        else
                   4793:                                                OC = "\\frac{"+OC[0]+"}{"+OC[1]+"}";
                   4794:                                }
                   4795:                        }
                   4796:                        if(Lim>0){
1.70      takayama 4797:                                CC++;
1.6       takayama 4798:                                LL=texlen(OC)+texlen(PW);
                   4799:                                if(LL+L>=Lim){
                   4800:                                        if(L>0) str_tb(CR,Out);
                   4801:                                        if(LL>Lim){
1.70      takayama 4802:                                                if(TOC==7)      OC=texlim(OC,Lim|cut=[CR,CR2]);
1.73      takayama 4803:                                                if(length(Tm)!=1) PW+=CR;
                   4804:                                                L=0;
1.6       takayama 4805:                                        }else L=LL;
                   4806:                                }else L+=LL;
1.70      takayama 4807:                        }else if(length(Tm)!=1){
                   4808:                                CC++;
                   4809:                                PW += CR;       /* not final term */
                   4810:                        }
                   4811:                        if(CC>TeXPages) CR=CR2;
1.69      takayama 4812:                        if(TeX){
                   4813:                                OC=texsp(OC);
                   4814:                                if(CD){  /* 2*3^x */
                   4815:                                        CD=strtoascii(str_cut(PW,0,1));
                   4816:                                        if(length(CD)==2&&car(CD)==123&&isnum(CD[1])) OC+="\\cdots";
                   4817:                                }
                   4818:                        }
1.6       takayama 4819:                        if(str_chr(OC,0,"-") == 0 || C==0)      str_tb([OC,PW], Out);
                   4820:                        else{
                   4821:                                str_tb(["+",OC,PW],Out);
                   4822:                                if(LL<=Lim) L++;
                   4823:                        }
                   4824:                }
                   4825:                S=str_tb(0,Out);
                   4826:                if(S=="") S="0";
                   4827:        }else{          /* Var is not specified */
                   4828:                if((TP=type(P)) == 3){  /* rational function */
                   4829:                        P = red(P); Nm=nm(P); Dn=dn(P);
                   4830:                        Q=dn(ptozp(Nm|factor=1)[1]);
                   4831:                        if(Q>1){
                   4832:                                Nm*=Q;Dn*=Q;
                   4833:                        }
                   4834:                        if(TeX>0){
                   4835:                                return (TeX==2)?
                   4836:                                "\\frac\{"+fctrtos(Nm|TeX=1)+"\}\{"+fctrtos(Dn|TeX=1)+"\}"
                   4837:                                :[fctrtos(Nm|TeX=1),fctrtos(Dn|TeX=1)];
                   4838:                        }
                   4839:                        else{
                   4840:                                S=fctrtos(Nm);
                   4841:                                if(nmono(Nm)>1) S="("+S+")";
                   4842:                                return S+"/("+fctrtos(Dn)+")";
                   4843:                        }
                   4844:                }
                   4845:                if(imag(P)==0) P = fctr(P);             /* usual polynomial */
                   4846:                else P=[[P,1]];
                   4847:                S = str_tb(0,0);
1.69      takayama 4848:                for(J = N = CD = 0; J < length(P); J++){
                   4849:                        if(type(V=P[J][0]) <= 1){
                   4850:                                if(V == -1){
1.6       takayama 4851:                                        write_to_tb("-",S);
                   4852:                                        if(length(P) == 1)
                   4853:                                                str_tb("1", S);
1.69      takayama 4854:                                }else if(V != 1){
                   4855:                                        str_tb((TeX>=1)?my_tex_form(V):rtostr(V), S);
1.6       takayama 4856:                                        N++;
                   4857:                                }else if(length(P) == 1)
                   4858:                                        str_tb("1", S);
                   4859:                                else if(getopt(br)!=1 && length(P) == 2 && P[1][1] == 1){
                   4860:                                        str_tb((TeX>=1)?my_tex_form(P[1][0]):rtostr(P[1][0]), S);
                   4861:                                        J++;
                   4862:                                }
1.69      takayama 4863:                                if(J==0&&isint(V=P[J][0])&&(V<-1||V>1)) CD=1;
1.6       takayama 4864:                                continue;
                   4865:                        }
                   4866:                        if(N > 0 && TeX != 1 && TeX != 2 && TeX != 3)
                   4867:                                write_to_tb("*", S);
                   4868:                        SS=(TeX>=1)?my_tex_form(P[J][0]):rtostr(P[J][0]);
                   4869:                        N++;
                   4870:                        if(P[J][1] != 1){               /* (log(x))^2 */
                   4871:                                if(nmono(P[J][0])>1||
                   4872:                                        (!isvar(P[J][0])||vtype(P[J][0]))&&str_len(SS)>1) SS="("+SS+")";
                   4873:                                write_to_tb(SS,S);
1.70      takayama 4874:                                str_tb(["^", (TeX>=1)?rtotex(P[J][1]):monotos(P[J][1])],S);
1.6       takayama 4875:                        }else{
1.70      takayama 4876:                                if(nmono(P[J][0])>1&&length(P)>1) SS="("+SS+")";
1.69      takayama 4877:                                else if(CD&&J==1){ /* 2*3^x */
                   4878:                                        CD=strtoascii(str_cut(SS,0,1));
                   4879:                                        if(length(CD)==2&&car(CD)==123&&isnum(CD[1])) SS="\\cdot"+SS;
                   4880:                                }
1.6       takayama 4881:                                write_to_tb(SS,S);
                   4882:                        }
                   4883:                }
                   4884:                S = str_tb(0,S);
1.70      takayama 4885:                if((Lim>0 || TP!=2) && CR!="")  S=texlim(S,Lim|cut=[CR,CR2]);
1.6       takayama 4886:        }
                   4887:        if(TeX>0){
                   4888:                if(Small==1)    S=str_subst(S,"\\frac{","\\tfrac{");
                   4889:                if(Dvi==1){
1.70      takayama 4890:                        dviout(strip(S,"(",")")|eq=(Pages==1||Pages==2)?6:0); S=1;
1.6       takayama 4891:                }
                   4892:        }
                   4893:        return S;
                   4894: }
                   4895:
                   4896: def strip(S,S0,S1)
                   4897: {
                   4898:        SS=strtoascii(S);
                   4899:        if(length(SS)>1){
                   4900:                if(SS[0]==40&&SS[length(SS)-1]==41&&str_pair(SS,1,S0,S1)==length(SS)-1)
                   4901:                        S=str_cut(SS,1,length(SS)-2);
                   4902:        }
                   4903:        return S;
                   4904: }
                   4905:
                   4906: def texlim(S,Lim)
                   4907: {
                   4908:        /* extern TeXLim;       */
                   4909:        if(S==1 && Lim>10){
                   4910:                TeXLim=Lim;
                   4911:                mycat(["Set TeXLim =",Lim]);
                   4912:                return 1;
                   4913:        }
1.70      takayama 4914:        if(type(Out=getopt(cut))!=7){
                   4915:                if(type(Out)!=4) Out=Out2="\\\\\n&";
                   4916:                else{
                   4917:                        Out2=Out[1];Out=Out[0];
                   4918:                }
                   4919:        }
1.6       takayama 4920:        if(type(Del=getopt(del))!=7)    Del=Out;
                   4921:        if(Lim<30)      Lim=TeXLim;
                   4922:        S=ltov(strtoascii(S));
                   4923:        for(L=[0],I=F=0;F==0; ){
                   4924:                II=str_str(S,Del|top=I)+2;
                   4925:                if(II<2){
                   4926:                        F++;II=/* str_len(S) */ length(S)-1;
                   4927:                }
                   4928:                for(J=JJ=I+1;;JJ=K+1){
                   4929:                        K=str_char(S,JJ,43);    /* + */
                   4930:                        if((K1=str_char(S,JJ,45))>2 && K1<K){   /* - */
                   4931:                                if(S[K1-1]!=123 && S[K1-1]!=40) K=K1;   /* {, ( */
                   4932:                        }
                   4933:                        if((K1=str_char(S,JJ,40))>0 && K1-JJ>6 && K1<K && S[K1-1]!=43 && S[K1-1]!=45){  /* ( */
                   4934:                                T=str_char(S,K1-6,"\\");  /* \Big*(, \big*( */
                   4935:                                if((T==K1-6 || T==K1-5)
                   4936:                                  && (str_str(S,"big"|top=T+1,end=T+1)>0 || str_str(S,"Big"|top=T+1,end=T+1)>0))
                   4937:                                        K=T;
                   4938:                                else if(K1>0 && K1<K) K=K1;
                   4939:                        }
                   4940:                        if(K<0 || K>II) break;
                   4941:                        if(K-J>Lim && texlen(str_cut(S,J,K-1))>=Lim){
                   4942:                                J=K+1; L=cons(JJ-1,L); SL=0;
                   4943:                        }
                   4944:                }
                   4945:                I=II;
                   4946:        }
                   4947:        SS=str_tb(0,0);
                   4948:        L=cons(length(S),L);
                   4949:        L=reverse(L);
1.70      takayama 4950:        if(length(L)>TeXPages) Out=Out2;
1.6       takayama 4951:        for(I=0; L!=[]; I=J,L=cdr(L)){
                   4952:                str_tb((I==0)?"":Out,SS);
                   4953:                J=car(L);
                   4954:                str_tb(str_cut(S,I,J-1),SS);
                   4955:        }
                   4956:        return str_tb(0,SS);
                   4957: }
                   4958:
                   4959: def fmult(FN,M,L,N)
                   4960: {
                   4961:        Opt=getopt();
                   4962:        for(I = 0; I < length(M); I++)
                   4963:                M = call(FN, cons(M,cons(L[I],N))|option_list=Opt);
                   4964:        return M;
                   4965: }
                   4966:
                   4967: def radd(P,Q)
                   4968: {
                   4969:        if(type(P) <= 3 || type(Q) <= 3){
                   4970:                if(type(P) >= 5)
                   4971:                         return radd(Q,P);
                   4972:                if(type(Q) >= 5){
                   4973:                        R = dupmat(Q);
                   4974:                        if(P == 0)
                   4975:                                return R;
                   4976:                        if(type(Q) == 6){
                   4977:                                S = size(Q);
                   4978:                                if(S[0] != S[1])
                   4979:                                        return 0;
                   4980:                                for(I = 0; I < S[0]; I++)
                   4981:                                        R[I][I]  = radd(R[I][I], P);
                   4982:                        }else{
                   4983:                                for(I = length(R)-1; I >= 0; I--)
                   4984:                                        R[I] = radd(R[I],P);
                   4985:                        }
                   4986:                        return R;
                   4987:                }
                   4988:                /* P=red(P);Q=red(Q); */
                   4989:                if((P1=dn(P)) == (Q1=dn(Q))){
                   4990:                        if(P1==1) return P+Q;
                   4991:                        return red((nm(P)+nm(Q))/P1);
                   4992:                }
                   4993:                R=gcd(P1,Q1);S=tdiv(P1,R);
                   4994:                return red((nm(P)*tdiv(Q1,R)+nm(Q)*S)/(S*Q1));
                   4995:        }
                   4996:        if(type(P) == 5){
                   4997:                S = length(P);
                   4998:                R = newvect(S);
                   4999:                for(I = 0; I < S; I++)
                   5000:                        R[I] = radd(P[I],Q[I]);
                   5001:                return R;
                   5002:        }
                   5003:        if(type(P) == 6){
                   5004:                S = size(P);
                   5005:                R = newmat(S[0],S[1]);
                   5006:                for(I = 0; I < S[0]; I++){
                   5007:                        for(J = 0; J < S[1]; J++)
                   5008:                                R[I][J] = radd(P[I][J],Q[I][J]);
                   5009:                }
                   5010:                return R;
                   5011:        }
                   5012:        erno(0);
                   5013: }
                   5014:
                   5015: def getel(M,I)
                   5016: {
                   5017:        if(type(M) >= 4 && type(M) <= 6 && type(I) <= 1)
                   5018:                return M[I];
                   5019:        if(type(M) == 6 && type(I) == 5)
                   5020:                return M[I][J];
                   5021:        return M;
                   5022: }
                   5023:
                   5024: def ptol(P,X)
                   5025: {
                   5026:        F=(getopt(opt)==0)?0:1;
                   5027:        if(type(P) <= 3)
                   5028:                P = [P];
                   5029:        if(type(X) == 4){
                   5030:                for( ; X != []; X = cdr(X))
                   5031:                        P=ptol(P,car(X)|opt=F);
                   5032:                return P;
                   5033:        }
                   5034:        P = reverse(P);
                   5035:        for(R=[]; P != []; P = cdr(P)){
                   5036:                Q = car(P);
                   5037:                for(I = mydeg(Q,X); I >= 0; I--){
                   5038:                        S=mycoef(Q,I,X);
                   5039:                        if(F==1 || S!=0) R = cons(S,R);
                   5040:                }
                   5041:        }
                   5042:        return R;
                   5043: }
                   5044:
                   5045: def rmul(P,Q)
                   5046: {
                   5047:        if(type(P) <= 3 && type(Q) <= 3){
                   5048:                P=red(P);Q=red(Q);
                   5049:                P1=dn(P);P2=nm(P);Q1=dn(Q);Q2=nm(Q);
                   5050:                if(P1==1 && Q1==1)
                   5051:                        return P*Q;
                   5052:                if((R=gcd(P1,Q2)) != 1){
                   5053:                        P1=tdiv(P1,R);Q2=tdiv(Q2,R);
                   5054:                }
                   5055:                if((R=gcd(Q1,P2)) != 1){
                   5056:                        Q1=tdiv(Q1,R);P2=tdiv(P2,R);
                   5057:                }
                   5058:                return P2*Q2/(P1*Q1);
                   5059:        }
                   5060: #ifdef USEMODULE
                   5061:        return mmulbys(os_md.rmul,P,Q,[]);
                   5062: #else
                   5063:        return mmulbys(rmul,P,Q,[]);
                   5064: #endif
                   5065: }
                   5066:
                   5067: def mtransbys(FN,F,LL)
                   5068: {
                   5069:        Opt=getopt();
                   5070:        if(type(F) == 4){
                   5071:                F = ltov(F);
                   5072:                S = length(F);
                   5073:                R = newvect(S);
                   5074:                for(I = 0; I < S; I++)
                   5075:                        R[I] = mtransbys(FN,F[I],LL|option_list=Opt);
                   5076:                return vtol(R);
                   5077:        }
                   5078:        if(type(F) == 5){
                   5079:                S = length(F);
                   5080:                R = newvect(S);
                   5081:                for(I = 0; I < S; I++)
                   5082:                        R[I] = mtransbys(FN,F[I],LL|option_list=Opt);
                   5083:                return R;
                   5084:        }
                   5085:        if(type(F) == 6){
                   5086:                S = size(F);
                   5087:                R = newmat(S[0],S[1]);
                   5088:                for(I = 0; I < S[0]; I++){
                   5089:                        for(J = 0; J < S[1]; J++)
                   5090:                        R[I][J] = mtransbys(FN,F[I][J],LL|option_list=Opt);
                   5091:                }
                   5092:                return R;
                   5093:        }
                   5094:        if(type(F) == 7) return F;
                   5095:        return call(FN, cons(F,LL)|option_list=Opt);
                   5096: }
                   5097:
1.58      takayama 5098: def trcolor(S)
                   5099: {
                   5100:        if(type(S)!=7) return S;
                   5101:        return ((I=findin(S,LCOPT))>=0)?COLOPT[I]:0;
                   5102: }
                   5103:
1.61      takayama 5104: def mcolor(L,P)
                   5105: {
                   5106:        if(type(L)!=4) return L;
                   5107:        if(!P||(S=length(L))==1){
                   5108:                if(type(V=car(L))!=7) return V;
                   5109:                return trcolor(V);
                   5110:        }
                   5111:        P-=ceil(P)-1;
                   5112:        if(P==1){
                   5113:                if(type(V=L[S-1])!=7) return V;
                   5114:                return trcolor(V);
                   5115:        }
                   5116:        for(S=P*(S-1);S>1;S--,L=cdr(L));
                   5117:        if(getopt(disc)==1) S=0;
                   5118:        if(type(L0=L[0])==7) L0=trcolor(L0);
                   5119:        if(type(L1=L[1])==7) L1=trcolor(L1);
                   5120:        T=rint(iand(L0,0xff)*(1-S)+iand(L1,0xff)*S);
                   5121:        TT=iand(L0,0xff00)*(1-S)+iand(L1,0xff00)*S;
                   5122:        T+=rint(TT/0x100)*0x100;
                   5123:        TT=iand(L0,0xff0000)*(1-S)+iand(L1,0xff0000)*S;
                   5124:        return T+rint(TT/0x10000)*0x10000;
                   5125: }
                   5126:
1.6       takayama 5127: def drawopt(S,T)
                   5128: {
                   5129:        if(type(S)!=7) return -1;
                   5130:        if(T==0||T==1){
                   5131:                for(I=0,R=LCOPT;I<7;I++,R=cdr(R))
                   5132:                        if(str_str(S,car(R))>=0) return(T==0)?COLOPT[I]:car(R);
                   5133:                return -1;
                   5134:        }
                   5135:        if(T==2){
                   5136:                V0=V1=0;
                   5137:                for(I=0,R=LPOPT;R!=[];I++,R=cdr(R)){
                   5138:                        if(str_str(S,car(R))>=0){
                   5139:                                if(I==0) V1++;
                   5140:                                else if(I==1) V1--;
                   5141:                                else if(I==2) V0--;
                   5142:                                else V0++;
                   5143:                        }
                   5144:                }
                   5145:                if(V0==0&&V1==0) return -1;
                   5146:                return [V0,V1];
                   5147:        }
                   5148:        if(T==3){
                   5149:                V=0;
                   5150:                for(I=1,R=LFOPT;R!=[];R=cdr(R),I*=2){
                   5151:                        if(str_str(S,car(R))>=0) V+=I;
                   5152:                }
                   5153:                return (V==0)?-1:V;
                   5154:        }
                   5155:        return -1;
                   5156: }
                   5157:
1.58      takayama 5158: def openGlib(W)
                   5159: {
                   5160:        extern Glib_canvas_x;
                   5161:        extern Glib_canvas_y;
                   5162:        extern Glib_math_coordinate;
                   5163:
                   5164:        if(W==0){
                   5165:                glib_clear();
                   5166:                return;
                   5167:        }
                   5168:        if(type(W)==4&&length(W)==2){
                   5169:                Glib_canvas_x=W[0];
1.67      takayama 5170:                Glib_canvas_y=W[1];
1.58      takayama 5171:        }
                   5172:        Glib_math_coordinate=1;
                   5173:        if(getopt(null)!=1) return glib_open();
                   5174: }
                   5175:
1.6       takayama 5176: def execdraw(L,P)
                   5177: {
                   5178:        if((Proc=getopt(proc))!=1) Proc=0;
                   5179:        if(type(P)<2) P=[P];
                   5180:        if(L!=[]&&type(L[0])!=4) L=[L];
                   5181:                /* special command */
                   5182:        if(P[0]<0){
                   5183:                if(length(P)==1&&(P[0]==-1||P[0]==-2||P[0]==-3)){       /* Bounding Box */
                   5184:                        W=WS=N=LS=0;
                   5185:                        for(LL=L;LL!=[];LL=cdr(LL)){
                   5186:                                T=car(LL);
                   5187:                                if(P[0]!=-3 && T[0]==0){
                   5188:                                        if(length(T)>3) S="  by "+rtostr(T[3])+" cm";
                   5189:                                        else S="";
                   5190:                                        if(P[0]==-1){
                   5191:                                                mycat(["Windows : ",T[1][0],"< x <",T[1][1],", ",
                   5192:                                                        T[2][0],"< y <",T[2][1],S]);
                   5193:                                                if(length(T)>4 && type(T[4])==4) mycat(["ext :",T[4]]);
                   5194:                                                if(length(T)>5) mycat(["shift :",T[5]]);
                   5195:                                        }
                   5196:                                        return cdr(T);
                   5197:                                }
                   5198:                                if(type(T[0])==1){
                   5199:                                        if(T[0]==1){
                   5200:                                                for(TT=cdr(cdr(T));TT!=[];TT=cdr(TT)){
                   5201:                                                        D=car(TT);
                   5202:                                                        if(type(D[0][0])==4){
                   5203:                                                                for(DT=D;DT!=[];DT=cdr(DT)){
                   5204:                                                                        if(N++==0) W=ptbbox(car(DT));
                   5205:                                                                        else W=ptbbox(car(DT)|box=W);
                   5206:                                                                }
                   5207:                                                        }else{
                   5208:                                                                if(N++==0) W=ptbbox(D);
                   5209:                                                                else W=ptbbox(D|box=W);
                   5210:                                                        }
                   5211:                                                }
                   5212:                                        }else if(T[0]==2){
                   5213:                                                V=T[2];
                   5214:                                                if(type(V[0])>1||type(V[1])>1) continue;  /* not supported */
                   5215:                                                if((Sc=delopt(T[1],"scale"|inv=1))!=[]){
                   5216:                                                        Sc=car(Sc)[1];
                   5217:                                                        if(type(Sc)==1) V=[Sc*V[0],Sc*V[1]];
                   5218:                                                        else V=[Sc[0]*V[0],Sc[1]*V[1]];
                   5219:                                                }
                   5220:                                                if(LS==0) WS=ptbbox([V]);
                   5221:                                                else WS=ptbbox([V]|box=WS);
                   5222:                                                if(length(T)>4) S=T[4];
                   5223:                                                else if(type(S=T[3])==4){
                   5224:                                                        S=S[0];
                   5225:                                                        if(type(S)==4) S=S[length(S)-1];
                   5226:                                                        S=rtostr(S);
                   5227:                                                }
                   5228:                                                if(str_len(S)>LS) LS=str_len(S);
                   5229:                                        }else if(T[0]==3||T[0]==4){
                   5230:                                                if(N++==0) W=ptbbox(cdr(cdr(T)));
                   5231:                                                else W=ptbbox(cdr(cdr(T))|box=W);
                   5232:                                        }
                   5233:                                }
                   5234:                        }
                   5235:                        if(W!=0&&WS!=0) W=ptbbox([W,WS]|box=1);
                   5236:                        return (P[0]==-3)?[W,LS,WS]:W;
                   5237:                }else if(length(P)>1&&P[0]==-1){        /* set Bounding Box */
                   5238:                        P=cons(0,cdr(P));
                   5239:                        Ex=Sft=[0,0];
                   5240:                        if(type(X=getopt(ext))==4) Ex=X;
                   5241:                        if(type(X=getopt(shift))==4) Sft=X;
                   5242:                        if(Ex!=Sft||Ex!=[0,0]){
                   5243:                                if(Sft==[0,0]) Sft=[Ex];
                   5244:                                else Sft=[Ex,Sft];
                   5245:                                if(length(P)==3) Sft=cons(1,Sft);
                   5246:                                if(length(P)==3||length(P)==4) P=append(P,Sft);
                   5247:                        }
                   5248:                        return cons(P,delopt(L,0));
                   5249:                }
                   5250:                if(P[0]==-4){
                   5251:                        for(N=0,LT=L;LT!=[];LT=cdr(LT)){        /* count coord. */
                   5252:                                T=car(LT);
                   5253:                                if(T[0]==1){
                   5254:                                        for(T=cdr(cdr(T));T!=[];T=cdr(T)){
                   5255:                                                if(type((S=car(T))[0][0])==4) N+=length(S);
                   5256:                                                else for(;S!=[];S=cdr(S)) if(type(car(S))==4) N++;
                   5257:                                        }
                   5258:                                }else if(T[0]==2) N++;
                   5259:                                else if(T[0]==3||T[0]==4) N+=2;
                   5260:                        }
                   5261:                        return N;
                   5262:                }
                   5263:                if(P[0]==-5){                                           /* functions */
                   5264:                        for(N=0,R=[],LT=L;LT!=[];LT=cdr(LT)){
                   5265:                                T=car(LT);
                   5266:                                if(T[0]==0) N=ior(N,1);
                   5267:                                else if(type(T[0])==1){
                   5268:                                        if(T[0]>0) N=ior(N,2^T[0]);
                   5269:                                }
                   5270:                                else if(Type(T[0])==2){
                   5271:                                        if(findin(T[0],R)<0) R=cons(T[0],R);
                   5272:                                }
                   5273:                        }
                   5274:                        for(I=5;I>=0;I--) if(iand(N,2^I)) R=cons(I,R);
                   5275:                        return R;
                   5276:                }
                   5277:                return 0;
                   5278:        }
                   5279:
                   5280:        if(length(P)>1){
                   5281:                if(type(P[1])==6||(type(P[1])<2&&P[1]>0)) M=P[1];
                   5282:                else if(type(P[1])==4&&length(P[1])==2) M=diagm(2,P[1]);
                   5283:        }
                   5284:        if(length(P)>2&&type(P[2])==4){
                   5285:                Org=[["shift",P[2]]];
                   5286:                if(M==0) M=1;
                   5287:        }else Org=[];
                   5288:        if(P[0]==0||(type(P[0])==4&&P[0][0]==0)){               /* Risa/Asir */
                   5289:                PP=car(P);PPP=0;
                   5290:                if(type(PP)!=4) PP=[PP];
                   5291:                if(length(PP)<3){
                   5292:                        if(length(PP)==1 || type(PP[1])==4){
                   5293:                                if(ID_PLOT<0) ID_PLOT=ox_launch_nox(0,"ox_plot");
                   5294:                                Id=ID_PLOT;
                   5295:                                if(length(PP)==1&&type(Canvas)==4&&length(Canvas)==2)
                   5296:                                        PP=cons(PP[0],[Canvas]);
                   5297:                                if(length(PP)>1){
                   5298:                                        PPP=PP[1][0];
                   5299:                                        PPQ=(length(PP[1])==2)?PP[1][1]:PPP;
                   5300:                                        open_canvas(Id,[PPP,PPQ]);
                   5301:                                }else open_canvas(Id);
                   5302:                                Ind=ox_pop_cmo(Id);
                   5303:                        }else{
                   5304:                                Ind=PP[1];
                   5305:                                if(getopt(cl)==1) clear_canvas(Id,Ind);
                   5306:                        }
                   5307:                }else{
                   5308:                        Id=PP[1];Ind=PP[2];
                   5309:                        if(length(PP)>3 && type(PP[3])==1) PPP=PP[3];
                   5310:                        if(length(PP)>4 && type(PP[4])==1) PPQ=PP[4];
                   5311:                        if(getopt(cl)==1) clear_canvas(Id,Ind);
                   5312:                }
                   5313:                if(L==[]) return (PPP>0)? [0,Id,Ind,PPP,PPQ]:[0,Id,Ind];
                   5314:                Ex0=Ex0;Sft=[0,0];
                   5315:                if(length(P)>1&&P[1]==0&&length(P)<4){
                   5316:                        R=execdraw(L,-3);
                   5317:                        Ex0=Ex1=Ex2=10;
                   5318:                        if((U=R[1])>0){         /* string */
                   5319:                                if(U>20) U=16;                                  /* adj 16,8,2,7,15 */
                   5320:                                if(R[0][0][0]>R[2][0][0]-(R[0][0][1]-R[0][0][0])/256) Ex0+=8*U; /* adj 256 */
                   5321:                                else Ex0+=2*U;
                   5322:                                if(R[0][0][1]<R[2][0][1]+(R[0][0][1]-R[0][0][0])/256) Ex1+=7*U;
                   5323:                                else Ex1+=2*U;
                   5324:                                if(R[0][1][1]<R[2][1][1]+(R[0][1][1]-R[0][1][0])/256) Ex2+=15;
                   5325:                        }
                   5326:                        R=[R[0][0],R[0][1],0,[Ex0,Ex1],[0,-Ex2]];
                   5327:                        if(length(P)>2 && P[2]==1)
                   5328:                                mycat0(["Box:",[R[0],R[1]], ",  ext=",R[3],",  shift=",R[4]],1);
                   5329:                }else R=execdraw((length(P)>3)?P[3]:L,-2);      /* Windows */
                   5330:                XW=R[0];YW=R[1];
                   5331:                if(length(R)>3){
                   5332:                        if(R[3]!=0 && R[3]!=[0,0]) Ex=R[3];
                   5333:                        if(length(R)>4) Sft=R[4];
                   5334:                }
                   5335:                if(type(X=getopt(ext))==4)
                   5336:                        Ex=(Ex0)?[X[0]+Ex[0],X[1]+Ex[1]]:X;
                   5337:                if(type(M)<2){
                   5338:                        if(length(P)>1&&type(P[1])==1) M=P[1];
                   5339:                        else if((length(P)==1||P[1]==0||P[1]==1)&& PPP>0) M=PPP;
                   5340:                        if(M<2) M=400;
                   5341:                        if(Ex!=0 && type(Ex)==4){
                   5342:                                M-=Ex[0]+Ex[1];
                   5343:                        }
                   5344:                        M=(M/(XW[1]-XW[0]))*diagm(2,[1,-1]);
                   5345:                }
                   5346:                if(type(X=getopt(shift))==4) Sft=(Ex0)?[Sft[0]+X[0],Sft[1]+X[1]]:X;
                   5347:                if(type(Sft)==4) Sft=[Sft[0],-Sft[1]];
                   5348:                if(Ex!=0) Sft=[Sft[0]+Ex[0],Sft[1]];
                   5349:                Org=[["shift",ptaffine(M,[-XW[0],-YW[1]]|shift=Sft)]];
                   5350:                for(CT=0;CT<2;CT++){
                   5351:                  for(LT=L;LT!=[];LT=cdr(LT)){
                   5352:                        T=car(LT);
                   5353:                        if(!CT && T[0]!=2) continue;
                   5354:                        if(CT && T[0]==2) continue;
                   5355:                        if(T[0]==1){
                   5356:                                for(TT=cdr(cdr(T));TT!=[];TT=cdr(TT)){
                   5357:                                        D=car(TT);
                   5358:                                        if(type(D[0][0])==4){
                   5359:                                                for(DT=D;DT!=[];DT=cdr(DT)){
                   5360:                                                        V=car(DT);
                   5361:                                                        if(M) V=ptaffine(M,V|option_list=Org);
                   5362:                                                        draw_bezier(Id,Ind,V|option_list=T[1]);
                   5363:                                                }
                   5364:                                        }else{
                   5365:                                                if(M) D=ptaffine(M,D|option_list=Org);
                   5366:                                                draw_bezier(Id,Ind,D|option_list=T[1]);
                   5367:                                        }
                   5368:                                }
                   5369:                        }else if(T[0]==2){      /* put */
                   5370:                                if(length(T)<4) continue;
                   5371:                                V=T[2];
                   5372:                                if(type(VLB)==4&&V[0]=="_") V=VLB;
                   5373:                                else if(type(V[0])>1||type(V[1])>1) continue;   /* not supported */
                   5374:                                if(length(T)>3&&type(T[3])==4&&length(T[3])>1&&T[3][1]==1) VLB=V;
                   5375:                                F++;MM=M;
                   5376:                                if((Sc=delopt(T[1],"scale"|inv=1))!=[]){
                   5377:                                        if(!MM) MM=1;
                   5378:                                        Sc=car(Sc)[1];
                   5379:                                        if(type(Sc)==1) MM=MM*Sc;
                   5380:                                        else if(type(Sc)==6) MM=MM*diagm(2,Sc);
                   5381:                                }
                   5382:                                if(MM) V=ptaffine(MM,V|option_list=Org);
                   5383:                                if(type(S=S0=T[3])==4) S=S0[0];
                   5384:                                if(length(T)>4) S=T[4];                                         /* subst. string */
                   5385:                                if(type(S0)==4&&type(S0[0])==4){
                   5386:                                        if((Col=drawopt(S0[0][0],0))<0) Col=0;  /* attrib. */
                   5387:                                        if(type(S)!=7) S=rtostr(S0[0][1]);
                   5388:                                        S=str_subst(S,[["$\\bullet$","*"],["$\\times$","x"],["$",""]],0);
                   5389:                                        if(type(Pos=drawopt(S0[0][0],2))==4)
                   5390:                                                V=[V[0]+4*str_len(S)*Pos[0],V[1]-10*Pos[1]]; /* adjustable */
                   5391:                                }else S=str_subst(rtostr(S),[["$\\bullet$","*"],["$\\times$","x"],["$",""]],0);
                   5392:                                V=[V[0]-str_len(S)*4,V[1]-8];   /* adjustable */
                   5393:                                draw_string(Id,Ind,V,S,Col);
                   5394:                        }else if(T[0]==3){      /* arrow */
                   5395:                                F++;
                   5396:                                T1=T[2];T2=T[3];
                   5397:                                if(M){
                   5398:                                        T1=ptaffine(M,T1|option_list=Org);
                   5399:                                        T2=ptaffine(M,T2|option_list=Org);
                   5400:                                }
                   5401:                                draw_bezier(Id,Ind,[T1,T2]|option_list=T[1]);
                   5402:                        }else if(T[0]==4){      /* line */
                   5403:                                F++;
                   5404:                                T1=T[2];T2=T[3];
                   5405:                                if(M){
                   5406:                                        T1=ptaffine(M,T1|option_list=Org);
                   5407:                                        T2=ptaffine(M,T2|option_list=Org);
                   5408:                                }
                   5409:                                V=delopt(T1=T[1],"opt"|inv=1);
                   5410:                                if(V!=[]&&str_str(V[1],".")>=0)
                   5411:                                        T1=cons(["opt",cons("dotted,",V[1])],delopt(T1,"opt"));
                   5412:                                draw_bezier(Id,Ind,[T1,T2]|option_list=T1);
                   5413:                        }else if(T[0]==5){      /* TeX */
                   5414:                                mycat(rtostr(T[2]));
                   5415:                                if(F){
                   5416:                                        S=str_tb(0,Out);
                   5417:                                        Out=str_tb(0,0);
                   5418:                                        F=0;
                   5419:                                        if(S!=""){
                   5420:                                                if(P[0]==2) dviout(xyproc(S)|keep=1);
                   5421:                                                else LOut=cons(xyproc(S),LOut);
                   5422:                                        }
                   5423:                                        if(P[0]==2)     dviout(T[2]|option_list=T[1]);
                   5424:                                        else{
                   5425:                                                LOut=cons(T[2],Out);
                   5426:                                        }
                   5427:                                }
1.57      takayama 5428:                        }else if(T[0]==6){      /* plot */
                   5429:                                F++;
                   5430:                                if((T1=findin(T[1],LCOPT))>-1) T1=COLOPT(T1);
                   5431:                                else if(type(T1)!=1 && T1!=0) T1=0xffffff;
                   5432:                                for(T2=ptaffine(M,T[2]|option_list=Org);T2!=[];T2=cdr(T2))
                   5433:                                        draw_obj(Id,Ind,[rint(car(T2)[0]),rint(car(T2)[1])],T1);
1.6       takayama 5434:                        }else if(Proc==1&&type(T[0])==2){
                   5435:                                if(length(T)<3) call(T[0],T[1]);
                   5436:                                else call(T[0],T[1]|option_list=T[2]);
                   5437:                        }
                   5438:                }
                   5439:          }
                   5440:          S=(PPP>0)? [0,Id,Ind,PPP,PPQ]:[0,Id,Ind];
                   5441:          if(Ex==0&&Sft!=[0,0]) Ex=[0,0];
                   5442:          return (Ex!=0&&length(P)>2&&P[2]==-1)?
                   5443:                [S,0,0,[0,R[0],R[1],0,Ex,[Sft[0]-Ex[0],-Sft[1]]]]:S;
                   5444:        }
                   5445:        if(P[0]==1||P[0]==2){   /* TeX */
                   5446:                Out=str_tb(0,0);LOut=[];F=0;
                   5447:                if(getopt(cl)==1) dviout0(0);
                   5448:                for(;L!=[];L=cdr(L)){
                   5449:                        T=car(L);Opt=T[1];
                   5450:                        if(type(T[0])>=2) continue;
                   5451:                        if(T[0]==0){
                   5452:                                XW=T[1];YW=T[2];
                   5453:                                if(length(P)>1&&type(P[1])==1&&P[1]<0)
                   5454:                                        M=-P[1]/(XW[0]-XW[1]);
                   5455:                        }else if(T[0]==1){
                   5456:                                F++;
                   5457:                                for(TT=cdr(cdr(T));TT!=[];TT=cdr(TT)){
                   5458:                                        D=car(TT);
                   5459:                                        if(type(D[0][0])==4){
                   5460:                                                for(DT=D;DT!=[];DT=cdr(DT)){
                   5461:                                                        V=car(DT);
                   5462:                                                        if(M) V=ptaffine(M,V|option_list=Org);
                   5463:                                                        str_tb(xybezier(V|option_list=Opt),Out);
                   5464:                                                }
                   5465:                                        }else{
                   5466:                                                if(M) D=ptaffine(M,D|option_list=Org);
                   5467:                                                str_tb(xybezier(D|option_list=Opt),Out);
                   5468:                                        }
                   5469:                                }
                   5470:                        }else if(T[0]==2){
                   5471:                                F++;V=T[2];
                   5472:                                Opt=delopt(Opt,"scale"|inv=1);
                   5473:                                MM=M;
                   5474:                                if(Opt!=[]){
                   5475:                                        Opt=car(Opt)[1];
                   5476:                                        if(type(Opt)==1) Opt=[Opt,Opt];
                   5477:                                        if(Opt!=[1,1]){
                   5478:                                                if(!MM) MM=1;
                   5479:                                                MM=MM*diagm(2,[Opt[0],Opt[1]]);
                   5480:                                        }
                   5481:                                }
                   5482:                                if(MM) V=ptaffine(MM,V|option_list=Org);
1.74      takayama 5483:                                if(length(T)>3){
                   5484:                                        if(type(T2=T[3])==7) T2=[T2];
                   5485:                                        V=append(V,T2);
                   5486:                                }
1.6       takayama 5487:                                str_tb(xyput(V),Out);
                   5488:                        }else if(T[0]==3){
                   5489:                                F++;
                   5490:                                T1=T[2];T2=T[3];
                   5491:                                if(M){
                   5492:                                        T1=ptaffine(M,T1|option_list=Org);
                   5493:                                        T2=ptaffine(M,T2|option_list=Org);
                   5494:                                }
                   5495:                                str_tb(xyarrow(T1,T2|option_list=Opt),Out);
                   5496:                        }else if(T[0]==4){
                   5497:                                F++;
                   5498:                                T1=T[2];T2=T[3];
                   5499:                                if(M){
                   5500:                                        T1=ptaffine(M,T1|option_list=Org);
                   5501:                                        T2=ptaffine(M,T2|option_list=Org);
                   5502:                                }
                   5503:                                str_tb(xyline(T1,T2|option_list=Opt),Out);
                   5504:                        }else if(T[0]==5){
                   5505:                                if(F){
                   5506:                                        S=str_tb(0,Out);
                   5507:                                        Out=str_tb(0,0);
                   5508:                                        F=0;
                   5509:                                        if(S!=""){
                   5510:                                                if(P[0]==2) dviout(xyproc(S)|keep=1);
                   5511:                                                else LOut=cons(xyproc(S),LOut);
                   5512:                                        }
                   5513:                                        if(P[0]==2)     dviout(T[2]|option_list=T[1]);
                   5514:                                        else LOut=cons(T[2],Out);
                   5515:                                }
1.57      takayama 5516:                        }else if(T[0]==6){      /* plot */
                   5517:                                F++;
                   5518:                                if(type(T[1])==7) T1=[T[1],"."];
                   5519:                                else T1=".";
                   5520:                                for(T2=ptaffine(M,T[2]|option_list=Org);T2!=[];T2=cdr(T2))
                   5521:                                        str_tb(xypos([car(T2)[0],car(T2)[1],T1]),Out);
1.6       takayama 5522:                        }else if(T[0]==-2)
                   5523:                                str_tb(["%",T[1],"\n"],Out);
1.57      takayama 5524:                         else if(Proc==1&&type(T[0])==2){
1.6       takayama 5525:                                if(length(T)<3) call(T[0],T[1]);
                   5526:                                else call(T[0],T[1]|option_list=T[2]);
                   5527:                        }
                   5528:                }
                   5529:                S=str_tb(0,Out);
                   5530:                if(P[0]==1){
                   5531:                        if(F) LOut=cons(xyproc(S),LOut);
                   5532:                        Out=str_tb(0,0);
                   5533:                        for(L=reverse(LOut);L!=[];L=cdr(L))
                   5534:                                str_tb(car(L),Out);
                   5535:                        return str_tb(0,Out);
                   5536:                }
                   5537:                if(F) dviout(xyproc(S));
                   5538:                else dviout(" ");
                   5539:        }
                   5540: }
                   5541:
                   5542: def execproc(L)
                   5543: {
                   5544:        if(type(N=getopt(var))!=1&&N!=0) N=2;
                   5545:        for(R=[];L!=[];L=cdr(L)){
                   5546:                P=car(L);
                   5547:                if(type(P[0])==2&&vtype(P[0])==3){
                   5548:                        if((VS=vars(cdr(P)))!=[]){
                   5549:                                for(I=0;I<N;I++){
                   5550:                                        V=makev(["v",I+1]);
                   5551:                                        if(findin(V,VS)>=0) P=mysubst(P,[V,R[I]]);
                   5552:                                }
                   5553:                        }
                   5554:                        if(length(P)<3) R=cons(call(P[0],P[1]),R);
                   5555:                        else R=cons(call(P[0],P[1]|option_list=P[2]),R);
                   5556:                }
                   5557:        }
                   5558:        return (getopt(all)==1)?R:car(R);
                   5559: }
                   5560:
                   5561: def myswap(P,L)
                   5562: {
                   5563:        X=makenewv(P);
                   5564:        for(L=reverse(L);length(L)>1;L=cdr(L))
                   5565:                P=subst(P,L[0],X,L[1],L[0],X,L[1]);
                   5566:        return P;
                   5567: }
                   5568:
                   5569: def mysubst(P,L)
                   5570: {
                   5571:        if(P==0) return 0;
1.29      takayama 5572:        if(getopt(lpair)==1||(type(L[0])==4&&length(L[0])>2)) L=lpair(L[0],L[1]);
1.6       takayama 5573:        Inv=getopt(inv);
                   5574:        if(type(L[0]) == 4){
                   5575:                while((L0 = car(L))!=[]){
                   5576:                        P = mysubst(P,(Inv==1)?[L0[1],L0[0]]:L0);
                   5577:                        L = cdr(L);
                   5578:                }
                   5579:                return P;
                   5580:        }
                   5581:        if(Inv==1) L=[L[1],L[0]];
                   5582:        if(type(P) > 3){
                   5583:                if(type(P)==7) return P;
                   5584:                if(type(P)>7)
                   5585:                        return subst(P,L[0],L[1]);
                   5586: #ifdef USEMODULE
                   5587:                return mtransbys(os_md.mysubst,P,[L]);
                   5588: #else
                   5589:                return mtransbys(mysubst,P,[L]);
                   5590: #endif
                   5591:        }
                   5592:        P = red(P);
                   5593:        if(type(P) == 3){
                   5594:                A=mysubst(nm(P),L);B=mysubst(dn(P),L);
                   5595:                return red(nm(A)/nm(B))*red(dn(B)/dn(A));
                   5596:        }
                   5597:        L1=(type(L[1])==3)?red(L[1]):L[1];X=L[0];
                   5598:        if(ptype(L1,X)==3){
                   5599:                LN=nm(L1);LD=dn(L1);
                   5600:                Deg=mydeg(P,X);
                   5601:                if(Deg <= 0) return P;
                   5602:                V = newvect(Deg+1);
                   5603:                for(V[I=Deg]=1;I >= 1;I--)
                   5604:                 V[I-1]=V[I]*LD;
                   5605:                for(R = 0, I = Deg; I >= 0; I--)
                   5606:                        R = R*LN + mycoef(P,I,X)*V[I];
                   5607:                return red(R/V[0]);
                   5608:        }
                   5609:        return subst(P,X,L1);
                   5610: }
                   5611:
                   5612: def mmulbys(FN,P,F,L)
                   5613: {
                   5614:        Opt=getopt();
                   5615:        if(type(F) <= 3){
                   5616:                if(type(P) <= 3)
                   5617:                        return call(FN, cons(P,cons(F,L))|option_list=Opt);
                   5618:                if(type(P) == 5){
                   5619:                        S = length(P);
                   5620:                        R = newvect(S);
                   5621:                        for(I = 0; I < S; I++)
                   5622:                                R[I] = call(FN, cons(P[I],cons(F,L))|option_list=Opt);
                   5623:                        return R;
                   5624:                }else if(type(P) == 6){
                   5625:                        S = size(P);
                   5626:                        R = newmat(S[0],S[1]);
                   5627:                        for(I = 0; I < S[0]; I++){
                   5628:                                for(J = 0; J < S[1]; J++)
                   5629:                                        R[I][J] = call(FN, cons(P[I][J],cons(F,L))|option_list=Opt);
                   5630:                        }
                   5631:                        return R;
                   5632:                }
                   5633:        }
                   5634:        if(type(F) == 5){
                   5635:                S = length(F);
                   5636:                if(type(P) <= 3){
                   5637:                        R = newvect(S);
                   5638:                        for(I = 0; I < S; I++)
                   5639:                                R[I] = call(FN, cons(P,cons(F[I],L))|option_list=Opt);
                   5640:                        return R;
                   5641:                }
                   5642:                if(type(P) == 5){
                   5643:                        for(J=R=0; J<S; J++)
                   5644:                                R = radd(R, call(FN, cons(P[J],cons(F[J],L)))|option_list=Opt);
                   5645:                        return R;
                   5646:                }
                   5647:                T = size(P);
                   5648:                R = newvect(T[0]);
                   5649:                for(I = 0; I < T[0]; I++){
                   5650:                        for(J = 0; J < S; J++)
                   5651:                                R[I] = radd(R[I], call(FN, cons(P[I][J],cons(F[J],L))|option_list=Opt));
                   5652:                }
                   5653:                return R;
                   5654:        }
                   5655:        if(type(F) == 6){
                   5656:                S = size(F);
                   5657:                if(type(P) <= 3){
                   5658:                        R = newmat(S[0],S[1]);
                   5659:                        for(I = 0; I < S[0]; I++){
                   5660:                                for(J = 0; J < S[1]; J++)
                   5661:                                        R[I][J] = call(FN, cons(P,cons(F[I][J],L))|option_list=Opt);
                   5662:                        }
                   5663:                        return R;
                   5664:                }
                   5665:                if(type(P) == 5){
                   5666:                        R = newvect(S[1]);
                   5667:                        for(J = 0; J < S[1]; J++){
                   5668:                                for(K = U = 0; K < S[0]; K++)
                   5669:                                        U = radd(U, call(FN, cons(P[K],cons(F[K][J],L))|option_list=Opt));
                   5670:                                R[J] = U;
                   5671:                        }
                   5672:                        return R;
                   5673:                }
                   5674:                T = size(P);
                   5675:                R = newmat(T[0],S[1]);
                   5676:                for(I = 0; I < T[0]; I++){
                   5677:                        for(J = 0; J < S[1]; J++){
                   5678:                                for(K = U = 0; K < S[0]; K++)
                   5679:                                        U = radd(U, call(FN, cons(P[I][K],cons(F[K][J],L)|option_list=Opt)));
                   5680:                                R[I][J] = U;
                   5681:                        }
                   5682:                }
                   5683:                return R;
                   5684:        }
                   5685:        erno(0);
                   5686:        return 0;
                   5687: }
                   5688:
                   5689: def appldo(P,F,L)
                   5690: {
1.56      takayama 5691:        if(getopt(Pfaff)==1){
                   5692:                L = vweyl(L);
                   5693:                X = L[0]; DX = L[1];
                   5694:                for(I=mydeg(P,DX);I>0;I--){
1.78      takayama 5695:                        if(!(TP=mycoef(P,I,DX))) continue;
                   5696:                        P=red(P-TP*DX^I+TP*muldo(DX^(I-1),F,L));
1.56      takayama 5697:                }
                   5698:                return P;
                   5699:        }
1.6       takayama 5700:        if(type(F) <= 3){
                   5701:                if(type(L) == 4 && type(L[0]) == 4)
                   5702:                        return applpdo(P,F,L);
                   5703:                L = vweyl(L);
                   5704:                X = L[0]; DX = L[1];
                   5705:                J = mydeg(P,DX);
                   5706:                for(I = R = 0; I <= J; I++){
                   5707:                        if(I > 0)
                   5708:                                F = mydiff(F,X);
                   5709:                        R = radd(R,mycoef(P,I,DX)*F);
                   5710:                }
                   5711:                return R;
                   5712:        }
                   5713: #ifdef USEMODULE
                   5714:        return mmulbys(os_md.appldo,P,F,[L]);
                   5715: #else
                   5716:        return mmulbys(appldo,P,F,[L]);
                   5717: #endif
                   5718: }
                   5719:
                   5720: def appledo(P,F,L)
                   5721: {
                   5722:        if(type(F) <= 3){
                   5723:                L = vweyl(L);
                   5724:                X = L[0]; DX = L[1];
                   5725:                J = mydeg(P,DX);
                   5726:                for(I = R = 0; I <= J; I++){
                   5727:                        if(I > 0)
                   5728:                                F = myediff(F,X);
                   5729:                        R = radd(R,mycoef(P,I,DX)*F);
                   5730:                }
                   5731:                return R;
                   5732:        }
                   5733: #ifdef USEMODULE
                   5734:        mmulbys(os_md.appledo,P,F,[L]);
                   5735: #else
                   5736:        mmulbys(appledo,P,F,[L]);
                   5737: #endif
                   5738: }
                   5739:
                   5740: def muldo(P,Q,L)
                   5741: {
                   5742:        if(type(Lim=getopt(lim))!=1) Lim=100;
                   5743:        if(type(Q) <= 3){
                   5744:                if(type(L) == 4 && type(L[0]) == 4)
                   5745:                        return mulpdo(P,Q,L|lim=Lim);   /* several variables */
                   5746:                R = rmul(P,Q);
                   5747:                L = vweyl(L);
                   5748:                X = L[0]; DX = L[1];
                   5749:                if(X != 0){
                   5750:                        for(I = F = 1; ; I++){
                   5751:                                P = mydiff(P,DX);
                   5752:                                if(I>Lim){
                   5753:                                        mycat(["Over", Lim,"derivations!"]);
                   5754:                                        break;
                   5755:                                }
                   5756:                                if(P == 0)
                   5757:                                        break;
                   5758:                                Q = mydiff(Q,X);
                   5759:                                if(Q == 0)
                   5760:                                        break;
                   5761:                                F *= I;
                   5762:                                R = radd(R,P*Q/F);
                   5763:                        }
                   5764:                }
                   5765:                return R;
                   5766:        }
                   5767: #ifdef USEMODULE
                   5768:        return mmulbys(os_md.muldo,P,Q,[L]);
                   5769: #else
                   5770:        return mmulbys(muldo,P,Q,[L]);
                   5771: #endif
                   5772: }
                   5773:
                   5774: def jacobian(F,X)
                   5775: {
                   5776:        F=ltov(F);X=ltov(X);
1.30      takayama 5777:        N=length(F);L=length(X);
                   5778:        M=newmat(N,L);
1.6       takayama 5779:        for(I=0;I<N;I++)
1.30      takayama 5780:                for(J=0;J<L;J++) M[I][J]=red(diff(F[I],X[J]));
                   5781:        if(N!=L||getopt(mat)==1) return M;
1.6       takayama 5782:        return mydet(M);
                   5783: }
                   5784:
                   5785: def hessian(F,X)
                   5786: {
                   5787:        X=ltov(X);
                   5788:        N=length(X);
                   5789:        M=newmat(N,N);
                   5790:        for(I=0;I<N;I++){
                   5791:                G=red(diff(F,X[I]));
                   5792:                for(J=0;J<N;J++) M[I][J]=red(diff(G,X[J]));
                   5793:        }
                   5794:        if(getopt(mat)==1) return M;
                   5795:        return mydet(M);
                   5796: }
                   5797:
                   5798: def wronskian(F,X)
                   5799: {
                   5800:        N=length(F);
                   5801:        M=newmat(N,N);
                   5802:        for(I=0;F!=[];F=cdr(F),I++){
                   5803:                M[I][0]=car(F);
                   5804:                for(J=1;J<N;J++) M[I][J]=red(diff(M[I][J-1],X));
                   5805:        }
                   5806:        if(getopt(mat)==1) return M;
                   5807:        return mydet(M);
                   5808: }
                   5809:
                   5810: def adj(P,L)
                   5811: {
                   5812:        if(type(P) == 4)
                   5813: #ifdef USEMODULE
                   5814:                return map(os_md.adj,mtranspose(P),L);
                   5815: #else
                   5816:                return map(adj,mtranspose(P),L);
                   5817: #endif
                   5818:        if(type(L) == 4 && type(L[0]) == 4)
                   5819: #ifdef USEMODULE
                   5820:                return fmult(os_md.adj,P,L,[]);
                   5821: #else
                   5822:                return fmult(adj,P,L,[]);
                   5823: #endif
                   5824:        L = vweyl(L);
                   5825:        X = L[0]; DX = L[1];
                   5826:        P = R = subst(P, DX, -DX);
                   5827:        for(I = 1; (R = mydiff(mydiff(R, X), DX)/I) != 0 && I < 100; I++)
                   5828:                P = radd(P,R);
                   5829:        return P;
                   5830: }
                   5831:
                   5832: def laplace1(P,L)
                   5833: {
                   5834:        if(type(L) == 4 && type(L[0]) == 4)
                   5835: #ifdef USEMODULE
                   5836:                return fmult(os_md.laplace,P,L,[]);
                   5837: #else
                   5838:                return fmult(laplace,P,L,[]);
                   5839: #endif
                   5840:        L = vweyl(L);
                   5841:        X = L[0]; DX = L[1];
                   5842:        P = adj(P, L);
                   5843:        return subst(P,X,o_1,DX,X,o_1,DX);
                   5844: }
                   5845:
                   5846: def laplace(P,L)
                   5847: {
                   5848:        if(type(L) == 4 && type(L[0]) == 4)
                   5849: #ifdef USEMODULE
                   5850:                return fmult(os_md.laplace1,P,L,[]);
                   5851: #else
                   5852:                return fmult(laplace1,P,L,[]);
                   5853: #endif
                   5854:        L = vweyl(L);
                   5855:        X = L[0]; DX = L[1];
                   5856:        P = adj(P, L);
                   5857:        return subst(P,X,o_1,DX,-X,o_1,-DX);
                   5858: }
                   5859:
                   5860: def mce(P,L,V,R)
                   5861: {
                   5862:        L = vweyl(L);
                   5863:        X = L[0]; DX = L[1];
1.56      takayama 5864:        P = sftexp(laplace1(P,L),L,V,R|option_list=getopt());
1.6       takayama 5865:        return laplace(P,L);
                   5866: }
                   5867:
                   5868: def mc(P,L,R)
                   5869: {
1.56      takayama 5870:        return mce(P,L,0,R|option_list=getopt());
1.6       takayama 5871: }
                   5872:
                   5873: def rede(P,L)
                   5874: {
                   5875:        Q = ltov(fctr(nm(red(P))));
                   5876:        P = 1;
                   5877:        if(type(L) < 4)
                   5878:                L = [L];
                   5879:        if(type(L[0]) < 4)
                   5880:                L = [L];
                   5881:        for( ; L != []; L = cdr(L)){
                   5882:                DX = vweyl(car(L))[1];
                   5883:                for(I = 1; I < length(Q); I++){
                   5884:                        if(mydeg(Q[I][0],DX) > 0){
                   5885:                                P *= (Q[I][0])^(Q[I][1]);
                   5886:                                Q[I]=[1,0];
                   5887:                        }
                   5888:                }
                   5889:        }
                   5890:        return P;
                   5891: }
                   5892:
                   5893: def ad(P,L,R)
                   5894: {
                   5895:        L = vweyl(L);
                   5896:        DX = L[1];
                   5897:        K = mydeg(P,DX);
                   5898:        S = mycoef(P,0,DX);
                   5899:        Q = 1;
                   5900:        for(I=1; I <= K;I++){
                   5901:                Q = muldo(Q,DX-R,L);
                   5902:                S = radd(S,mycoef(P,I,DX)*Q);
                   5903:        }
                   5904:        return S;
                   5905: }
                   5906:
                   5907: def add(P,L,R)
                   5908: {
                   5909:        return rede(ad(P,L,R),L);
                   5910: }
                   5911:
                   5912:
                   5913: def vadd(P,L,R)
                   5914: {
                   5915:        L = vweyl(L);
                   5916:        if(type(R) != 4)
                   5917:                return 0;
                   5918:        N = length(R);
                   5919:        DN = 1; Ad = PW = 0;
                   5920:        for( ; R != []; R = cdr(R), PW++){
                   5921:                DN *= (T=1-car(R)[0]*L[0]);
                   5922:                Ad = Ad*T-car(R)[1]*x^PW;
                   5923:        }
                   5924:        Ad /= DN;
                   5925:        return add(P,L,Ad);
                   5926: }
                   5927:
                   5928: def addl(P,L,R)
                   5929: {
                   5930:        return laplace1(add(laplace(P,L),L,R),L);
                   5931: }
                   5932:
                   5933: def cotr(P,L,R)
                   5934: {
                   5935:        L = vweyl(L);
                   5936:        X = L[0]; DX = L[1];
                   5937:        T = 1/mydiff(P,DX);
                   5938:        K = mydeg(P,DX);
                   5939:        S = mysubst(mycoef(P,0,DX), [X, R]);
                   5940:        Q = 1;
                   5941:        for(I = 1; I <= K; I++){
                   5942:                Q = muldo(Q, K*DX, L);
                   5943:                S = radd(S,mysubst(mycoef(P,I,DX), [X, R])*Q);
                   5944:        }
                   5945: }
                   5946:
                   5947: def rcotr(P,L,R)
                   5948: {
                   5949:        return rede(cotr(P,L,R), L);
                   5950: }
                   5951:
                   5952: def muledo(P,Q,L)
                   5953: {
                   5954:        if(type(Q)>3)
                   5955: #ifdef USEMODULE
                   5956:                return mmulbys(os_md.muledo,P,Q,[L]);
                   5957: #else
                   5958:                return mmulbys(muledo,P,Q,[L]);
                   5959: #endif
                   5960:        R = P*Q;
                   5961:        L = vweyl(L);
                   5962:        X = L[0]; DX = L[1];
                   5963:        for(I = F = 1; I < 100; I++){
                   5964:                P = mydiff(P,DX);
                   5965:                if(P == 0)
                   5966:                        break;
                   5967:                Q = myediff(Q,X);
                   5968:                if(Q == 0)
                   5969:                        break;
                   5970:                F = rmul(F,I);
                   5971:                R = radd(R,P*Q/F);
                   5972:        }
                   5973:        return R;
                   5974: }
                   5975:
                   5976:
                   5977: #if 1
                   5978: def mulpdo(P,Q,L)
                   5979: {
                   5980:        if(type(Q)>3)
                   5981: #ifdef USEMODULE
                   5982:                return mmulbys(os_md.mulpdo,P,Q,[L]);
                   5983: #else
                   5984:                return mmulbys(mulpdo,P,Q,[L]);
                   5985: #endif
                   5986:        if(type(Lim=getopt(lim))!=1) Lim=100;
                   5987:        M = vweyl(car(L)); X= M[0]; DX = M[1];
                   5988:        L = cdr(L);
                   5989:        R = 0;
                   5990:        for(I = 0; Q != 0 && I <= Lim; I++){
                   5991:                if(I>Lim){
                   5992:                        mycat(["Over", Lim,"derivations!"]);
                   5993:                        break;
                   5994:                }
                   5995:                if(I > 0)
                   5996:                        P /= I;
                   5997:                if(length(L)==0)
                   5998:                        R = radd(R,P*Q);
                   5999:                else
                   6000:                        R = radd(R,mulpdo(P,Q,L));
                   6001:                if(X==0) break;
                   6002:                P = mydiff(P,DX);
                   6003:                if(P == 0)
                   6004:                        break;
                   6005:                Q = mydiff(Q,X);
                   6006:        }
                   6007:        if(I>Lim)       mycat(["Over", Lim,"derivations!"]);
                   6008:        return R;
                   6009: }
                   6010:
                   6011: #else
                   6012: def mulpdo(P,Q,L);
                   6013: {
                   6014:        if(type(Q)>3)
                   6015: #ifdef USEMODULE
                   6016:                return mmulbys(os_md.mulpdo,P,Q,[L]);
                   6017: #else
                   6018:                return mmulbys(mulpdo,P,Q,[L]);
                   6019: #endif
                   6020:        if(type(Lim=getopt(lim))!=1) Lim=100;
                   6021:        N  = length(L);
                   6022:        VO = newvect(2*N);
                   6023:        VN = newvect(2*N);
                   6024:        for(I = J = 0; I < N; J += 2, I++){
                   6025:                M = vweyl(L[I]);
                   6026:                P = subst(P, VO[J]=M[0], VN[J]=strtov("o_"+rtostr(V[J])),
                   6027:                        VO[J+1]=M[1], VN[J+1] = strtov("o_"+rtostr(V[J+1])));
                   6028:        }
                   6029:        for(PQ = P*Q, I = 0; I < 2*N; I += 2){
                   6030:                for(R = PQ, J = 1; J < Lim; J++){
                   6031:                        R = mydiff(R, VN[I+1])/J;
                   6032:                        if(R == 0)
                   6033:                                break;
                   6034:                        R = mydiff(R, VO[I]);
                   6035:                        if(R == 0)
                   6036:                                break;
                   6037:                        PQ = radd(PQ,R);
                   6038:                }
                   6039:                if(I==Lim)      mycat(["Over", Lim,"derivations!"]);
                   6040:                PQ = red(subst(PQ,VN[I],VO[I],VN[I+1],VO[I+1]));
                   6041:        }
                   6042: }
                   6043: #endif
                   6044:
                   6045: def transpdosub(P,LL,K)
                   6046: {
1.49      takayama 6047:        if(type(P)>3) return
                   6048: #ifdef USEMODULE
                   6049:                mtransbys(os_md.transpdosub,P,[LL,K]);
                   6050: #else
                   6051:                mtransbys(transpdosub,P,[LL,K]);
                   6052: #endif
1.6       takayama 6053:        Len = length(K)-1;
                   6054:        if(Len < 0 || P == 0)
                   6055:                return P;
                   6056:        KK=K[Len];
                   6057:        if(type(KK)==4){
                   6058:                KK0=KK[0]; KK1=KK[1];
                   6059:        }else{
                   6060:                L = vweyl(LL[Len]);
                   6061:                KK0=L[1]; KK1=K[Len];
                   6062:        }
                   6063:        Deg = mydeg(P,KK0);
                   6064:        K1 = reverse(cdr(reverse(K)));
                   6065:        R = transpdosub(mycoef(P,0,KK0),LL,K1);
                   6066:        for(I = M = 1; I <= Deg ; I++){
                   6067:                M = mulpdo(M,KK1,LL);
                   6068:                S = mycoef(P,I,KK0);
                   6069:                if(Len > 0)
                   6070:                        S = transpdosub(S,LL,K1);
                   6071:                R = radd(R,mulpdo(S,M,LL));
                   6072:        }
                   6073:        return R;
                   6074: }
                   6075:
                   6076: def transpdo(P,LL,K)
                   6077: {
                   6078:        Len = length(K)-1;
                   6079:        K1=K2=[];
                   6080:        if(type(LL)!=4) LL=[LL];
                   6081:        if(type(LL[0])!=4) LL=[LL];
1.49      takayama 6082:        if(type(car(K)) < 4 && length(LL)!=length(K)) K = [K];
1.6       takayama 6083:        if(getopt(ex)==1){
                   6084:                for(LT=LL, KT=K; KT!=[]; LT=cdr(LT), KT=cdr(KT)){
                   6085:                        L = vweyl(LL[J]);
                   6086:                        K1=cons([L[0],car(KT)[0]],K1);
                   6087:                        K2=cons([L[1],car(KT)[1]],K2);
                   6088:                }
                   6089:                K2=append(K1,K2);
                   6090:        }else{
1.49      takayama 6091:                if(length(LL)==length(K) && type(car(K))!=4){
                   6092:                        for(DV=V=TL=[],J=length(LL)-1;J>=0;J--){
                   6093:                                TL=cons(vweyl(LL[J]),TL);
                   6094:                                V=cons(car(TL)[0],V);
                   6095:                                DV=cons(car(TL)[1],DV);
                   6096:                        }
                   6097:                        LL=TL;
                   6098:                        if(type(RK=solveEq(K,V|inv=1))!=4) return TK;
                   6099:                        if(!isint(Inv=getopt(inv))) Inv=0;
                   6100:                        if(iand(Inv,1)){J=K;K=RK;RK=J;}
                   6101:                        M=jacobian(RK,V|mat=1);
                   6102:                        M=mulsubst(M,[V,K]|lpair=1);
                   6103:                        RK=vtol(M*ltov(DV));
                   6104:                        if(Inv>1) return RK;
                   6105:                        K=lpair(K,RK);
                   6106:                }
1.6       takayama 6107:                for(J = length(K)-1; J >= 0; J--){
                   6108:                        L = vweyl(LL[J]);
1.49      takayama 6109:                        if(L[0]!= K[J][0]) K1=cons([L[0],K[J][0]],K1);
1.6       takayama 6110:                        K2 = cons(K[J][1],K2);
                   6111:                }
                   6112:                P = mulsubst(P, K1);
                   6113:        }
                   6114:        return transpdosub(P,LL,K2);
                   6115: }
                   6116:
                   6117: def translpdo(P,LL,M)
                   6118: {
                   6119:        S=length(LL);
                   6120:        L0=newvect(S);L1=newvect(S);
                   6121:        K=newvect(S);
                   6122:        for(J=0;J<S;J++){
                   6123:                L = vweyl(LL[J]);
                   6124:                L0[J]=L[0];
                   6125:                L1[J]=L[1];
                   6126:        }
                   6127:        K=rmul(M,L0);
                   6128:        for(T=[],J=0;J<S;J++)
                   6129:                T=cons([L0[J],K[J]],T);
                   6130:        P=mulsubst(P,T);
                   6131:        K=rmul(myinv(M),L1);
                   6132:        for(T=[],J=0;J<S;J++)
                   6133:                T=cons([L1[J],K[J]],T);
                   6134:        return mulsubst(P,T);
                   6135: }
                   6136:
                   6137: /*
                   6138:                return [R, M, S] : R = M*P - S*Q
                   6139:                deg(R,X) < deg(Q,X)
                   6140: */
                   6141: def rpdiv(P,Q,X)
                   6142: {
                   6143:        if(P == 0)
                   6144:                return [0,1,0];
                   6145:        DQ = mydeg(Q,X);
                   6146:        CO = mycoef(Q,DQ,X);
                   6147:        S  = 0;
                   6148:        while((DP = mydeg(P,X)) >= DQ){
                   6149:                R = mycoef(P,DP,X)/CO;
                   6150:                S = radd(S,R*X^(DP-DQ));
                   6151:                P = radd(P, -R*Q*X^(DP-DQ));
                   6152:        }
                   6153:        Lcm = lcm(dn(S),dn(P));
                   6154:        Gcd = gcd(nm(S),nm(P));
                   6155:        return [red(P*Lcm/Gcd), red(Lcm/Gcd),red(S*Lcm/Gcd)];
                   6156: }
                   6157:
                   6158: def texbegin(T,S)
                   6159: {
                   6160:        if(type(Opt=getopt(opt))==7) Opt="["+Opt+"]\n";
                   6161:        else Opt="\n";
1.47      takayama 6162:        U=(str_chr(S,str_len(S)-1,"\n")<0)?"%\n":"";
                   6163:        return "\\begin{"+T+"}"+Opt+S+U+"\\end{"+T+"}\n";
1.6       takayama 6164: }
                   6165:
                   6166: def mygcd(P,Q,L)
                   6167: {
                   6168:        if((Dvi=getopt(dviout))==3 || Dvi==-3){ /* dviout=3 */
                   6169:                if((Rev=getopt(rev))!=1) Rev=0;
                   6170:                R=mygcd(P,Q,L|rev=Rev);
                   6171:                if(type(L)<2) Var=0;
                   6172:                else if(type(L)==2){
                   6173:                        Val=L;L=[0,L];
                   6174:                }else if(type(L)==4){
                   6175:                        L=vweyl(L);
                   6176:                        Var=[[L[1],"\\partial"]];
                   6177:                }
                   6178:                S=mat([P],[Q]);T=mat([R[0]],[0]);
                   6179:                M=mat([R[1],R[2]],[R[3],R[4]]);
                   6180:                if(type(Val)==4)
                   6181:                        N=mdivisor(M,L|trans=1)[1];
                   6182:                else N=myinv(M);
                   6183:                Tb=str_tb(mtotex(S|var=Var),0);
                   6184:                str_tb("&="+mtotex(N|var=Var)+mtotex(T|var=Var)+",\\\\\n",Tb);
                   6185:                str_tb(mtotex(T|var=Var),Tb);
                   6186:                str_tb("&="+mtotex(M|var=Var)+mtotex(S|var=Var)+".",Tb);
                   6187:                Out=str_tb(0,Tb);
                   6188:                if(Dvi<0) return Out;
                   6189:                dviout(Out|eq="align*");
                   6190:                return 1;
                   6191:        }
                   6192:        if((type(Dvi)==1||Dvi==0) && getopt(rev)!=1)    V=[[P,Q]];
                   6193:        else V=0;
                   6194:        if(L==0){       /* integer case */
                   6195:                if(type(P) > 1 || type(Q) > 1 || Q==0  /* P <= 0 || Q <= 0 */
                   6196:                        || dn(P) > 1 || dn(Q) > 1)
                   6197:                        return 0;
                   6198:                        CPP = CQQ = 1; CQP = CPQ = 0;
                   6199:                        P1 = P; Q1 = Q;
                   6200:                /* P1 = CPP*P + CPQ*Q
                   6201:                   Q1 = CQP*P + CQQ*Q */
                   6202:                while(Q1 != 0){
                   6203:                        Div1 = idiv(P1,Q1); Div2 = irem(P1,Q1);
                   6204:                        if(type(V)==4) V=cons([Div1,Div2],V);
                   6205:                        P1 = Q1 ; Q1 = Div2;
                   6206:                        TP = CQP; TQ = CQQ;
                   6207:                        CQP = CPP-Div1*CQP;
                   6208:                        CQQ = CPQ-Div1*CQQ;
                   6209:                        CPP = TP; CPQ = TQ;
                   6210:                }
                   6211:                if(V!=0){
                   6212:                        V=reverse(V);
                   6213:                        if((DVI=abs(Dvi))==0) return V;
                   6214:                        PT=P;QT=Q;
                   6215:                        if(DVI==1 || DVI==2){
                   6216:                                Tb=str_tb(0,0);
                   6217:                                for(C=0,V=cdr(V);V!=[];V=cdr(V)){
                   6218:                                        T=car(V);
                   6219:                                        if(C++) str_tb(texcr(11),Tb);
                   6220:                                        if(DVI==1){
                   6221:                                                Qs=rtostr(QT);
                   6222:                                                if(QT<0) Qs="("+Qs+")";
                   6223:                                                if(T[1]>0) Qs=Qs+"+";
                   6224:                                                if(T[1]!=0) Qs=Qs+rtostr(T[1]);
                   6225:                                                str_tb(rtostr(PT)+"&="
                   6226:                                                        +rtostr(T[0])+"\\times"+Qs,Tb);
                   6227:                                        }else{
                   6228:                                                N=mat([T[0],1],[1,0]);
                   6229:                                                if(C==1){
                   6230:                                                        str_tb(S0=mtotex(mat([PT],[QT])),Tb);
                   6231:                                                        M=N;
                   6232:                                                }
                   6233:                                                str_tb("&=",Tb);
                   6234:                                                if(C>1) str_tb(mtotex(M),Tb);
                   6235:                                                str_tb(mtotex(N),Tb);
                   6236:                                                str_tb(S=mtotex(mat([QT],[T[1]])),Tb);
                   6237:                                                if(C>1){
                   6238:                                                        str_tb("=",Tb);
                   6239:                                                        str_tb(mtotex(M=M*N),Tb);
                   6240:                                                        str_tb(S,Tb);
                   6241:                                                }
                   6242:                                        }
                   6243:                                        PT=QT;QT=T[1];
                   6244:                                }
                   6245:                                if(DVI==2){
                   6246:                                        str_tb(texcr(43)+S+"&=",Tb);
                   6247:                                        str_tb(mtotex(myinv(M)),Tb);
                   6248:                                        str_tb(S0,Tb);
                   6249:                                }
                   6250:                                Out=str_tb(0,Tb);
                   6251:                                if(Dvi>0){
                   6252:                                        dviout(Out|eq="align*");
                   6253:                                        return 1;
                   6254:                                }
                   6255:                                return Out;
                   6256:                        }
                   6257:                }
                   6258:                if(P1<0) return [-P1,-CPP,-CPQ,CQP,CQQ];
                   6259:                return [P1, CPP, CPQ, CQP, CQQ];
                   6260:        }
                   6261:        if(type(L) == 2)        /* polynomical case */
                   6262:                L = [0,L];
                   6263:        if(getopt(rev)==1 && L[0]!=0){
                   6264:                R=mygcd(adj(P,L),adj(Q,L),L);
                   6265:                return [adj(R[0],L),adj(R[1],L),adj(R[2],L),adj(R[3],L),adj(R[4],L)];
                   6266:        }
                   6267:        if(type(P) == 3)
                   6268:                P = red(P);
                   6269:        if(type(Q) == 3)
                   6270:                Q = red(Q);
                   6271:        CP=newvect(2,[1/dn(P),0]); CQ=newvect(2,[0,1/dn(Q)]);
                   6272:        P=PT=nm(P); Q =QT=nm(Q);
                   6273:        L = vweyl(L);
                   6274:        while(Q != 0){
                   6275:                R = divdo(P,Q,L);
                   6276:                if(type(V)==4) V=cons(R,V);
                   6277: /* R[1] = R[2]*P - R[0]*Q
                   6278:                = R[2]*(CP[0]*P0+CP[1]*Q0) - R[0]*(CQ[0]*P0+CQ[1]*Q0) */
                   6279: /*
                   6280:   P(n)     |0        1 |  P(n-1)
                   6281:          = |           |
                   6282:   R[1]     |R[2]  -R[0]|  P(n)
                   6283:   P(n+1) = R[1], P(n) = P, P(n-1) = Q
                   6284: */
                   6285:                P = Q;
                   6286:                Q = R[1];
                   6287:                {
                   6288:                        CT = dupmat(CQ);
                   6289:                        CQ = [R[2]*CP[0]-muldo(R[0],CQ[0],L),
                   6290:                                        R[2]*CP[1]-muldo(R[0],CQ[1],L)];
                   6291:                        CP = CT;
                   6292:                }
                   6293:        }
                   6294:        if(V!=0){
                   6295:                V=reverse(V);
                   6296:                if((DVI=abs(Dvi))==0) return V;
                   6297:                if(type(L[0])<1) Var=L[1];
                   6298:                else Var=[L[1],"\\partial"];
                   6299:                if(DVI==1 || DVI==2){
                   6300:                        Tb=str_tb(0,0);
                   6301:                        PT=car(V)[0];QT=car(V)[1];
                   6302:                        for(C=0,V=cdr(V);V!=[];V=cdr(V)){
                   6303:                                T=car(V);
                   6304:                                if(C++) str_tb(texcr(11),Tb);
                   6305:                                if(DVI==1){
                   6306:                                        if(T[2]!=1){
                   6307:                                                str_tb(monototex(T[2]),Tb);
                   6308:                                                str_tb("(",Tb);
                   6309:                                                str_tb(fctrtos(PT|var=Var,TeX=2),Tb);
                   6310:                                                str_tb(")&=",Tb);
                   6311:                                        }else{
                   6312:                                                str_tb(fctrtos(PT|var=Var,TeX=2),Tb);
                   6313:                                                str_tb("&=",Tb);
                   6314:                                        }
                   6315:                                        str_tb("(",Tb);
                   6316:                                        str_tb(fctrtos(T[0]|var=Var,TeX=2),Tb);
                   6317:                                        str_tb(")(",Tb);
                   6318:                                        str_tb(fctrtos(QT|var=Var,TeX=2),Tb);
                   6319:                                        if(T[1]!=0){
                   6320:                                                str_tb(")+(",Tb);
                   6321:                                                str_tb(fctrtos(T[1]|var=Var,TeX=2),Tb);
                   6322:                                        }
                   6323:                                        str_tb(")",Tb);
                   6324:                                }else{
                   6325:                                        N=mat([red(T[0]/T[2]),1],[1,0]);
                   6326:                                        if(C==1){
                   6327:                                                str_tb(S0=mtotex(mat([PT],[QT])|var=Var),Tb);
                   6328:                                                M=N;
                   6329:                                        }
                   6330:                                        str_tb("&=",Tb);
                   6331:                                        if(C>1) str_tb(mtotex(M),Tb);
                   6332:                                        str_tb(mtotex(N|var=Var),Tb);
                   6333:                                        str_tb(S=mtotex(mat([QT],[T[1]])|var=Var),Tb);
                   6334:                                        if(C>1){
                   6335:                                                str_tb("=",Tb);
                   6336:                                                str_tb(mtotex(M=muldo(M,N,L)|var=Var),Tb);
                   6337:                                                str_tb(S,Tb);
                   6338:                                        }
                   6339:                                }
                   6340:                                PT=QT;QT=T[1];
                   6341:                        }
                   6342:                        if(DVI==2){
                   6343:                                FT=fctr(PT);
                   6344:                                for(R=1;FT!=[];FT=cdr(FT)){
                   6345:                                        if(mydeg(car(FT)[0],L[1])<1)
                   6346:                                                for(J=car(FT)[1];J>0;J--) R*=car(FT)[0];
                   6347:                                }
                   6348:                                if(R!=1){
                   6349:                                        str_tb(texcr(79),Tb);
                   6350:                                        M=muldo(M,mat([R,0],[0,1]),L);
                   6351:                                        str_tb(mtotex(M|var=Var),Tb);
                   6352:                                        str_tb(S=mtotex(mat([PT/R],[QT])|var=Var),Tb);
                   6353:                                }
                   6354:                                str_tb(texcr(43)+S+"&=",Tb);
                   6355:                                if(type(Var)==4){
                   6356:                                        N=mdivisor(M,L|trans=1);
                   6357:                                        N=N[1];
                   6358:                                }else
                   6359:                                        N=myinv(M);
                   6360:                                str_tb(mtotex(N|var=Var),Tb);
                   6361:                                str_tb(S0,Tb);
                   6362:                        }
                   6363:                        Out=str_tb(0,Tb);
                   6364:                        if(Dvi>0){
                   6365:                                dviout(Out|eq="align*");
                   6366:                                return 1;
                   6367:                        }
                   6368:                        return Out;
                   6369:                }
                   6370:        }
                   6371:        Q = rede(P,L);
                   6372:        R = red(P/Q);
                   6373:        return [Q,red(CP[0]/R),red(CP[1]/R),red(CQ[0]/R),red(CQ[1]/R)];
                   6374: }
                   6375:
                   6376: def mylcm(P,Q,L)
                   6377: {
                   6378:        Rev=(getopt(rev)==1)?1:0;
                   6379:        if(Rev==1){
                   6380:                P=adj(P); Q=adj(Q);
                   6381:        }
                   6382:        R = mygcd(P,Q,L);
                   6383:        S=(type(L)<=2)?R[3]*P:muldo(R[3],P,L);
                   6384:        S = nm(S);
                   6385:        if(type(S) <= 1 && type(L) <= 1){
                   6386:                if(S<0) S = -S;
                   6387:                return S;
                   6388:        }
                   6389:        if(type(L) == 2)
                   6390:                return easierpol(S,L);
                   6391:        S=rede(easierpol(S,L[1]),L);
                   6392:        return (Rev==1)?adj(S):S;
                   6393: }
                   6394:
                   6395: def sftpexp(P,LL,F,Q)
                   6396: {
                   6397:        if(type(LL[0]) < 4)
                   6398:                LL = [LL];
                   6399:        for(L0=L1=[],LT=LL;LT!=[];LT=cdr(LT)){
                   6400:                W=vweyl(car(LT));
                   6401:                L0=cons(W,L0);
                   6402:                D=mydiff(F,W[0]);
                   6403:                if(D!=0) L1=cons(W[1]+Q*D/F,L1);
                   6404:                else L1=cons(W[1],L1);
                   6405:        }
                   6406:        return rede(transpdosub(P,L0,L1),L0);
                   6407: }
                   6408:
                   6409: def applpdo(P,F,LL)
                   6410: {
                   6411:        if(type(F)>3)
                   6412: #ifdef USEMODULE
                   6413:                return mmulbys(os_md.applpdo,P,F,[LL]);
                   6414: #else
                   6415:                return mmulbys(applpdo,P,F,[LL]);
                   6416: #endif
                   6417:        L = vweyl(LL[0]);
                   6418:        LL = cdr(LL);
                   6419:        Deg = deg(P,L[1]);
                   6420:        S = F;
                   6421:        for(I = R = 0; I <= Deg ; I++){
                   6422:                if(I > 0)
                   6423:                        S = mydiff(S,L[0]);
                   6424:                if(LL == [])
                   6425:                        R = radd(R,mycoef(P,I,L[1])*S);
                   6426:                else
                   6427:                        R = radd(R,applpdo(mycoef(P,I,L[1]), S, LL));
                   6428:        }
                   6429:        return R;
                   6430: }
                   6431:
                   6432: def tranlpdo(P,L,M)
                   6433: {
                   6434:        N = length(L);
                   6435:        R = size(M);
                   6436:        if(R[0] != N || R[1] != N){
                   6437:                print("Strange size");
                   6438:                return;
                   6439:        }
                   6440:        InvM = M;
                   6441:        if(InvM[1] == 0){
                   6442:                print("Not invertible");
                   6443:                return;
                   6444:        }
                   6445:        XL = newvector(N);
                   6446:        DL = newvector(N);
                   6447:        for(I = 0; I < 0; I++){
                   6448:                R = vweyl(L[I]);
                   6449:                XL[I] = R[0];
                   6450:                DL[I] = R[1];
                   6451:        }
                   6452:        for(I = 0; I < N; I++){
                   6453:                for(J = XX = D0 = 0; J < N; J++){
                   6454:                        XX = radd(XX,M[I][J]*XL[J]);
                   6455:                        DD = radd(DD, red(InvM[0][I][J]/InvM[1])*DL[J]);
                   6456:                        P = mysubst(P,[[XL[I],XX],[DL[I],DD]]);
                   6457:                }
                   6458:        }
                   6459:        return P;
                   6460: }
                   6461:
                   6462: def divdo(P,Q,L)
                   6463: {
                   6464:        if(L==0){
                   6465:                R=P-idiv(P,Q)*Q;
                   6466:                if(R<0){
                   6467:                        if(Q>0) R+=Q;
                   6468:                        else R-=Q;
                   6469:                }
                   6470:                return [(P-R)/Q,R,1];
                   6471:        }
                   6472:        L = vweyl(L);
                   6473:        if(getopt(rev)==1){
                   6474:                R=divdo(adj(P,L),adj(Q,L),L);
                   6475:                return [adj(R[0],L),adj(R[1],L),R[2]];
                   6476:        }
                   6477:        X = L[0]; DX = L[1];
                   6478:        S = 0;
                   6479:        M = 1;
                   6480:        I = mydeg(Q,DX);
                   6481:        CQ = mycoef(Q,I,DX);
                   6482:        while((J=mydeg(P,DX)) >= I){
                   6483:         C = mycoef(P,J,DX);
                   6484:         SR = red(C/CQ);
                   6485:                 if(dn(SR) != 1){
                   6486:                        M *= dn(SR);
                   6487:                        P *= dn(SR);
                   6488:                        S *= dn(SR);
                   6489:                        SR = nm(SR);
                   6490:                }
                   6491:                P -= muldo(SR*(DX)^(J-I),Q,L);
                   6492:                S += SR*(DX)^(J-I);
1.70      takayama 6493:     }
1.6       takayama 6494:        return [S,P,M];
                   6495: }
                   6496:
                   6497: def qdo(P,Q,L)
                   6498: {
                   6499:        L = vweyl(L); DX = L[1]; OD = deg(P,DX);
                   6500:        V = newvect(OD+1);
                   6501:        for(I = 0; I <= OD; I++){
                   6502:                if(I)
                   6503:                        Q = muldo(DX,Q,L);
                   6504:                S = divdo(Q,P,L);
                   6505:                V[I] = S[1]*DX-S[2]*zz^I;
                   6506:        }
                   6507:        for(K = [], I = OD; I >= 0; I--)
                   6508:                K = cons(DX^(I+1), K);
                   6509:        R = lsol(V,K);
                   6510:        S = length(R);
                   6511:        for(I = P1 = 0; I < S; I++){
                   6512:                if(type(R[I]) < 4 && mydeg(R[I],DX) == 0 && R[I] != 0
                   6513:                        && (mydeg(R[I],zz) <= mydeg(P,DX)))
                   6514:                                P1 = R[I];
                   6515:                else if(type(R[I]) == 4 && R[I][0] == DX)
                   6516:                                P2 = R[I][1];
                   6517:        }
                   6518:        T=fctr(P1);
                   6519:        for(I=0, S=length(T), P1=1; I<S; I++){
                   6520:                if(mydeg(T[I][0],zz) > 0)
                   6521:                        P1 *= T[I][0]^(T[I][1]);
                   6522:        }
                   6523:        return subst([P1,P2],zz,DX);
                   6524: }
                   6525:
                   6526: def sqrtdo(P,L)
                   6527: {
                   6528:        L = vweyl(L);
                   6529:        P = toeul(P,L,0);
                   6530:        V = -1;
                   6531:        for(R = 0, Ord = mydeg(P,L[1]); Ord >= 0; Ord--){
                   6532:                Q = coef(P,Ord,L[1]);
                   6533:                M = mydeg(Q,L[0]);
                   6534:                N = mymindeg(Q,L[0]);
                   6535:                if(V < 0)
                   6536:                        V = M+N;
                   6537:                else if(V != M+N){
                   6538:                        print("Cannot be transformed!");
                   6539:                        return;
                   6540:                }
                   6541:                Q = tohomog(red(Q/L[0]^N), [L[0]], z_z);
                   6542:                if(irem(Ord,2))
                   6543:                        B = x-z_z;
                   6544:                else
                   6545:                        B = x+z_z;
                   6546:                Q = substblock(Q,x,B,z_zz);
                   6547:                if(mydeg(Q,x) > 0){
                   6548:                        print("Cannot be transformed!");
                   6549:                        return;
                   6550:                }
                   6551:                R += mysubst(Q,[z_zz,x])*L[1]^Ord;
                   6552:        }
                   6553:        return fromeul(R,L,0);
                   6554: }
                   6555:
                   6556: def ghg(A,B)
                   6557: {
                   6558:        R = dx;
                   6559:        while(length(B)>0){
                   6560:                R = muldo(x*dx+car(B),R,[x,dx]);
                   6561:                B = cdr(B);
                   6562:        }
                   6563:        T = 1;
                   6564:        while(length(A)>0){
                   6565:                T = muldo(x*dx+car(A),T,[x,dx]);
                   6566:                A = cdr(A);
                   6567:        }
                   6568:        return R-T;
                   6569: }
                   6570:
                   6571: def ev4s(A,B,C,S,T)
                   6572: {
                   6573:  R4 = x^2*(x-1)^2;
                   6574:  R3 = x*(x-1)*((2*A-2*B-8)*x-2*A+5);
                   6575:  R2 = (-3/2*(A^2+B^2)+3*A*B+9*A-9*B-29/2+1/4*(S^2+T^2))*x^2
                   6576:        +(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
                   6577:        - (2*A+2*C-5)*(2*A-2*C-3)/4;
                   6578:  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
                   6579:         +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
                   6580: #if 1
                   6581:         + A^2*B
                   6582: #endif
                   6583:         - B*C^2 - A^3/2+(2*A-3)*(S^2+T^2)/8;
                   6584: /* OK? for the above term added */
                   6585:  R0 = -(A-B-1-S)*(A-B-1+S)*(A-B-1-T)*(A-B-1+T)/16;
                   6586:  return (R4*dx^4-R3*dx^3-R2*dx^2-R1*dx-R0);
                   6587: }
                   6588:
                   6589: def b2e(A,B,C,S,T)
                   6590: {
                   6591:        R4 = x^2*(x-1)^2;
                   6592:        R3 = x*(x-1)*(2*x-1)*(2*c-5);
                   6593:        R2 = (-6*C^2+24*C-25+1/2*S^2+1/2*T^2)*x^2
                   6594:                        +(6*C^2-24*C+25-1/2*S^2-1/2*T^2-A^2+B^2+A-B)*x
                   6595:                        +A^2-C^2-A+4*C-15/4;
                   6596:        R1 = (2*C-3)*(2*C^2-6*C+5-1/2*S^2-1/2*T^2)*x
                   6597:                        +(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);
                   6598:        R0 = -(2-2*C+S+T)*(2-2*C-S-T)*(2-2*C+S-T)*(2-2*C-S+T)/16;
                   6599:  return (R4*dx^4-R3*dx^3-R2*dx^2-R1*dx-R0);
                   6600: }
                   6601:
                   6602:
                   6603: /*
                   6604:        T^m = T(T-1)....(T-m+1)
                   6605:        f(t) -> g(t)
                   6606:
                   6607:        f(t)   = a_mt^m + ... + a_1t+a_0
                   6608:        g(x*dx) = a_m*x^m*dx^m + ... + a_1*x*dx+a_0
                   6609:
                   6610:        ret: x(x-1)...(x-i+1)
                   6611:  */
                   6612: def sftpow(X,I)
                   6613: {
                   6614:         R = 1;
                   6615:         for(J=0;J<I;J++)
                   6616:                R *= X-J;
                   6617:         return(R);
                   6618: }
                   6619:
                   6620: /*
                   6621:        ret: x(x+K)(x+2*k)...(x+(i-1)*k)
                   6622: */
                   6623: def sftpowext(X,I,K)
                   6624: {
                   6625:         R = 1;
                   6626:         for(J=0;J<I;J++)
                   6627:                R *= X+K*J;
                   6628:         return(R);
                   6629: }
                   6630:
                   6631: def polinsft(F,A)
                   6632: {
                   6633:         R = 0;
                   6634:         while(F != 0){
                   6635:                 D = mydeg(F,A);
                   6636:                 C = mycoef(F,D,A);
                   6637:                 R += C*A^D;
                   6638:                 F -= C*sftpow(A,D);
                   6639:         }
                   6640:         return R;
                   6641: }
                   6642:
                   6643: def pol2sft(F,A)
                   6644: {
                   6645:        S=getopt(sft);
                   6646:        if(type(S)<0 || type(S)>2) S=1;
                   6647:        R = 0;
                   6648:        for(I = mydeg(F,A); I >= 0; I--)
                   6649:                R = R*(A-I*S) + mycoef(F,I,A);
                   6650:        return R;
                   6651: }
                   6652:
                   6653: def binom(P,N)
                   6654: {
1.20      takayama 6655:        if(type(N)!=1 || N<=0) return 1;
1.6       takayama 6656:        for(S=1;N>0;N--,P-=1)   S*=P/N;
                   6657:        return red(S);
                   6658: }
                   6659:
                   6660: def expower(P,R,N)
                   6661: {
                   6662:        if(type(N)!=1 || N<0) return 0;
                   6663:        for(S=S0=K=1;K<=N;K++,R-=1){
                   6664:                S0*=P*R/K;S+=S0;
                   6665:        }
                   6666:        return red(S);
                   6667: }
                   6668:
                   6669: def seriesHG(A,B,X,N)
                   6670: {
1.20      takayama 6671:        if(N==0) return 1;
1.6       takayama 6672:        if(type(N)!=1 || N<0) return 0;
                   6673:        if(type(X)<4){
                   6674:                for(K=0,S=S0=1;K<N;K++){
                   6675:                        for(T=A; T!=[]; T=cdr(T))       S0*=car(T)+K;
                   6676:                        for(T=B; T!=[]; T=cdr(T))       S0/=car(T)+K;
                   6677:                        S0=red(S0*X/(K+1));
                   6678:                        DN=dn(S0);
                   6679:                        S=red((red(S*DN)+nm(S0))/DN);
                   6680:                }
                   6681:                return S;
                   6682:        }
                   6683:        S=0;
                   6684:        for(K=0;K<=N;K++){
                   6685:                for(I=0;I<=N-K;I++){
                   6686:                        C=1/sftpowext(1,I,1)/sftpowext(1,J,1);
                   6687:                        for(T=A[0];T!=[];T=cdr(T)) C*=sftpowext(car(T),I+K,1);
                   6688:                        for(T=A[1];T!=[];T=cdr(T)) C*=sftpowext(car(T),I,1);
                   6689:                        for(T=A[2];T!=[];T=cdr(T)) C*=sftpowext(car(T),K,1);
                   6690:                        for(T=B[0];T!=[];T=cdr(T)) C/=sftpowext(car(T),I+K,1);
                   6691:                        for(T=B[1];T!=[];T=cdr(T)) C/=sftpowext(car(T),I,1);
                   6692:                        for(T=B[2];T!=[];T=cdr(T)) C/=sftpowext(car(T),K,1);
                   6693:                        S+=red(C*X[0]^I*X[1]^K);
                   6694:                }
                   6695:        }
                   6696:        return S;
                   6697: }
                   6698:
                   6699: def evalred(F)
                   6700: {
                   6701:        Opt=getopt(opt);
                   6702:        if(type(Opt)!=4){
                   6703:                 Opt=[];
                   6704:        }else if(length(Opt)==2 && type(Opt[0])!=4)     Opt=[Opt];
                   6705:        for(;;){
1.17      takayama 6706:                G=mysubst(F,[[tan(0),0],[asin(0),0],[atan(0),0],[sinh(0),0],[tanh(0),0],
                   6707:                        [log(1),0],[cosh(0),1],[exp(0),1]]);
1.6       takayama 6708:                for(Rep=Opt; Rep!=[]; Rep=cdr(Rep))
                   6709:                        G=subst(G,car(Rep)[0],car(Rep)[1]);
                   6710:                Var=vars(G);
                   6711:                for(V=Var; V!=[]; V=cdr(V)){
1.17      takayama 6712:                        if(!(VV=args(CV=car(V)))) continue;
                   6713:                        if((functor(CV)==sin||functor(CV)==cos)){
                   6714:                                P=2*red(VV[0]/@pi);
                   6715:                                if(functor(CV)==sin) P=1-P;
                   6716:                                if(isint(P)){
                   6717:                                        if(iand(P,1)) G=subst(G,CV,0);
                   6718:                                        else if(!iand(P,3)) G=subst(G,CV,1);
                   6719:                                        else G=subst(G,CV,-1);
                   6720:                                        continue;
                   6721:                                }
                   6722:                                if(isint(P*=3/2)){
                   6723:                                        if(iand(P,3)==1) G=subst(G,CV,1/2);
                   6724:                                        else G=subst(G,CV,-1/2);
                   6725:                                }
                   6726:                        }
                   6727:                        for(;VV!=[];VV=cdr(VV))
                   6728:                                if(car(VV)!=(TV=evalred(car(VV)))) G=subst(G,car(VV),TV);
                   6729:                        if(functor(CV)!=pow || (args(CV)[0])!=1) continue;
                   6730:                        G=subst(G,CV,1);
1.6       takayama 6731:                }
                   6732:                if(G==F) return F;
                   6733:                F=G;
                   6734:        }
                   6735: }
                   6736:
                   6737: def seriesMc(F,N,V)
                   6738: {
                   6739:        if(type(V)<4) V=[V];
                   6740:        V=reverse(V);
                   6741:        L=length(V);
                   6742:        if(type(Opt=getopt(evalopt))!=4) Opt=[];
                   6743:        P=newvect(L);
                   6744:        G=newvect(L+1);
                   6745:        G[0]=F;
                   6746:        for(I=0;I<L;I++)
                   6747:                G[I+1]=eval(evalred(subst(G[I],V[I],0)|opt=Opt));
                   6748:        R=G[L];
                   6749:        for(;;){
                   6750:                for(M=0,I=0;I<L;I++){
                   6751:                        M+=P[I];
                   6752:                        if(M==N) break;
                   6753:                }
                   6754:                if(M<N){
                   6755:                        P[L-1]++;
                   6756:                        G[L-1]=mydiff(G[L-1],V[L-1]);
                   6757:                        G[L]=eval(evalred(mysubst(G[L-1],[V[L-1],0])|opt=Opt));
                   6758:                }else{
                   6759:                        if(I--==0) break;
                   6760:                        P[I]++;
                   6761:                        G[I]=mydiff(G[I],V[I]);
                   6762:                        while(I++<L){
                   6763:                                G[I]=eval(evalred(mysubst(G[I-1],[V[I-1],0])|opt=Opt));
                   6764:                                if(I<L) P[I]=0;
                   6765:                        }
                   6766:                }
                   6767:                K=1;
                   6768:                for(I=0;I<L;I++) K*=V[I]^P[I]/fac(P[I]);
                   6769:                R+=G[L]*K;
                   6770:        }
                   6771:        return R;
                   6772: }
                   6773:
                   6774: def seriesTaylor(F,N,V)
                   6775: {
                   6776:        G=F;
                   6777:        if(isvar(V)) V=[V];
                   6778:        if(length(V)==2 && type(car(V))!=4 && !isvar(V[1])) V=[V];
                   6779:        for(V0=V1=[];V!=[];V=cdr(V)){
                   6780:                if(type(T=car(V))!=4) T=[T];
                   6781:                V0=cons(X=car(T),V0);
                   6782:                if(length(T)==1 || T[1]==0){
                   6783:                        V1=cons(X,V1);continue;
                   6784:                }
                   6785:                S=my_tex_form(-T[1]);
                   6786:                if(str_char(S,0,"-")!=0) S="+"+S;
                   6787:                S="("+my_tex_form(X)+S+")";
                   6788:                V1=cons([X,S],V1);
                   6789:                F=red(subst(F,T[0],T[0]+T[1]));
                   6790:        }
                   6791:        V0=reverse(V0);V1=reverse(V1);
                   6792:        F=seriesMc(F,N,V0|option_list=getopt());
                   6793:        if(getopt(frac)==0) F=frac2n(F);
                   6794:        T=getopt(dviout);
                   6795:        if(type(T)!=1) T=0;
                   6796:        F=fctrtos(F|var=V1,rev=1,TeX=(T==0||T==2)?2:3);
                   6797:        if(getopt(small)==1) F=str_subst(F,"\\frac{","\\tfrac{");
                   6798:        if(T<0 || T==1) F="\\begin{align}\\begin{split}\n"+
                   6799:                my_tex_form(G)+"&="+F+"+\\cdots\n\\end{split}\\end{align}\n";
                   6800:        if(T==1) dviout(F);
                   6801:        else if(T==1) dviout(F|eq=4);
                   6802:        return F;
                   6803: }
                   6804:
1.27      takayama 6805: def mulpolyMod(P,Q,X,N)
                   6806: {
                   6807:        Red=(type(P)>2||type(Q)>2)?1:0;
                   6808:        for(I=R=0;I<=N;I++){
                   6809:                P0=mycoef(P,I,X);
                   6810:                for(J=0;J<=N-I;J++){
                   6811:                        R+=P0*mycoef(Q,J,X)*X^(I+J);
                   6812:                        if(Red) R=red(R);
                   6813:                }
                   6814:        }
                   6815:        return R;
                   6816: }
                   6817:
1.46      takayama 6818: def solveEq(L,V)
                   6819: {
                   6820:        Inv=0;K=length(V);
                   6821:        H=(getopt(h)==1)?1:0;
                   6822:        if(getopt(inv)==1){
                   6823:                if(K!=length(L)) return -5;
                   6824:                Inv=1;
                   6825:                VN=makenewv(vars(L)|num=K);
                   6826:                for(TL=[],I=K-1;I>=0;I--) TL=cons(VN[I]-L[I],TL);
                   6827:                S=solveEq(TL,V|h=H);
                   6828:                if(type(S)!=4) return S;
                   6829:                return mysubst(S,[VN,V]|lpair=1);
                   6830:        }
                   6831:        for(TL=[];L!=[];L=cdr(L)) TL=cons(nm(red(car(L))),TL);
                   6832:        S=gr(TL,reverse(V),2);
                   6833:        if(length(S)!=K) return -1;
                   6834:        for(R=[],I=F=0;I<K;I++){
                   6835:                TS=S[I];
                   6836:                VI=lsort(vars(TS),V,2);
                   6837:                if(length(VI)!=1) return -2;
                   6838:                if((VI=car(VI))!=V[I]) return -3;
                   6839:                if(mydeg(TS,VI)!=1){
                   6840:                        F=1;R=cons([VI,TS],R);
                   6841:                }else R=cons(-red(mycoef(TS,0,VI)/mycoef(TS,1,VI)),R);
                   6842:        }
                   6843:        R=reverse(R);
                   6844:        if(!F||H==1) return R;
                   6845:        return -4;
                   6846: }
                   6847:
1.45      takayama 6848: /* Opt: f, var, ord, to, in, TeX */
                   6849: def baseODE(L)
                   6850: {
1.47      takayama 6851:        SV=SVORG;
1.45      takayama 6852:        if(type(TeX=getopt(TeX))!=1) TeX=0;
                   6853:        if(type(F=getopt(f))!=1) F=0;
1.46      takayama 6854:        if(isint(In=getopt(in))!=1) In=0;
1.45      takayama 6855:        if(type(Ord=getopt(ord))!=1&&Ord!=0) Ord=2;
1.70      takayama 6856:        Pages=getopt(pages);
                   6857:        if(Pages!=1&&Pages!=2) Pages=0;
1.45      takayama 6858:        if(Ord>3){
                   6859:                Ord-=4; Hgr=1;
1.47      takayama 6860:        }else Hgr=0;
1.70      takayama 6861:        if(type(car(L0=L))==4&&type(L[1])==7){
1.45      takayama 6862:                Tt=L[1];L=car(L);
                   6863:        }
1.47      takayama 6864:        M=N=length(L);  SV=SVORG;
                   6865:        if(type(Var=getopt(var))==4&&(In>0||length(Var)==N)){
1.45      takayama 6866:                SV=Var;
                   6867:                M=length(SV);
                   6868:                if(type(car(SV))==2){
                   6869:                        for(R=[];SV!=[];SV=cdr(SV)) R=cons(rtostr(car(SV)),R);
                   6870:                        SV=reverse(R);
                   6871:                }
1.47      takayama 6872:        }else{
                   6873:                if(N>10){
                   6874:                        R=[];
                   6875:                        for(K=M-1;K>9;K++) R=cons(SV[floor(K/10)-1]+SV[K%10],R);
                   6876:                        SV=append(SV,R);
                   6877:                }
                   6878:                for(Var=[],I=M-1;I>=0;I--) Var=cons(makev([SV[I]]),Var);
                   6879:        }
                   6880:        if(type(To=getopt(to))<2||type(To)>4) To=0;
1.70      takayama 6881:        if(Ord<0){      /* cancell y1, z1,... by baseODE0() */
1.73      takayama 6882:                if(Ord==-1) Ord=2;
                   6883:                if(type(To)==4||!isvar(To)){
                   6884:                        L=L0=baseODE(L0|to=To,f=-3)[1];
                   6885:                        To=0;
                   6886:                }
1.70      takayama 6887:                R=baseODE0(L|option_list=
                   6888:                        delopt(getopt(),[["var",Var],["ord",Ord]]|inv=1));
                   6889:                if(TeX){
                   6890:                        if(type(R)==4&&length(R)>1&&type(R[1])==4) R=R[1];
1.73      takayama 6891:                        if(type(To)==2 && !isvar(To)){
                   6892:                                S0=baseODE(L0|TeX=1,f=-1,to=To);
                   6893:                                V=baseODE0(L|step=-1,to=To);
                   6894:                        }else{
                   6895:                                S0=baseODE(L0|TeX=1,f=-1);
                   6896:                                V=baseODE0(L|step=-1,to=To);
                   6897:                        }
1.70      takayama 6898:                        T=eqs2tex(R,[V,2,Pages]);
                   6899:                        S=((F==1)?(Tt+"\n"):S0)+texbegin("align*",T);
                   6900:                        if(TeX==2) dviout(S);
                   6901:                        return S;
                   6902:                }
                   6903:                return R;
                   6904:        }
                   6905:        if(To&&!isvar(To)){
1.49      takayama 6906:                if(type(To)!=4){
                   6907:                        To=red(To);
                   6908:                        for(K=0;K<length(Var);K++){
                   6909:                                I=mydeg(nm(To),Var[K]);J=mydeg(dn(To),Var[K]);
                   6910:                                if(I+J>0&&I<2&&J<2) break;
                   6911:                        }
                   6912:                        if(K==length(Var)) return -9;
                   6913:                        J=To;
                   6914:                        for(To=[],I=length(Var)-1;I>=0;I--)
                   6915:                                if(I!=K) To=cons(Var[I],To);
                   6916:                        To=cons(J,To);
                   6917:                }
1.47      takayama 6918:                if(type(To)==4){
                   6919:                        if(type(car(To))==4){
                   6920:                                R=1;To=car(To);
                   6921:                        }else R=0;
1.48      takayama 6922:                        if(type(IL=solveEq(To,Var|inv=1))!=4) return IL;
1.47      takayama 6923:                        if(R==1){
                   6924:                                R=To;To=IL;IL=R;
                   6925:                        }
                   6926:                        L=mulsubst(L,[Var,IL]|lpair=1);
                   6927:                        if(!In){   /* X_i'=\sum_j(\p_{x_j}X_i)*x_j' */
                   6928:                                for(TL=[],I=M-1;I>=0;I--){
                   6929:                                        P=To[I];Q=mydiff(P,t);
                   6930:                                        for(J=0;J<M;J++) Q=red(Q+mydiff(P,Var[J])*L[J]);
                   6931:                                        TL=cons(Q,TL);
                   6932:                                }
                   6933:                                L=TL;
                   6934:                        }else{  /* x_i'=\sum_j(\p_{X_j}x_i)*X_j' */
                   6935:                                for(I=M-1;I>=0;I--){
                   6936:                                        P=IL[I];Q=mydiff(P,t);
                   6937:                                        for(J=0;J<M;J++){
                   6938:                                                V=makev([SV[J],1]);
                   6939:                                                Q=red(Q+mydiff(P,V)*V);
                   6940:                                        }
                   6941:                                        L=mysubst(L,[makev([SV[I],1]),TL[I]]);
                   6942:                                }
                   6943:                                for(TL=L,L=[],I=M-1;I>=0;I--) L=cons(num(TL[I]),L);
                   6944:                        }
                   6945:                }
1.45      takayama 6946:        }
1.73      takayama 6947:        if(F==-3&&!TeX) return [Var,L];
1.48      takayama 6948:        for(I=0;I<M;I++) L=subst(L,Var[I],makev([SV[I],0]));
1.45      takayama 6949:        if(TeX){
                   6950:                for(TL=L,I=0;I<M;I++)
1.47      takayama 6951:                        TL=subst(TL,makev([SV[I],0]),Var[I]);
1.45      takayama 6952:                for(I=0;I<N;I++){
                   6953:                        if(I) S0+=",\\\\\n";
                   6954:                        if(In) S0+=" "+my_tex_form(TL[I])+"=0";
                   6955:                        else S0+=" "+SV[I]+"'\\!\\!\\! &= "+my_tex_form(TL[I]);
                   6956:                }
                   6957:                S0+=".\n";
                   6958:                S0=texbegin("cases", S0);
                   6959:                S0=texbegin("align",S0);
                   6960:                if(type(Tt)==7) S0=Tt+"\n"+S0;
1.47      takayama 6961:                if(F<0){
1.70      takayama 6962:                        if(TeX==2)dviout(S0);
1.45      takayama 6963:                        return S0;
                   6964:                }
                   6965:        }
1.47      takayama 6966:        for(I=0,TL=[];L!=[];L=cdr(L),I++){
                   6967:                T=car(L);
                   6968:                if(!In) T=makev([SV[I],1])-T;
                   6969:                TL=cons(nm(red(T)),TL);
1.45      takayama 6970:        }
1.47      takayama 6971:        if(isvar(To)){
1.48      takayama 6972:                T=rtostr(To);
1.45      takayama 6973:                IT=findin(T,SV);
                   6974:                if(IT>=0 && IT<M){
                   6975:                        R=[SV[IT]];
                   6976:                        for(J=0;SV!=[];SV=cdr(SV),J++){
                   6977:                                if(J==IT) continue;
                   6978:                                R=cons(car(SV),R);
                   6979:                        }
                   6980:                        SV=reverse(R);
                   6981:                }else{
                   6982:                        IT=0;
                   6983:                        mycat(["Cannot find variable", T, "!\n"]);
                   6984:                }
                   6985:        }
                   6986:        for(S=1;S<M;S++){
                   6987:                L=append(TL,L);
                   6988:                TL=reverse(TL);
                   6989:                for(RL=[];TL!=[];TL=cdr(TL)){
                   6990:                        if(In==0&&S==N-1&&length(TL)!=N-IT) continue;
1.47      takayama 6991:                        T=car(TL);R=mydiff(V,t);
1.45      takayama 6992:                        for(I=0;I<M;I++){
                   6993:                                for(J=0;J<=S;J++){
                   6994:                                        V=makev([SV[I],J]|num=1);
1.47      takayama 6995:                                        if((DR=mydiff(T,V))!=0) R+=DR*makev([SV[I],J+1]|num=1);
1.45      takayama 6996:                                }
                   6997:                        }
                   6998:                        RL=cons(R,RL);
                   6999:                }
                   7000:                TL=RL;
                   7001:        }
                   7002:        L=append(TL,L);
1.48      takayama 7003:        for(I=0;I<M;I++) L=subst(L,makev([SV[I],0]),Var[I]);
1.70      takayama 7004:        if(!isint(Vl=getopt(vl))) Vl=0;
                   7005:        if(!Vl||Vl==1){
                   7006:                V=[makev([SV[0]])];
                   7007:                for(VV=[],J=1;J<=M;J++)
                   7008:                        V=cons(makev([SV[0],J]),V);
                   7009:                for(I=1;I<M;I++)
                   7010:                        V=cons(makev([SV[I]]),V);
1.45      takayama 7011:                if(F==-2){
                   7012:                        VV=cons(V,VV);
                   7013:                        V=[];
                   7014:                }
1.70      takayama 7015:                for(I=1;I<M;I++){
                   7016:                        for(J=1;J<M;J++) V=cons(makev((!Vl)?[SV[I],J]:[SV[J],I]),V);
                   7017:                        if(In) V=cons(makev([SV[0],M]),V);
                   7018:                        if(F==-2){
                   7019:                                VV=cons(V,VV);
                   7020:                                V=[];
                   7021:                        }
                   7022:                }
                   7023:        }else{
                   7024:                for(V=VV=[],I=0;I<M;I++){
                   7025:                        for(J=0;J<M;J++) V=cons(J?makev([SV[I],J]):makev([SV[I]]),V);
                   7026:                        if(!I||In) V=cons(makev([SV[0],M]),V);
                   7027:                        if(F==-2){
                   7028:                                VV=cons(V,VV);
                   7029:                                V=[];
                   7030:                        }
                   7031:                }
1.45      takayama 7032:        }
                   7033:        if(F>=0&&!chkfun("gr",0)){
                   7034:                mycat("load(\"gr\"); /* <- do! */\n");
                   7035:                F=-1;
                   7036:        }
                   7037:        if(F==-2) return [VV,L];
                   7038:        if(F<0) return [V,L];
1.70      takayama 7039:        LL=(Hgr==1)?hgr(L,V,Ord):gr(L,V,Ord);
1.45      takayama 7040:        if(F==2) return [V,L,LL];
                   7041:        if(Ord==2) P=LL[0];
                   7042:        else{
                   7043:                P=LL[length(LL)-1];
                   7044:                for(RV=reverse(V), I=0;I<M+1;I++) RV=cdr(RV);
                   7045:                if(lsort(vars(P),RV,2)!=[]){
                   7046:                        LL=tolex_tl(LL,V,Ord,V,2);P=LL[0];
                   7047:                }
                   7048:        }
                   7049:        if(TeX){
1.70      takayama 7050:                for(V0=[],I=1;I<=M;I++) V0=cons(makev([car(SV),I]),V0);
                   7051:                T=eqs2tex(P,[V0,2,Pages]);
                   7052:                if(!Vl||Vl==1){
                   7053:                        for(I=1,K=0;I<length(LL);I++){
                   7054:                                TV=makev([SV[I-K]]);
                   7055:                                if(findin(TV,vars(LL[I]))<0){
                   7056:                                                K++;continue;
                   7057:                                }
                   7058:                                T+=eqs2tex(LL[I],[cons(TV,V0),2,Pages,1]);
                   7059:                        }
                   7060:                }
                   7061:                S=((F==1)?(Tt+"\n"):S0)+texbegin("align*",T);
1.45      takayama 7062:                if(TeX==2) dviout(S);
                   7063:                return S;
                   7064:        }
                   7065:        return (F==1)? P:[P,V,L,LL];
                   7066: }
                   7067:
1.70      takayama 7068:
                   7069: def eqs2tex(P,L)
                   7070: {
                   7071:        if(isvar(L)) L=[0,L];
                   7072:        if(type(L)!=4) L=[];
                   7073:        Sgn=0;
                   7074:        if(L!=[]){
1.71      takayama 7075:                if(car(L)==0) L=[L];
                   7076:                else if(length(L)>1 && isvar(L[1])) L=[L];
1.70      takayama 7077:                R=car(L);L=cdr(L);Sgn=1;
                   7078:        }else R=[];
                   7079:        if(type(R)==4&&car(R)==0){
                   7080:                Sgn=0;R=cdr(R);
                   7081:        }
                   7082:        if(L!=[]){
                   7083:                Dic=car(L);L=cdr(L);
                   7084:        }
                   7085:        if(L!=[]){
                   7086:                Pages=car(L);L=cdr(L);
                   7087:        }
                   7088:        if(L!=[]) Cont=car(L);
                   7089:        if(type(P)==4){
                   7090:                for(S="";P!=[];P=cdr(P)){
                   7091:                        S+=eqs2tex(car(P),[R,Dic,Pages,Cont]);
                   7092:                        if(!Cont) Cont=1;
                   7093:                }
1.73      takayama 7094: /*             S=str_subst(S,"\\\\&,\\\\",",\\\\&"); */
1.70      takayama 7095:                if(getopt(dviout)==1) dviout(S|eq=6);
                   7096:                return S;
                   7097:        }
                   7098:        if(type(R)==2) R=[R];
                   7099:        if(Sgn){
                   7100:                for(;R!=[];R=cdr(R))
                   7101:                        if((Deg=mydeg(P,car(R)))>0) break;
                   7102:                if(Deg>0){
                   7103:                        CP=mycoef(P,Deg,car(R));
                   7104:                        if(cmpsimple(-CP,CP)<0) P=-P;
                   7105:                }
                   7106:        }
                   7107:        S="&\\!\\!\\!";
                   7108:        if(Cont)
                   7109:                 S=(Pages?",\\allowdisplaybreaks":",")+"\\\\\n"+S;
                   7110:        S+=fctrtos(P|var=R,dic=Dic,TeX=3,pages=Pages);
                   7111:        if(getopt(dviout)==1) dviout(S|eq=6);
                   7112:        return S;
                   7113: }
                   7114:
1.71      takayama 7115: /* Opt: var, opt, dbg */
1.70      takayama 7116: def res0(P,Q,X)
                   7117: {
1.71      takayama 7118:        if(!isvar(X)){
                   7119:                if(!isvar(P)) return -1;
                   7120:                Y=P;P=Q;Q=X;X=Y;
                   7121:        }
                   7122:        if(isvar(Var=getopt(var))) Var=[Var];
1.73      takayama 7123:        else if(type(Var)!=4) Var=0;
                   7124:        if(type(W=getopt(w))!=4) W=[];
                   7125:        if(!isint(Opt=getopt(opt))&&type(Opt)!=4) Opt=0;
1.72      takayama 7126:        if(type(Dbg=getopt(dbg))==4){
                   7127:                Fct=Dbg[1];Dbg=Dbg[0];
                   7128:        }
                   7129:        if(!isint(Dbg)) Dbg=0;
1.70      takayama 7130:        P=nm(P);Q=nm(Q);
1.71      takayama 7131:        Fctr=isfctr(P)*isfctr(Q);
1.70      takayama 7132:        DP=deg(P,X);DQ=deg(Q,X);
1.71      takayama 7133:        if(DP==DQ&&nmono(coef(P,DP,X))<nmono(coef(Q,DQ,X))){
                   7134:                R=P;P=Q;Q=R;
                   7135:                R=DP;DP=DQ;DQ=R;
                   7136:        }
1.70      takayama 7137:        while(DQ>0){
                   7138:                if(DP<DQ){
                   7139:                        R=P;P=Q;Q=R;
                   7140:                        R=DP;DP=DQ;DQ=R;
                   7141:                        if(Opt==-1) return [P,Q,DP,DQ];
                   7142:                        if(DQ<1) break;
                   7143:                }
1.72      takayama 7144:                if(Dbg){
                   7145:                        if(Dbg>=2) mycat([DP,"(",nmono(P), nmono(coef(P,DP,X)),") :",
                   7146:                                DQ, "(",nmono(Q),nmono(coef(Q,DQ,X)), ")"]);
                   7147:                        else mycat0([DP,":",DQ,","],0);
                   7148:                }
1.70      takayama 7149:                TQ=coef(Q,DQ,X);TP=coef(P,DP,X);
1.71      takayama 7150:                if(Fctr){
                   7151:                        T=gcd(TP,TQ);M=red(TQ/T);
                   7152:                        if(Var&&M!=car(W)&&type(TV=vars(M))==4&&lsort(TV,Var,2)!=[]) W=cons(M,W);
                   7153:                        P=M*(P-coef(P,DP,X)*X^DP)-red(TP/T)*X^(DP-DQ)*(Q-coef(Q,DQ,X)*X^DQ);
                   7154:                        if(Var){
1.72      takayama 7155: #if 1
                   7156:                                if(Dbg>2) mycat0(">",0);
                   7157:                                for(S=SS=fctr(P),P=1,C=0;S!=[];S=cdr(S)){
1.71      takayama 7158:                                        TV=vars(S0=car(S)[0]);
                   7159:                                        if(type(TV)==4&&lsort(TV,Var,2)!=[]){
1.72      takayama 7160:                                                for(TW=W;TW!=[];TW=cdr(TW)){
1.71      takayama 7161:                                                        if(gcd(car(TW),S0)!=1){
                   7162:                                                                S0=1;break;
                   7163:                                                        }
1.72      takayama 7164:                                                }
                   7165:                                                if(Dbg>1){
                   7166:                                                        if(S0==1) mycat(["Reduced by :",nmono(car(TW))]);
                   7167:                                                        else if(C++>0){
                   7168:                                                                mycat(["Product :", nmono(P), nmono(S0)]);
                   7169:                                                                if(Dbg==3){
                   7170:                                                                        if(!Fct||Fct==[]){
1.73      takayama 7171:                                                                                if(C>1) P=1;
1.72      takayama 7172:                                                                        }else{
                   7173:                                                                                if(car(Fct)==C){
                   7174:                                                                                        C=10000;Fct=cdr(Fct);P=1;
                   7175:                                                                                }else S0=1;
                   7176:                                                                        }
                   7177:                                                                }else if(Dbg==4) return [SS,Q,DP,DQ,W];
                   7178:                                                        }
                   7179:                                                }
1.71      takayama 7180:                                                P*=S0;
                   7181:                                        }
                   7182:                                }
1.72      takayama 7183: #else
                   7184:                                for(TW=W;TW!=[];TW=cdr(TW)){
                   7185:                                        if((C=gcd(P,car(TW)))!=1){
                   7186:                                                P=red(P/C);
                   7187:                                                if(Dbg>=2&&nmono(Q)>1) mycat(["Reduce :",nmono(C)]);
                   7188:                                        }
                   7189:                                }
                   7190: #endif
1.70      takayama 7191:                        }
1.71      takayama 7192:                }else{
                   7193:                        if(type(TQ)==1){
                   7194:                                Q/=TQ;
                   7195:                                P=P-TP*X^(DP-DQ)*Q;
                   7196:                        }else P=TQ*P-TP*X^(DP-DQ);
                   7197:                        if(deg(P,X)==DP) P-=coef(P,DP,X)*X^DP;
1.70      takayama 7198:                }
                   7199:                DP=deg(P,X);
1.73      takayama 7200:                if(Opt==-2||(type(Opt)==4&&Opt[0]==DP&&Opt[1]==DQ)) return [P,Q,DP,DQ,W];
1.72      takayama 7201:        }
                   7202:        if(Dbg){
                   7203:                if(Dbg>1)  mycat([DP,"(",nmono(P), nmono(coef(P,DP,X)),") :",
                   7204:                        DQ, "(",nmono(Q), nmono(coef(Q,DQ,X)), ")"]);
                   7205:                else mycat0([DP,":",DQ," "],0);
1.70      takayama 7206:        }
1.73      takayama 7207:        if(Opt==1) Q=[P,Q,DP,DQ,W];
1.70      takayama 7208:        return (DQ==0)?Q:0;
                   7209: }
                   7210:
1.72      takayama 7211: /* Opt : f, var, ord, ord, step, f, to */
1.70      takayama 7212: def baseODE0(L)
                   7213: {
1.73      takayama 7214:        if(!isint(Ord=getopt(ord))) Ord=-1;
                   7215:        if(Ord==-1) Ord=2;
                   7216:        if(Ord<O) Ord++;
1.70      takayama 7217:        if(!isint(F=getopt(f))) F=0;
1.73      takayama 7218:        if(!isint(Dbg=getopt(dbg))) Dbg=0;
                   7219:        if(type(Step=getopt(step))==4) Dstep=Step;
                   7220:        else Dstep=0;
                   7221:        if(!isint(Step)) Step=0;
1.70      takayama 7222:        if(F<0) Step=1;
                   7223:        if(Step>0&&Ord>0) Ord=-1;
                   7224:        N=length(L);
                   7225:        if(type(To=getopt(to))==4&&length(To)==N){
                   7226:                V=cdr(To);To=car(To);
                   7227:        }
1.72      takayama 7228:        if(!isvar(To)) To=V=0;
1.70      takayama 7229:        if(type(SV=Var=getopt(var))!=4){
                   7230:                SV=SVORG;
                   7231:                if(N>10){
                   7232:                        R=[];
                   7233:                        for(K=N-1;K>9;K++) R=cons(SV[floor(K/10)-1]+SV[K%10],R);
                   7234:                        SV=append(SV,R);
                   7235:                }
                   7236:                for(Var=[],I=N-1;I>=0;I--) Var=cons(makev([SV[I]]),Var);
                   7237:        }
                   7238:        if((J=findin(To,Var))>0){
                   7239:                TV=TL=[];
                   7240:                for(I=N-1;I>=0;I--){
                   7241:                        if(I!=J){
                   7242:                                TV=cons(Var[I],TV);TL=cons(L[I],TL);
                   7243:                        }
                   7244:                }
                   7245:                Var=cons(Var[J],TV);L=cons(L[J],TL);
                   7246:        }
                   7247:        if(!To) To=car(SV);
                   7248:        Q=car(L);
                   7249:        V0=makev([To,1]);
                   7250:        R=[V0-Q];V0=[V0];
                   7251:        for(I=2;I<=N;I++){
                   7252:                P=diff(t,Q);
                   7253:                if(type(P)==3) P=red(P);
                   7254:                for(TV=Var,TL=L;TV!=[];TV=cdr(TV),TL=cdr(TL)){
                   7255:                        P+=diff(Q,car(TV))*car(TL);
                   7256:                        if(type(P)==3) P=red(P);
                   7257:                }
                   7258:                Q=P;
                   7259:                TV=makev([To,I]);
                   7260:                R=cons(nm(TV-Q),R);
                   7261:                V0=cons(TV,V0);
                   7262:        }
                   7263:        if(Step==-1) return V0;
                   7264:        if(!V) V=cdr(Var);
                   7265:        if(Ord<0){
                   7266:                for(C=1,R0=[];V!=[];V=cdr(V),C++){
                   7267:                        TR=R=reverse(R);
                   7268:                        if(length(R)>1){        /* reduce common factor */
                   7269:                                P=car(TR);TR=cdr(TR);
1.72      takayama 7270:                                for(;TR!=[]&&P!=1;TR=cdr(TR))
1.70      takayama 7271:                                        P=gcd(P,car(TR));
                   7272:                                if(P!=1){
                   7273:                                        for(TR=[];R!=[];R=cdr(R)) TR=cons(red(car(R)/P),TR);
                   7274:                                        R=reverse(TR);
                   7275:                                }
                   7276:                        }
                   7277:                        TR=[];
                   7278:                        TV=car(V);
                   7279:                        if(length(V)==1) V0=[car(V0)];
                   7280:                        if(C==Step) return [append(V,V0),R];
                   7281:                        while(R!=[]&&findin(TV,vars(car(R)))<0){
                   7282:                                TR=cons(car(R),TR);
                   7283:                                R=cdr(R);
                   7284:                        }
1.72      takayama 7285:                        R0=(F==2)?append(R,R0):cons(car(R),R0);
1.70      takayama 7286:                        if(R!=[]){
1.73      takayama 7287:                                for(W=[],P=car(R),R=cdr(R); R!=[]; R=cdr(R)){
1.72      takayama 7288:                                        if(Dbg) mycat0(["\nStep ",C,"-",length(R)," ",TV,
                   7289:                                                (type(Dbg)==4||Dbg>=2)?"\n":" "],0);
1.70      takayama 7290:                                        if(findin(TV,vars(car(R)))<0){
                   7291:                                                TR=cons(car(R),TR);
                   7292:                                                continue;
                   7293:                                        }
                   7294:                                        if(Ord>-3){
1.73      takayama 7295:                                                if(Dstep&&Dstep[0]==C&&Dstep[1]==length(R))
                   7296:                                                        return res0(P,car(R),TV|var=V0,opt=cdr(cdr(Dstep)),dbg=Dbg);
                   7297:                                                else TQ=res0(P,car(R),TV|var=V0,opt=1,dbg=Dbg,w=W);
1.72      takayama 7298:                                                if(Dbg==4&&type(car(TQ))==4) return TQ;
1.70      takayama 7299:                                                if(Ord==-2) P=car(TQ);
1.73      takayama 7300:                                                W=TQ[4];TQ=TQ[1];
1.72      takayama 7301:                                        }else{
                   7302:                                                TQ=res(TV,P,car(R));
                   7303:                                                Q=fctr(TQ);     /* irreducible one */
                   7304:                                                for(TQ=1;Q!=[];Q=cdr(Q))
                   7305:                                                        if(lsort(V0,vars(car(Q)[0]),2)!=[]) TQ*=car(Q)[0];
                   7306:                                        }
1.70      takayama 7307:                                        TR=cons(TQ,TR);
                   7308:                                }
                   7309:                        }
                   7310:                        R=TR;
                   7311:                }
1.71      takayama 7312:                if(Dbg==1) mycat([]);
1.72      takayama 7313:                return (F==1)?car(R):(F==2?append(R,R0):cons(car(R),R0));
1.70      takayama 7314:        }
                   7315:        V=append(V,[makev([To,N])]);
                   7316:        if(Step==1) return [R,V];
                   7317:        R=gr(R,V,Ord);
                   7318:        return (F==1)?car(R):R; /* hgr(R,V,Ord); */
                   7319: }
                   7320:
                   7321:
1.26      takayama 7322: def taylorODE(D){
                   7323:        Dif=(getopt(dif)==1)?1:0;
                   7324:        if(D==0) return Dif?f:f_00;
1.27      takayama 7325:        if(type(T=getopt(runge))!=1||ntype(T)!=0) T=0;
1.26      takayama 7326:        if(type(F=getopt(f))!=7&&type(F)<2) F="f_";
                   7327:        if(type(D)!=1||ntype(D)!=0||D<0||D>30) return 0;
                   7328:        if(type(H=getopt(taylor))==4&&length(H)==2){
1.27      takayama 7329:                if(type(Lim=getopt(lim))==2) DD=D;
                   7330:                else if(type(Lim)==4){
                   7331:                        DD=Lim[1];Lim=Lim[0];
                   7332:                }else Lim=0;
                   7333:                for(R=I=0;I<=D;I++){
                   7334:                        if(I){
                   7335:                                if(Lim) H0=mulpolyMod(H0,H[0],Lim,DD);
                   7336:                                else H0*=H[0];
                   7337:                        }else  H0=1;
                   7338:                        if(type(F)!=7) G=I?mydiff(G,x):F;
                   7339:                        for(J=0;J<=D-I;J++){
                   7340:                                if(J){
                   7341:                                        if(Lim) H1=mulpolyMod(H1,H[1],Lim,DD);
                   7342:                                        else H1*=H[1];
                   7343:                                }else H1=H0;
                   7344:                                if(type(F)==7) G=makev([F,I,J]);
                   7345:                                else if(J) G=mydiff(G,y);
                   7346:                                R+=G*H1/fac(I)/fac(J);
1.26      takayama 7347:                        }
                   7348:                }
1.27      takayama 7349:                if(Lim) R=os_md.polcut(R,DD,Lim);
                   7350:                return R;
1.26      takayama 7351:        }else{
                   7352:                if(type(H=getopt(series))>=0||getopt(list)==1){
                   7353:                        if(type(F)!=7){
                   7354:                                for(PP=[F],I=1;I<D;I++)
                   7355:                                        PP=cons(mydiff(car(PP),x)+mydiff(car(PP),y)*F,PP);
                   7356:                                if(type(H)<0) return PP;
                   7357:                                for(R=0,DD=D;DD>=1;DD--,PP=cdr(PP)) R+=car(PP)*H^DD/fac(DD);
                   7358:                                return red(R);
                   7359:                        }
                   7360:                        if(type(H)>=0) D--;
                   7361:                        PP=taylorODE(D-1|list=1);
                   7362:                        if(type(PP)!=4) PP=[PP];
                   7363:                        P=car(PP);
                   7364:                }else P=taylorODE(D-1);
                   7365:                for(R=I=0;I<D;I++){
                   7366:                        for(J=0;J<D-I;J++){
                   7367:                                Q=diff(P,makev([F,I,J]));
                   7368:                                if(Q!=0) R+=Q*(f_00*makev([F,I,J+1])+makev([F,I+1,J]));
                   7369:                        }
                   7370:                }
                   7371:                if(getopt(list)==1){
                   7372:                        R=cons(R,PP);
                   7373:                        if(Dif!=1) return R;
                   7374:                }else if(type(H)>=0){
                   7375:                        R=y+R*H^(D+1)/fac(D+1);
                   7376:                        for(DD=D;DD>0;PP=cdr(PP),DD--) R+=car(PP)*H^(DD)/fac(DD);
                   7377:                        if(T){
1.35      takayama 7378:                                if(T<0){
                   7379:                                        Dif=0;TT=-T;
                   7380:                                }else TT=T;
1.26      takayama 7381:                                K=newvect(TT);K[0]=Dif?f:f_00;
1.35      takayama 7382:                                if(getopt(c1)==1) K[0]=taylorODE(D|taylor=[c_1*H,0]);
1.26      takayama 7383:                                for(I=1;I<TT;I++){
                   7384:                                        for(S=J=0;J<I;J++) S+=makev(["a_",I+1,J+1])*K[J];
1.35      takayama 7385:                                        K[I]=taylorODE(D|taylor=[makev(["c_",I+1])*H,S*H],lim=[H,D]);
1.26      takayama 7386:                                }
                   7387:                                for(S=I=0;I<TT;I++) S+=makev(["b_",I+1])*K[I];
                   7388:                                S=S*H+y;
                   7389:                                R=S-R;
                   7390:                                if(T<0){
                   7391:                                        for(V=[H],I=0;I<=D;I++)
                   7392:                                                for(J=0;J<=D-I;J++) V=cons(makev([F,I,J]),V);
                   7393:                                        return os_md.ptol(R,reverse(V)|opt=0);
                   7394:                                }
                   7395:                        }else T=0;
                   7396:                }
                   7397:        }
                   7398:        if(Dif){
                   7399:                for(I=0;I<=D;I++){
                   7400:                        for(J=0;J<=D;J++){
                   7401:                                if(I==0&&J==0){
                   7402:                                        R=subst(R,f_00,f);
                   7403:                                        continue;
                   7404:                                }
                   7405:                                V=makev([F,str_times("x",I),str_times("y",J)]);
                   7406:                                R=subst(R,makev([F,I,J]),V);
                   7407:                        }
                   7408:                }
                   7409:        }
                   7410:        return R;
                   7411: }
                   7412:
1.6       takayama 7413: def toeul(F,L,V)
                   7414: {
                   7415:        L = vweyl(L);
                   7416:        X = L[0]; DX = L[1];
                   7417:        I = mydeg(F,DX);
1.56      takayama 7418:        if(getopt(raw)!=1){
1.6       takayama 7419:                for(II=I; II>=0; II--){
1.56      takayama 7420:                        J = mydeg(P=mycoef(F,II,DX),X);
1.6       takayama 7421:                        if(II==I) S=II-J;
                   7422:                        else if(P!=0 && II-J>S) S=II-J;
                   7423:                }
                   7424:                F *= X^S;
1.56      takayama 7425:        }
                   7426:        if(V == "infty"){
                   7427:                for(R=0; I >= 0; I--)
1.6       takayama 7428:                         R += red((mysubst(mycoef(F,I,DX),[X,1/X])*(x*DX)^I));
                   7429:                return(subst(pol2sft(R,DX),DX,-DX));
                   7430:        }
1.56      takayama 7431:        for(R=0; I >= 0; I--)
1.6       takayama 7432:                R += (red(mycoef(F,I,DX)/X^I))*DX^I;
                   7433:        return pol2sft(R,DX);
                   7434: }
                   7435:
                   7436: /*
                   7437: def topoldif(P,F,L)
                   7438: {
                   7439:        L = vweyl(L);
                   7440:        P = nm(red(P));
                   7441:        while(deg(P,L[1]) > 0){
                   7442:                R = coef(P,0,L[0]);
                   7443:                Q = red((P-R)/(F*L[0]);
                   7444:                P = nm(Q)*zz+F*R*dn(Q);
                   7445:        }
                   7446: }
                   7447: */
                   7448:
                   7449: def fromeul(P,L,V)
                   7450: {
                   7451:        if(P == 0)
                   7452:                return 0;
                   7453:        L = vweyl(L);
                   7454:        X = L[0]; DX = L[1];
                   7455:        I = mydeg(P,DX);
                   7456:        if(V == "infty"){
                   7457:                P = subst(P,DX,-DX);
                   7458:                J = mydeg(P,X);
                   7459:                P = red(mysubst(P,[X,1/X])*X^J);
                   7460:        }
                   7461:        R = mycoef(P,0,DX);
                   7462:        S = 1;
                   7463:        for(S = J = 1; J <= I; J++){
                   7464:                S = DX*(S*X + mydiff(S,DX));
                   7465:                R += mycoef(P,J,DX)*S;
                   7466:        }
1.56      takayama 7467:        if(getopt(raw)!=1){
                   7468:                while(mycoef(R,0,X) == 0)
                   7469:                        R = tdiv(R,X);
                   7470:        }
1.6       takayama 7471:        if(V != "infty" && V != 0)
                   7472:                R = mysubst(R,[X,X-V]);
                   7473:        return R;
                   7474: }
                   7475:
                   7476: def sftexp(P,L,V,N)
                   7477: {
                   7478:        L = vweyl(L); DX = L[1];
1.56      takayama 7479:        P = mysubst(toeul(P,L,V|opt_list=getpt()),[DX,DX+N]);
1.70      takayama 7480:        return fromeul(P,L,V|option_list=getopt());
1.6       takayama 7481: }
                   7482:
                   7483:
                   7484: def fractrans(P,L,N0,N1,N2)
                   7485: {
                   7486:        L = vweyl(L);
                   7487:        if(N2 != "infty"){
                   7488:                if(N0 == "infty")
                   7489:                        N0 = 0;
                   7490:                else
                   7491:                        N0 = red(1/(N0-N2));
                   7492:                if(N1 == "infty")
                   7493:                        N1 = 0;
                   7494:                else
                   7495:                        N1 = red(1/(N1-N2));
                   7496:                P = mysubst(P,[L[0],L[0]+N2]);
                   7497:                P = fromeul(toeul(P,L,"infty"),L,0);
                   7498:        }
                   7499:        if(N0 != 0){
                   7500:                P = mysubst(P,[L[0],L[0]+N0]);
                   7501:                N1 -= N0;
                   7502:        }
                   7503:        if(N1 != 1)
                   7504:                P = mysubst(P,[[L[0],L[0]/N1],[L[1],L[1]*N1]]);
                   7505:        return P;
                   7506: }
                   7507:
                   7508: def soldif(P,L,V,Q,N)
                   7509: {
                   7510:        L = vweyl(L); X = L[0]; DX = L[1];
                   7511:        P = mysubst(toeul(P,L,V),[DX,DX+Q]);
                   7512:        DEG = mydeg(P,X);
                   7513:        P0 = newvect(DEG+1);
                   7514:        for(I = 0; I <= DEG; I++)
                   7515:                P0[I] = coef(P,I,X);
                   7516:        if(P0[0] == 0)
                   7517:                return 0;
                   7518:        if(subst(P0[0],DX,0) != 0){
                   7519:                mycat([Q,"is not the exponent at", V])$
                   7520:                return 0;
                   7521:        }
                   7522:        R = newvect(N+1);
                   7523:        R[0] = 1;
                   7524:        for(I = 1; I <= N; I++){
                   7525:                for(S = 0, K = 1; K <= DEG && K <= I; K++)
                   7526:                        S += mysubst(P0[K],[DX,I-K])*R[I-K];
                   7527:                S = red(S);
                   7528:                M = mysubst(P0[0],[DX,I]);
                   7529:                if(M != 0){
                   7530:                        R[I] = -red(S/M);
                   7531:                        if(R1 != 0){
                   7532:                                for(S = 0, K = 1; K <= DEG && K <= I; K++)
                   7533:                                        S += mysubst(P0[K],[DX,I-K])*R1[I-K] +
                   7534:                                                         mysubst(P1[K],[DX,I-K])*R[I-K];
                   7535:                                R1[I] = -red(S/M);
                   7536:                        }
                   7537:                }else{
                   7538:                        if(S == 0){
                   7539:                                if(R1 != 0){
                   7540:                                        for(S = 0, K = 1; K <= DEG && K <= I; K++)
                   7541:                                                 S += mysubst(P0[K],[DX,I-K])*R1[I-K] +
                   7542:                                                                 mysubst(P1[K],[DX,I-K])*R[I-K];
                   7543:                                }
                   7544:                                if(S == 0)
                   7545:                                        continue;
                   7546:                        }
                   7547:                        R1 = newvect(N+1);
                   7548:                        for(K = 0; K < I; K++){
                   7549:                                R1[K] = R[K];
                   7550:                                R[K] = 0;
                   7551:                        }
                   7552:                        R1[I] = 0;
                   7553:                        P1 = newvect(DEG);
                   7554:                        for(K = 0; K <= DEG; K++)
                   7555:                                P1[K] = mydiff(P0[K], DX);
                   7556:                        M = mysubst(P1[0],[DX,I]);
                   7557:                        if(M == 0){
                   7558:                                cat(["multiple log at ", I])$
                   7559:                                return 0;
                   7560:                        }
                   7561:                        R[I] = -red(S/M);
                   7562:                }
                   7563:        }
                   7564:        if(R1 != 0)
                   7565:                return [R1, R];
                   7566:        else
                   7567:                return R;
                   7568: }
                   7569:
                   7570: def chkexp(P,L,V,Q,N)
                   7571: {
                   7572:        L = vweyl(L); X = L[0]; DX = L[1];
                   7573:        P = mysubst(toeul(P,L,V),[DX,DX+Q]);
                   7574:        P = fromeul(P,L,0);
                   7575:        D = mydeg(P,DX);
                   7576:        Z = mindeg(mycoef(P,D,DX), X) - (D-N);
                   7577:        R = [];
                   7578:        for(I = 0; I < Z; I++){
                   7579:                S = mycoef(P,I,X);
                   7580:                if(S != 0){
                   7581:                        for(J = mydeg(S,DX); J >= 0; J--){
                   7582:                                T = mycoef(S,J,DX);
                   7583:                                if(T != 0)
                   7584:                                        R = cons(T,R);
                   7585:                        }
                   7586:                }
                   7587:        }
                   7588:        return R;
                   7589: }
                   7590:
                   7591:
                   7592: def sqrtrat(P)
                   7593: {
                   7594:        if(P==0) return 0;
                   7595:        if(type(P)==3||type(P)==2){
                   7596:                P=red(P);
                   7597:                if(imag(dn(P))!=0||imag(nm(P))!=0){
                   7598:                        if(imag(dn(P))==0&&real(P)!=0){
                   7599:                                F=red(imag(P)/real(P));
                   7600:                                if(F==3^(1/2)||F==-3^(1/2)){
                   7601:                                        if(eval(real(P))<0)
                   7602:                                                return -real(P)+imag(P)*@i;
                   7603:                                        else{
                   7604:                                                if(eval(imag(P))>0) return imag(P)+real(P)*@i;
                   7605:                                                else return -imag(P)-real(P)*@i;
                   7606:                                        }
                   7607:                                }
                   7608:                        }
                   7609:                        return [];
                   7610:                }
                   7611:                F=fctr(dn(P));
                   7612:                R=sqrtrat(car(F)[0]);
                   7613:                for(F=cdr(F);F!=[];F=cdr(F)){
                   7614:                        if(!iand(car(F)[1],1)) R*=car(F)[0]^(car(F)[1]/2);
                   7615:                        else return [];
                   7616:                }
                   7617:                F=fctr(nm(P));
                   7618:                R=sqrtrat(car(F)[0])/R;
                   7619:                for(F=cdr(F);F!=[];F=cdr(F)){
                   7620:                        if(!iand(car(F)[1],1)) R*=car(F)[0]^(car(F)[1]/2);
                   7621:                        else return [];
                   7622:                }
                   7623:                return R;
                   7624:        }
                   7625:        if(ntype(P)==4){
                   7626:                P0=real(P);P1=imag(P)/2;
                   7627:                X=makenewv(P);
                   7628:                for(R=fctr(X^4-P0*X^2-P1^2);R!=[];R=cdr(R)){
                   7629:                        RT=car(R)[0];
                   7630:                        if(deg(RT,X)==1){
                   7631:                                X=-mycoef(RT,0,X)/mycoef(RT,1,X);
                   7632:                                return X+P1/X*@i;
                   7633:                        }
                   7634:                        if(deg(RT,X)==2){
                   7635:                                if((D=mycoef(RT,1,X)^2-4*mycoef(RT,2,X)*mycoef(RT,0,X))<0) continue;
                   7636:                                X=(-mycoef(RT,1,X)+sqrtrat(D))/(2*mycoef(RT,2,X));
                   7637:                                return X+P1*sqrt2rat(1/X)*@i;
                   7638:                        }
                   7639:                }
                   7640:                D=P0^2+4*P1^2;
                   7641:                if(P1>0) return ((sqrtrat(D)+P0)/2)^(1/2)+((sqrtrat(D)-P0)/2)^(1/2)*@i;
                   7642:                return ((sqrtrat(D)+P0)/2)^(1/2)-((sqrtrat(D)-P0)/2)^(1/2)*@i;
                   7643:        }else if(ntype(P)!=0) return [];
                   7644:        if(P==1) return P;
                   7645:        Dn=dn(P);Nm=nm(P);C=R=1;
                   7646:        N=pari(factor,Dn);
                   7647:        if(N){
                   7648:                for(II=car(size(N))-1;II>=0;II--){
                   7649:                        if(iand(K=N[II][1],1)){
                   7650:                                R*=N[II][0];
                   7651:                                K++;
                   7652:                        }
                   7653:                        C/=N[II][0]^(K/2);
                   7654:                }
                   7655:        }
                   7656:        N=pari(factor,Nm);
                   7657:        if(N){
                   7658:                for(II=car(size(N))-1;II>=0;II--){
                   7659:                        if(N[II][0]==-1){
                   7660:                                C*=@i;
                   7661:                        continue;
                   7662:                        }
                   7663:                        K=N[II][1];
                   7664:                        if(iand(K,1)){
                   7665:                                R*=N[II][0];
                   7666:                                K--;
                   7667:                        }
                   7668:                        if(K!=0) C*=N[II][0]^(K/2);
                   7669:                }
                   7670:        }
                   7671:        if(R!=1) C*=R^(1/2);
                   7672:        return C;
                   7673: }
                   7674:
                   7675: def fctri(F)
                   7676: {
                   7677:        R=(iscoef(F,os_md.israt))?fctr(F):[[1,1],[F,1]];
                   7678:        if(!iscoef(F,os_md.iscrat)||chkfun("af_noalg",0)==0) return R;
                   7679:        X=makenewv(vars(F));
                   7680:        for(S=[];R!=[];R=cdr(R)){
                   7681:                if(length(Var=vars(R0=car(R)[0])) == 1 && (D=mydeg(R0,Var=car(Var))) > 0){
                   7682:                        if(imag(T=mycoef(R0,D,Var))!=0) R0/=T;
                   7683:                        T=af_noalg(real(R0)+imag(R0)*X,[[X,X^2+1]]);
                   7684:                        if(length(T)>1||T[0][1]>1){
                   7685:                                T=subst(T,X,@i);
                   7686:                                for(; T!=[];T=cdr(T)){
                   7687:                                        if(vars(T[0])!=[])
                   7688:                                                S=cons([car(T)[0],car(T)[1]*car(R)[1]],S);
                   7689:                                }
                   7690:                                continue;
                   7691:                        }
                   7692:                }
                   7693:                S=cons(R[0],S);
                   7694:        }
                   7695:        return reverse(S);
                   7696: }
                   7697:
                   7698: def getroot(F,X)
                   7699: {
                   7700:        S=[];
                   7701:        if(type(Cpx=getopt(cpx))!=1) Cpx=0;
                   7702:        M=getopt(mult);
                   7703:        if(type(F) == 3)
                   7704:                F = nm(red(F));
                   7705:        for(R=fctri(F); length(R)>0; R = cdr(R)){
                   7706:                T=car(R);
                   7707:                P=car(T);
                   7708:                I=car(cdr(T));
                   7709:                if(mydeg(P,X)>0){
                   7710:                        if(mydeg(P,X)==1){
                   7711:                                C = mycoef(P,1,X);
                   7712:                                P = X - red(P/C);
                   7713:                        }else if(mydeg(P,X)==2 && Cpx>0){
                   7714:                                C2=mycoef(P,2,X);C1=mycoef(P,1,X);C0=mycoef(P,0,X);
                   7715:                                C=sqrt2rat(C1^2-4*C0*C2);
                   7716:                                C0=[];
                   7717:                                if(type(C)==0&&ntype(C)==0&&pari(issquare,-C)) C0=sqrt(C);
                   7718:                                else if(Cpx>1) C0=sqrtrat(C);
                   7719:                                if(C0==[]&&Cpx>2) C0=C^(1/2);
                   7720:                                if(C0!=[]){
                   7721:                                        if(M==1)
                   7722:                                                S=cons([I,sqrt2rat((-C1+C0)/(2*C2))],S);
                   7723:                                        else{
                   7724:                                                for(II=I; II>0; II--)
                   7725:                                                        S=cons(sqrt2rat((-C1+C0)/(2*C2)),S);
                   7726:                                        }
                   7727:                                        P=sqrt2rat((-C1-C0)/(2*C2));
                   7728:                                }
                   7729:                        }else if(mydeg(P,X)==3 && Cpx>1){
                   7730:                                Omg=(-1+3^(1/2)*@i)/2;
                   7731:                                PP=P/mycoef(P,3,X);
                   7732:                                C2=mycoef(PP,2,X)/3;
                   7733:                                PP=subst(PP,X,X-C2);
                   7734:                                if((C1=mycoef(PP,1,X))==0){
                   7735:                                        C0=mycoef(PP,0,X);
                   7736:                                        if(real(C0)==0||imag(C0)==0){
                   7737:                                                if(real(C0)==0){
                   7738:                                                        PP=getroot(X^3+imag(C0),X);
                   7739:                                                        if(length(PP)==3){
                   7740:                                                                for(;PP!=[];PP=cdr(PP)){
                   7741:                                                                        if(imag(PP[0])==0){
                   7742:                                                                                C0=PP[0]*@i;
                   7743:                                                                                break;
                   7744:                                                                        }
                   7745:                                                                }
                   7746:                                                                if(PP==[]) C0=0;
                   7747:                                                        }
                   7748:                                                }else{
                   7749:                                                        if(C0>0) C0=C0^(1/3);
                   7750:                                                        else C0=-(-C0)^(1/3);
                   7751:                                                }
                   7752:                                                if(C0!=0){
                   7753:                                                        if(M==1){
                   7754:                                                                S=cons([I,C0-C2],S);
                   7755:                                                                S=cons([I,C0*Omg-C2],S);
                   7756:                                                                S=cons([I,C0*(-1-Omg)-C2],S);
                   7757:                                                        }else{
                   7758:                                                                for(II=I; II>0; II--){
                   7759:                                                                        S=cons(C0-C2,S);
                   7760:                                                                        S=cons(C0*Omg-C2,S);
                   7761:                                                                        S=cons(C0*(-1-Omg)-C2,S);
                   7762:                                                                }
                   7763:                                                        }
                   7764:                                                        continue;
                   7765:                                                }
                   7766:                                        }
                   7767:                                }
                   7768:                                if(Cpx>2){
                   7769:                                        Q=X^2+(mycoef(PP,1,X)/3)*X+mycoef(PP,0,X)^3;
                   7770:                                        SQ=getroot(Q,X|cpx=2);
                   7771:                                        SQ=SQ[0]^(1/3);SQ2=mycoef(PP,0,X)/SQ;
                   7772:                                        if(M==1){
                   7773:                                                S=cons([I,SQ+SQ2-C2],S);
                   7774:                                                S=cons([I,SQ*Omg+SQ2*(-1-Omg)-C2],S);
                   7775:                                                S=cons([I,SQ*(-1-Omg)+SQ2*Omg-C2],S);
                   7776:                                        }else{
                   7777:                                                for(II=I; II>0; II--){
                   7778:                                                        S=cons(SQ+SQ2-C2,S);
                   7779:                                                        S=cons(SQ*Omg+SQ2*(-1-Omg)-C2,S);
                   7780:                                                        S=cons(SQ*(-1-Omg)+SQ2*Omg-C2,S);
                   7781:                                                }
                   7782:                                        }
                   7783:                                        continue;
                   7784:                                }
                   7785:                        }else if(mydeg(P,X)==4 && Cpx>0){
                   7786:                                C2=mycoef(P,3,X)/(4*mycoef(P,4,X));
                   7787:                                PP=subst(P,X,X-C2);
                   7788:                                if(mycoef(PP,1,X)==0){
                   7789:                                        PP=mycoef(PP,4,X)*X^2+mycoef(PP,2,X)*X+(SQ2=mycoef(PP,0,X));
                   7790:                                        SQ=getroot(PP,X|cpx=2);
                   7791:                                        if(length(SQ)==2){
                   7792:                                                if((C0=sqrtrat(SQ[0]))==[]){
                   7793:                                                        if(mycoef(PP,1,X)==0){
                   7794:                                                                if(SQ2<0) C0=(-SQ2)^(1/4);
                   7795:                                                                else C0=SQ2^(1/4)*(1+@i)/2;
                   7796:                                                        }
                   7797:                                                        else if(Cpx>2) C0=SQ[0]^(1/2);
                   7798:                                                        else C0=0;
                   7799:                                                }
                   7800:                                                if((C1=sqrtrat(SQ[1]))==[]){
                   7801:                                                        if(mycoef(PP,1,X)==0) C1=-C0;
                   7802:                                                        else C1=SQ[1]^(1/2);
                   7803:                                                }
                   7804:                                                if(C0!=0){
                   7805:                                                        if(M==1)
                   7806:                                                                S=append([[I,C0-C2],[I,-C0-C2],[I,C1-C2],[I,-C1-C2]],S);
                   7807:                                                        else{
                   7808:                                                                for(II=I; II>0; II--)
                   7809:                                                                        S=append([C0-C2,-C0-C2,C1-C2,-C1-C2],S);
                   7810:                                                        }
                   7811:                                                        continue;
                   7812:                                                }
                   7813:                                        }
                   7814:                                }else{
                   7815:                                        PP/=mycoef(PP,4,X);
                   7816:                                        CC=mycoef(PP,2,X);C1=mycoef(PP,1,X);C0=mycoef(PP,0,X);
                   7817:                                        SQ=getroot(X*(CC+X)^2-4*C0*X-C1^2,X|cpx=Cpx);
                   7818:                                        if(length(SQ)>1){
                   7819:                                                SQ=sqrt2rat(SQ[0]);
                   7820:                                                SQ2=getroot(X^2-SQ,X|cpx=Cpx);
                   7821:                                                if(length(SQ2)>1){
                   7822:                                                        C1=SQ2[0]*X-C1/SQ2[0]/2;
                   7823:                                                        C0=getroot(X^2+CC/2+SQ/2+C1,X|cpx=Cpx);
                   7824:                                                        C1=getroot(X^2+CC/2+SQ/2-C1,X|cpx=Cpx);
                   7825:                                                        if(length(C0)>1&&length(C1)>1){
                   7826:                                                                C0=[sqrt2rat(C0[0]-C2),sqrt2rat(C0[1]-C2),
                   7827:                                                                        sqrt2rat(C1[0]-C2),sqrt2rat(C1[1]-C2)];
                   7828:                                                                if(M==1) for(II=0;II<4;II++) S=cons([I,C0[II]],S);
                   7829:                                                                else for(II=I; II>0; II--) S=append(C0,S);
                   7830:                                                                continue;
                   7831:                                                        }
                   7832:                                                }
                   7833:                                        }
                   7834:                                }
                   7835:                        }
                   7836:                        if(M==1)
                   7837:                                S=cons([I,P],S);
                   7838:                        else for( ; I>0; I--) S=cons(P,S);
                   7839:                }
                   7840:        }
                   7841:        S=qsort(S);
                   7842:        if(M==1) S=reverse(S);
                   7843:        return S;
                   7844: }
                   7845:
                   7846: def expat(F,L,V)
                   7847: {
                   7848:         L = vweyl(L);
                   7849:         if(V == "?"){
                   7850:                 Ans = [];
                   7851:
                   7852:                 F = nm(red(F));
                   7853:                 S = fromeul(toeul(F,L,"infty"),L,0);
                   7854:                 S = mycoef(S,mydeg(S,L[1]),L[1]);
                   7855:                 if(mydeg(S,L[0]) > 0)
                   7856:                         Ans = cons(["infty", expat(F,L,"infty")],Ans);
                   7857:
                   7858:                 S = mycoef(F,mydeg(F,L[1]), L[1]);
                   7859:                 R = getroot(S,L[0]);
                   7860:                 for(I = 0; I < length(R); I++){
                   7861:                         if(I > 0 && R[I-1] == R[I])
                   7862:                                 continue;
                   7863:                         if(mydeg(R[I], L[0]) <= 0)
                   7864:                                 Ans = cons([R[I], expat(F,L,R[I])], Ans);
                   7865:                         else
                   7866:                                 Ans = cons([R[I]], Ans);
                   7867:                 }
                   7868:                 return Ans;
                   7869:         }
                   7870:         return getroot(subst(toeul(F,L,V),L[0],0),L[1]);
                   7871: }
                   7872:
                   7873: def polbyroot(P,X)
                   7874: {
1.49      takayama 7875:        if(isvar(V=getopt(var))&&length(P)>1&&isint(car(P))){
                   7876:                for(Q=[],I=car(P);I<=P[1];I++) Q=cons(makev([V,I]),Q);
                   7877:                P=Q;
                   7878:        }
1.6       takayama 7879:        R = 1;
                   7880:        while(length(P)){
                   7881:                R *= X-car(P);
                   7882:                if(type(R)>2) R = red(R);
                   7883:                P = cdr(P);
                   7884:        }
                   7885:        return R;
                   7886: }
                   7887:
                   7888: def polbyvalue(P,X)
                   7889: {
                   7890:        R = 1; S = 0;
                   7891:        while(length(P)){
                   7892:                T = car(P);
                   7893:                V0 = T[1] - mysubst(S,[X,T[0]]);
                   7894:                if(V0 != 0){
                   7895:                        if(type(R) > 2) R = red(R);
                   7896:                        V1 = mysubst(R,[X,T[0]]);
                   7897:                        if(V1 == 0){
                   7898:                                erno(0);
                   7899:                                return 0;
                   7900:                        }
                   7901:                        S += (V0/V1)*R;
                   7902:                        if(type(S) > 2) S = red(S);
                   7903:                }
                   7904:                R *= X - T[0];
                   7905:                P = cdr(P);
                   7906:        }
                   7907:        return S;
                   7908: }
                   7909:
                   7910:
                   7911: def pcoef(P,L,Q)
                   7912: {
                   7913:        if(L==0)
                   7914:                return 1;
                   7915:        Coef=TP=0;
                   7916:        if(type(Q)>=4){
                   7917:                TP=1;
                   7918:                V=Q[0];
                   7919:                if(type(V)==4)
                   7920:                        V=ltov(V);
                   7921:                else V=dupmat(V);
                   7922:                N=length(V);
                   7923:                if(type(Q[1])==5) MR=dupmat(Q[1]);
                   7924:                else{
                   7925:                        MR=newvect(N);
                   7926:                        for(K=Q[1], I=0; I< N; I++){
                   7927:                                MR[I] = car(K);
                   7928:                                K = cdr(K);
                   7929:                        }
                   7930:                }
                   7931:        }else{
                   7932:                V=ltov(vars(P));
                   7933:                N=length(V);
                   7934:                MR=newvect(N);
                   7935:                for(I=0;I<N;I++){
                   7936:                        MR[I]=mydeg(Q,V[I]);
                   7937:                        Q=mycoef(Q,MR[I],V[I]);
                   7938:                }
                   7939:                if(type(Q)>1) return 0;
                   7940:        }
                   7941:        if(L==1){
                   7942:                for(I=0;I<N;I++)
                   7943:                        P=mycoef(P,MR[I],V[I]);
                   7944:                return P;
                   7945:        }
                   7946:        for(I=1;I<N;I++){  /* sorted by required degrees */
                   7947:                for(K1=MR[I],K2=V[I],J=I-1; J>=0 && MR[J]<K1; J--);
                   7948:                for(II=I-1;II>J;II--){
                   7949:                        MR[II+1]=MR[II];V[II+1]=V[II];
                   7950:                }
                   7951:                MR[II+1]=K1;V[II+1]=K2;
                   7952:        }
                   7953:        for(NN=N; N>0 && MR[N-1]==0; N--);
                   7954:        Mon=[];Coe=[];Q=P;
                   7955:        while(Q!=0){
                   7956:                M=newvect(N);
                   7957:                for(R=Q,F=I=0,MT=1;I<NN;I++){
                   7958:                        K=mydeg(R,V[I]);
                   7959:                        R=mycoef(R,K,V[I]);
                   7960:                        if(I<N) M[I]=K;
                   7961:                        if(K>0) MT*=V[I]^K;
                   7962:                        if(K>MR[I]) F=1;
                   7963:                }
                   7964:                Q -= R*MT;
                   7965:                if(F==0){
                   7966:                        Mon=cons(M,Mon);
                   7967:                        Coe=cons(R,Coe);
                   7968:                }
                   7969:        }
                   7970:        Mon=ltov(reverse(Mon));
                   7971:        Coe=ltov(reverse(Coe));
                   7972:        Len=length(Mon);
                   7973:        S=newvect(Len);
                   7974:        for(JL=0; JL<Len;JL++){
                   7975:                if(L*Mon[JL][0]<MR[0]) break;
                   7976:        }
                   7977:        S[0]=L;
                   7978:
                   7979:        K0=Mon[0][0];
                   7980:        K=L*K0-MR[0];
                   7981:        for(I=II=0;II<Len && K>=0;II++){
                   7982:                if((K1=K0-Mon[0][II])>0){
                   7983:                        while(K>K1 && S[I]>0){
                   7984:                                S[I]--;S[II]++;
                   7985:                                K-=K1;
                   7986:                                I=II;
                   7987:                                K0=Mon[0][II];
                   7988:                        }
                   7989:                }else break;
                   7990:        }
                   7991:
                   7992:        I=0;
                   7993:        while(1){
                   7994:         for(T=T0=J=JP=0; J<Len; J++){
                   7995:                 if(S[J]!=0){
                   7996:                         if(T0==0 && J>=JL) return Coef;
                   7997:                         JP=J;T0=1;
                   7998:                         T+=S[J]*Mon[J][I];
                   7999:                 }
                   8000:         }
                   8001:         if(T==MR[I]){
                   8002:                 if(++I<N) continue;
                   8003:                 for(TT=1,J=1; J<=L; J++)  /* find a solution */
                   8004:                         TT*=J;
                   8005:                 for(J=0;J<Len;J++){
                   8006:                         if(S[J]!=0){
                   8007:                                 TT*=Coe[J]^S[J];
                   8008:                                 for(II=S[J]; II>1; II--)
                   8009:                                         TT/=II;
                   8010:                         }
                   8011:                 }
                   8012:                 Coef+=TT;
                   8013:                 if(TP==1 && type(Coef)==3) Coef=red(Coef);
                   8014:                 if(JP<Len-2 && S[JP]>1){
                   8015:                         S[JP]-=2;S[JP+1]++;S[JP+2]++;
                   8016:                 }else{
                   8017:                         for(JT=JP-1;JT>=0&&S[JT]==0;JT--);
                   8018:                         if(JT<0) break;
                   8019:                         if(JT==JP-1){
                   8020:                                 S[JT]--;
                   8021:                                 if(JP<Len-1)
                   8022:                                         S[JP+1]++;
                   8023:                                 else
                   8024:                                         S[JP]++;
                   8025:                         }else{
                   8026:                                 S[JT]--;
                   8027:                                 S[JT+1]+=S[JP]+1;
                   8028:                                 S[JP]=0;
                   8029:                         }
                   8030:                 }
                   8031:                 I=0;
                   8032:                 continue;
                   8033:         }
                   8034:         if(JP<Len-1){
                   8035:                 for(JP1=JP+1;JP1<Len-1;JP1++){
                   8036:                                if(Mon[JP1][I]!=Mon[JP][I]) break;
                   8037:                 }
                   8038:
                   8039:                 if(I>0 && Mon[JP1][0] < Mon[JP][0]){
                   8040:                         S[JP]--;S[Len-1]++;JP=JP-1;
                   8041:                 }else{
                   8042:
                   8043:                         S[JP]--;
                   8044:                         if(JP1<Len){
                   8045:                                 S[JP1]++;
                   8046:                         }else{
                   8047:                                 S[JP1-1]++;
                   8048:                         }
                   8049:                 }
                   8050:         }
                   8051:         if(JP==Len-1){
                   8052:                 for(JT=JP-1;JT>=0 && S[JT]==0;JT--);
                   8053:                 if(JT<0) break;
                   8054:                 S[JT]--;
                   8055:                 if(JT==JP-1){
                   8056:                         S[JP]++;
                   8057:                 }else{
                   8058:                         S[JT+1]+=S[JP]+1;
                   8059:                         S[JP]=0;
                   8060:                 }
                   8061:         }
                   8062:         I=0;
                   8063:        }
                   8064:        return Coef;
                   8065: }
                   8066:
1.58      takayama 8067: def pmaj(P)
                   8068: {
                   8069:        if(type(P)==4){
1.68      takayama 8070:                Opt=getopt(var);
                   8071:                Opt=(isvar(Opt))?[["var",Opt]]:[];
                   8072:                for(Q=[];P!=[];P=cdr(P)) Q=cons(pmaj(car(P)|option_list=Opt),Q);
                   8073:                if(Opt==[]) return reverse(Q);
1.58      takayama 8074:                X=Opt[0][1];
1.68      takayama 8075:                D=mydeg(Q,X);
                   8076:                for(S=0;D>=0;D--) S+=lmax(mycoef(Q,D,X))*X^D;
1.58      takayama 8077:                return S;
                   8078:        }
                   8079:        V=vars(P);
1.71      takayama 8080:        Y=getopt(var);
                   8081:        Abs=(Y==1)?1:0;
                   8082:        if(!(K=length(V))) return Y==1?1:abs(P);
1.58      takayama 8083:        for(R=0,D=deg(P,X=V[0]);D>=0;D--){
                   8084:                Q=coef(P,D,X);
1.71      takayama 8085:                if(Q!=0) R+=((type(Q)>1)?pmaj(Q|var=Abs):(Y==1?1:abs(Q)))*X^D;
1.58      takayama 8086:        }
1.71      takayama 8087:        if(isvar(Y)) for(;V!=[];V=cdr(V)) R=subst(R,car(V),Y);
1.58      takayama 8088:        return R;
                   8089: }
                   8090:
1.6       takayama 8091: def prehombf(P,Q)
                   8092: {
                   8093:        if((Mem=getopt(mem))!=1 && Mem!=-1)
                   8094:                return prehombfold(P,Q);
                   8095:        if(Q==0) Q=P;
                   8096:        V=ltov(vars(P));
                   8097:        N=length(V);
                   8098:        for(I=1;I<N;I++){  /* sorted by required degrees */
                   8099:                for(K=mydeg(P,V[I]),K1=V[I],J=I-1; J>=0 && mydeg(P,V[J])<K; J--);
                   8100:                for(II=I-1;II>J;II--) V[II+1]=V[II];
                   8101:                V[II+1]=K1;
                   8102:        }
                   8103:        S=newvect(N);T=newvect(N);U=newvect(N);
                   8104:        for(R=P,M=1,Deg=I=0;I<N;I++){  /* extreme vector */
                   8105:                Deg+=(S[I]=mydeg(R,V[I]));
                   8106:                R=mycoef(R,S[I],V[I]);
                   8107:        }
                   8108:        DR=[[-1,0]];
                   8109:        if((R1=N/Deg)!=1){
                   8110:                DR=cons([-R1,0],DR);
                   8111:                Sft=1;
                   8112:        }else Sft=0;
                   8113:        if(Deg%2==0) Sg=1;
                   8114:        else Sg=-1;
                   8115:        for(I=0,R=R2=1,QQ=Q; 2*I+Sft < Deg; I++){
                   8116:                if(Mem==-1){
                   8117:                        print(I+1,0);print("/",0);print(idiv(Deg-Sft+1,2),0);print(" ",2);
                   8118:                }
                   8119:                Coef=0;
                   8120:                Q=QQ;
                   8121:                while(Q!=0){
                   8122:                        for(R=Q,J=0,RR=1;J<N;J++){
                   8123:                                T[J]=mydeg(R,V[J]);
                   8124:                                R=mycoef(R,T[J],V[J]);
                   8125:                                if(T[J]>0) RR*=V[J]^T[J];
                   8126:                        }
                   8127:                        Q-=R*RR;
                   8128:                        for(J=0,CC=R;J<N;J++){
                   8129:                                U[J]=I*S[J]+T[J];
                   8130:                                for(II=0; II<T[J]; II++)
                   8131:                                        CC*=(U[J]-II);
                   8132:                        }
                   8133:                        CC*=pcoef(P,I+1,[V,U]);
                   8134:                        if(Mem==-1) print("*",2);
                   8135:                        Coef+=CC;
                   8136:                }
                   8137:                DR=cons([I,Coef],DR);
                   8138:                DR=cons([-R1-1-I,Sg*Coef],DR);
                   8139:                if(Mem==-1) print("");
                   8140:        }
                   8141:        P = polbyvalue(DR,s);
                   8142:        return fctr(P);
                   8143: }
                   8144:
                   8145: def prehombfold(P,Q)
                   8146: {
                   8147:        V = vars(P);
                   8148:        if(Q==0) Q=P;
                   8149:        for(Deg=0, R=P, V1=V, DD=[]; V1!=[]; V1=cdr(V1)){
                   8150:                VT = car(V1);
                   8151:                D = mydeg(R,VT);
                   8152:                R = mycoef(R,D,VT);
                   8153:                Deg += D;
                   8154:                X = makev(["d",VT]);
                   8155:                Q = subst(Q,VT,X);
                   8156:                DD=cons([VT,X],DD);
                   8157:        }
                   8158:        DR=[[-1,0]];
                   8159:        NV=length(V);
                   8160:        if((R1=NV/Deg)!=1){
                   8161:                DR=cons([-R1,0],DR);
                   8162:                Sft=1;
                   8163:        }else
                   8164:                Sft=0;
                   8165:        if(Deg%2==0)
                   8166:                Sg=1;
                   8167:        else Sg=-1;
                   8168:        for(I = 0, R=R2=1; 2*I+Sft < Deg; I++){
                   8169:                R = R2;
                   8170:                R2 = R*P;
                   8171:                S = appldo(Q,R2,DD);
                   8172:                QQ = sdiv(S,R);
                   8173:                DR=cons([I,QQ],DR);
                   8174:                DR=cons([-R1-1-I,Sg*QQ],DR);
                   8175:        }
                   8176:        P = polbyvalue(DR,s);
                   8177:        return fctr(P);
                   8178: }
                   8179:
                   8180: def sub3e(P0,P1,P2,N0,N1,N)
                   8181: {
                   8182:        R = x^N0*(x-1)^N1*dx^N;
                   8183:        for(V = I = 1, J = 1; I <= N; I++){
                   8184:                S = 0;
                   8185:                M = N-I;
                   8186:                if(I <= N0){
                   8187:                        T = mycoef(P0,N0-I,x);
                   8188:                        S += T;
                   8189:                        R += T*x^(N0-I)*(x-1)^N1*dx^M;
                   8190:                        K1 = N0-I+1;
                   8191:                }else
                   8192:                        K1 = 0;
                   8193:                if(I <= N1){
                   8194:                        T = mycoef(P1,N1-I,x);
                   8195:                        S += T;
                   8196:                        R += T*x^N0*(x-1)^(N1-I)*dx^M;
                   8197:                        K2 = N0-1;
                   8198:                }else
                   8199:                        K2 = N-I;
                   8200:                for(K = K1; K <= K2; K++){
                   8201:                        if(K == K2){
                   8202:                                R += (mycoef(P2,N-I,x)-S)*x^K*(x-1)^(M-K)*dx^M;
                   8203:                                continue;
                   8204:                        }
                   8205:                        R += strtov("r"+rtostr(V))*x^K*(x-1)^(M-K)*dx^M;
                   8206:                        S += strtov("r"+rtostr(V++));
                   8207:                }
                   8208:        }
                   8209:        if(V > 1)
                   8210:                mycat([V-1, "accessory parameters: r1,r2,..."]);
                   8211:        return R;
                   8212: }
                   8213:
                   8214: def fuchs3e(P,Q,R)
                   8215: {
                   8216:        return getbygrs([R,P,Q],3);
                   8217: }
                   8218:
                   8219: def okubo3e(P,Q,R)
                   8220: {
                   8221:        if(getopt(opt)==1){
                   8222:                N=length(R);
                   8223:                M1=N-length(P);M2=N-length(Q);
                   8224:                V=(M1-1)*(M2-1);
                   8225:                if(V>0) mycat([V, "accessory parameters"]);
                   8226:                return getbygrs([R,cons([M1,0],P),cons([M2,0],Q)],3);
                   8227:        }
                   8228:        S = 0;
                   8229:        V = -1;
                   8230:        L = newvect(3,[[],[],[]]);
                   8231:        N = newvect(3,[0,0,0]);
                   8232:        if(type(R) < 4){
                   8233:                I = -1;
                   8234:                V = 3;
                   8235:        }else{
                   8236:                I = 2;
                   8237:                V = -1;
                   8238:        }
                   8239:        for( ; I >= 0; I--){
                   8240:                if(I == 2)
                   8241:                        U = R;
                   8242:                else if(I == 1)
                   8243:                        U = Q;
                   8244:                else
                   8245:                        U = P;
                   8246:                for( ; length(U); U = cdr(U)){
                   8247:                        T = car(U);
                   8248:                        if( T == "?"){
                   8249:                                if(V < 0)
                   8250:                                        V = I;
                   8251:                                else
                   8252:                                        return 0;
                   8253:                        }else{
                   8254:                                if(I == 2)
                   8255:                                        L[I] = cons(-T, L[I]);
                   8256:                                else
                   8257:                                        L[I] = cons(T, L[I]);
                   8258:                                S += T;
                   8259:                        }
                   8260:                        N[I]++;
                   8261:                }
                   8262:        }
                   8263:        if(V == 3){
                   8264:                N[2] = N[0] + N[1];
                   8265:                P2 = x^N;
                   8266:                for(I = 1; I <= N; I++)
                   8267:                        P2 += makev([R,I])*x^(N-I);
                   8268:        }else{
                   8269:                if(N[0]+N[1] != N[2]){
                   8270:                        print("Number of exponents are wrong",0);
                   8271:                        return -1;
                   8272:                }
                   8273:                S -= N[0]*N[1];
                   8274:                if(V < 0){
                   8275:                        if(S != 0){
                   8276:                                mycat(["Viorate Fuchs relation ->",S]);
                   8277:                                return -2;
                   8278:                        }
                   8279:                }else{
                   8280:                        if(V != 2)
                   8281:                                S = -S;
                   8282:                        L[V] = cons(S, L[V]);
                   8283:                }
                   8284:                P2 = polinsft(polbyroot(L[2],x),x);
                   8285:        }
                   8286:        P0 = polinsft(mysubst(polbyroot(L[0],x),[x,x+N[1]]),x);
                   8287:        P1 = polinsft(mysubst(polbyroot(L[1],x),[x,x+N[0]]),x);
                   8288:        return sub3e(P0,P1,P2,N[0],N[1],N[2]);
                   8289: }
                   8290:
                   8291: /*    N = 2*M (N-M = M)  or  2*M+1 (N-M = M+1)
                   8292:                0 : 0   1 ..... M-1 B B+1 ... B+N-M-2 A
                   8293:                1 : C C+1 ... C+M-1 0   1 ....  N-M-2 N-M-1
                   8294:  */
                   8295: def eosub(A,B,C,N)
                   8296: {
                   8297:        M = N%2;
                   8298:        P = [];
                   8299:        Q = [];
                   8300:        P = cons(A,P);
                   8301:        for(I = 0; I < N-M-1; I++)
                   8302:                P = cons(B+I,P);
                   8303:        for(I = 0; I < M; I++)
                   8304:                Q = cons(C+I,Q);
                   8305:        P = okubo3e(P,Q,s);
                   8306:
                   8307:        C  = newvect(2);
                   8308:        L  = newvect(2);
                   8309:        C[1] = chkexp(P,[x,dx],0,b,N-M-1);
                   8310:        C[0] = chkexp(P,[x,dx],1,c,M);
                   8311:        for(LL = K = 0; K < 2; K++){
                   8312:                L[K] = length(C[K]);
                   8313:                C[K] = ltov(C[K]);
                   8314:                if(L[K] > LL)
                   8315:                        LL = L[K];
                   8316:        }
                   8317:        JJ = 0;
                   8318:
                   8319:        for(I = 1; Do; I++){
                   8320:                Do = 0;
                   8321:                S = makev(["r",I]);
                   8322:                for(J = JJ; J < LL; J++){
                   8323:                        JJ = LL;
                   8324:                        for(K = 0; K < 2; K++){
                   8325:                                if(J >= L[K] || C[K][J] == 0)
                   8326:                                        continue;
                   8327:                                if(J < JJ)
                   8328:                                        JJ = J;
                   8329:                                if(Do == 1){
                   8330:                                        CC = C[K];
                   8331:                                        CC[J] = mysubst(CC[J], [S, Var]);
                   8332:                                        continue;
                   8333:                                }
                   8334:                                if(mydeg(C[K][J]) >= 1){
                   8335:                                        if(mydeg(C[K][J]) > 1){
                   8336:                                                print("Internal error");
                   8337:                                                return;
                   8338:                                        }
                   8339:                                        Var = getroot(C[K][J],S);
                   8340:                                        Var = Var[0];
                   8341:                                        CC = C[K];
                   8342:                                        CC[J] = 0;
                   8343:                                        P = mysubst(P, [S, Var]);
                   8344:                                        Do = 1;
                   8345:                                        J = JJ - 1;
                   8346:                                        K++;
                   8347:                                }
                   8348:                        }
                   8349:                }
                   8350:        }
                   8351:        if(JJ != L){
                   8352:                print("Internal error (non Rigid)");
                   8353:                return;
                   8354:        }
                   8355:        return P;
                   8356: }
                   8357:
                   8358: def even4e(X,Y){
                   8359:        if(length(X) != 4 || length(Y) != 2){
                   8360:                print("Usage: even4e([a,b,c,d],[e,f])");
                   8361:                print("0:     0 1 e f");
                   8362:                print("1;     0 1 * *+1");
                   8363:                print("infty: a b c d");
                   8364:                return;
                   8365:        }
                   8366:        S = -3;
                   8367:        for(I = 0; I < 4; I++){
                   8368:                S += X[I];
                   8369:                if(I < 2)
                   8370:                        S += Y[I];
                   8371:        }
                   8372:        S = -S/2;
                   8373:        P = okubo3e(Y,[S,"?"],X);
                   8374:        T = chkexp(P,x,1,S,2);
                   8375:        T = getroot(T[0],r1);
                   8376:        return mysubst(P,[r1,T[0]]);
                   8377: }
                   8378:
                   8379: def odd5e(X,Y)
                   8380: {
                   8381:        if(length(X) != 5 || length(Y) != 2){
                   8382:                print("Usage: spec6e([a,b,c,d,e],[f,g])");
                   8383:                print("0:     0  1  f  g g+1");
                   8384:                print("1:     0  1  2  * *+1");
                   8385:                print("infty: a  b  c  d  e");
                   8386:                return;
                   8387:        }
                   8388:        S = -4;
                   8389:        for(I = 0; I < 5; I++){
                   8390:                S += X[I];
                   8391:                if(I < 2)
                   8392:                        S += Y[I];
                   8393:        }
                   8394:        S = -(S + Y[1])/2;
                   8395:        P = okubo3e([Y[0],Y[1],Y[1]+1],[S,"?"],X);
                   8396:        T = chkexp(P,x,1,S,2);
                   8397:        T = getroot(T[0],r1);
                   8398:        P = mysubst(P,[r1,T[0]]);
                   8399:        T = chkexp(P,x,0,Y[1],2);
                   8400:        T = getroot(T[0],r2);
                   8401:        return mysubst(P,[r2,T[0]]);
                   8402: }
                   8403:
                   8404: def extra6e(X,Y)
                   8405: {
                   8406:        if(length(X) != 6 || length(Y) != 2){
                   8407:                print("Usage: extra6e([a,b,c,d,e,f],[g,h])");
                   8408:                print("0:     0  1  g g+1 h h+1");
                   8409:                print("1:     0  1  2  3  * *+1");
                   8410:                print("infty: a  b  c  d  e  f");
                   8411:                return;
                   8412:        }
                   8413:        S = -5;
                   8414:        for(I = 0; I < 6; I++){
                   8415:                S += X[I];
                   8416:                if(I < 2)
                   8417:                        S += 2*Y[I];
                   8418:        }
                   8419:        S = -S/2;
                   8420:        P = okubo3e([Y[0],Y[0]+1,Y[1],Y[1]+1],[S,"?"],X);
                   8421:        T = chkexp(P,x,1,S,2);
                   8422:        T = getroot(T[0],r1);
                   8423:        P = mysubst(P,[r1,T[0]]);
                   8424:        T = chkexp(P,x,0,Y[0],2);
                   8425:        T = getroot(T[0],r3);
                   8426:        P = mysubst(P,[r3,T[0]]);
                   8427:        T = chkexp(P,x,0,Y[1],2);
                   8428:        T = getroot(T[0],r2);
                   8429:        return mysubst(P,[r2,T[0]]);
                   8430: }
                   8431:
                   8432: def rigid211(X,Y,Z)
                   8433: {
                   8434:        if(length(X) != 2 || length(Y) != 2 || length(Z) != 2){
                   8435:                print("Usage: rigid211([a,b],[c,d],[e,f])");
                   8436:                print("0:     0  1   a  b");
                   8437:                print("1:     0  1   c  d");
                   8438:                print("infty: e  e+1 f  *");
                   8439:                return;
                   8440:        }
                   8441:        P = okubo3e(X,Y,[Z[0],Z[0]+1,Z[1],"?"]);
                   8442:        T = chkexp(P,x,"infty",Z[0],2);
                   8443:        T = getroot(T[0],r1);
                   8444:        return mysubst(P,[r1,T[0]]);
                   8445: }
                   8446:
                   8447: def solpokuboe(P,L,N)
                   8448: {
                   8449:        if(type(N) > 1 || ntype(N) != 0 || dn(N) != 1){
                   8450:                mycat(["Irrigal argument :", N]);
                   8451:                return 0;
                   8452:        }
                   8453:        L = vweyl(L);
                   8454:        DD=N+1;
                   8455:        for(U = S = L[0]^N; U != 0; ){
                   8456:                D = mydeg(U,L[0]);
                   8457:                if(D>=DD){
                   8458:                        mycat(["Internal Error",D,DD]);
                   8459:                        return -1;
                   8460:                }
                   8461:                DD=D;
                   8462:                UU = L[0]^D;
                   8463:                R  = appldo(P,UU,L);
                   8464:                if(mydeg(R,L[0]) > D){
                   8465:                        printf("Bad operator\n");
                   8466:                        return 0;
                   8467:                }
                   8468:                CC = mycoef(R,D,L[0]);
                   8469:                if(D == N){
                   8470:                        P -= (E = CC);
                   8471:                        U = R-E*U;
                   8472:                        continue;
                   8473:                }
                   8474:                if(CC == 0){
                   8475:                        printf("No polynomial\n");
                   8476:                        return 0;
                   8477:                }
                   8478:                CC= mycoef(U,D,L[0])/CC;
                   8479:                S = red(S - UU*CC);
                   8480:                U = red(U - R*CC);
                   8481:        }
                   8482:        return [nm(S),E];
                   8483: }
                   8484:
                   8485: def stoe(M,L,N)
                   8486: {
                   8487:        L = vweyl(L);
                   8488:        Size = size(M);
                   8489:        S = Size[0];
1.80      takayama 8490:        NN = -1;
1.6       takayama 8491:        if(type(N) == 4){
                   8492:                NN=N[0]; N=N[1];
1.80      takayama 8493:                if(N==NN) return 1;
1.6       takayama 8494:        }else if(N < 0){
                   8495:                NN=-N; N=0;
                   8496:        }
                   8497:        if(S != Size[1] || N >= S || NN >= S)
                   8498:                return;
                   8499:        D = newmat(S+1,S+1);
                   8500:        MN = dupmat(M);
                   8501:        MD = newmat(S,S);
                   8502:        DD = D[0];
1.80      takayama 8503:        DD[N]=1; DD[S] = 1;
1.6       takayama 8504:        for(Lcm = I = 1; ; ){
                   8505:                DD = D[I];
                   8506:                MM = MN[N];
                   8507:                for(J = 0; J < S; J++){
                   8508:                        DD[J] = MM[J];
                   8509:                        Lcm = lcm(dn(DD[J]),Lcm);
                   8510:                }
                   8511:                DD[S] = L[1]^I;
                   8512:                for(J = 0; J <= S; J++)
                   8513:                         DD[J] = red(DD[J]*Lcm);
                   8514:                if(I++ >= S)
                   8515:                        break;
1.80      takayama 8516:                if(I==S && NN>=0){
1.6       takayama 8517:                        DD = D[I];
1.80      takayama 8518:                        DD[S]=z_zz; DD[NN]=1;
1.6       takayama 8519:                        break;
                   8520:                }
                   8521:                Mm = dupmat(MN*M);
                   8522:                for(J = 0; J < S; J++){
                   8523:                        for(K = 0; K < S; K++)
                   8524:                                MN[J][K] = red(diff(MN[J][K],L[0])+Mm[J][K]);
                   8525:                }
                   8526:        }
                   8527: #if 0
                   8528:        P = fctr(mydet2(D));
                   8529: #else
                   8530:        P = fctr(det(D));
                   8531: #endif
                   8532:        for(I = R = 1; I < length(P); I++){
                   8533:                if(mydeg(P[I][0],L[1]) > 0)
                   8534:                         R *= P[I][0]^P[I][1];
                   8535:        }
1.80      takayama 8536:        if(NN >= 0)
1.6       takayama 8537:                R = -red(coef(R,0,z_zz)/coef(R,1,z_zz));
                   8538:        return R;
                   8539: }
                   8540:
                   8541: def dform(L,X)
                   8542: {
                   8543:        if(type(X)==2) X=[X];
                   8544:        if(type(L[0])!=4) L=[L];
                   8545:        if(type(X)==4) X=ltov(X);
                   8546:        M=length(X);
                   8547:        if(length(car(L))==2){
                   8548:                R=newvect(M);
                   8549:                for(LL=L; LL!=[]; LL=cdr(LL)){
                   8550:                        for(I=0; I<M; I++){
                   8551:                                RT=rmul(car(LL)[0],mydiff(car(LL)[1],X[I]));
                   8552:                                R[I] = (R[I]==0)?RT:radd(R[I],RT);
                   8553:                        }
                   8554:                }
                   8555:                Dif=getopt(dif);
                   8556:                for(RR=[], I=M-1; I>=0; I--){
                   8557:                        if(Dif==1) RR=cons([1,R[I],X[I]],RR);
                   8558:                        else RR=cons([R[I],X[I]],RR);
                   8559:                }
                   8560:                if(Dif==1) RR=dform(RR,X);
                   8561:                return RR;
                   8562:        }else if(length(car(L))!=3) return L;
                   8563:        N=M*(M-1)/2;
                   8564:        R=newvect(N);
                   8565:        S=newvect(N);
                   8566:        for(LL=L; LL!=[]; LL=cdr(LL)){
                   8567:                for(I=K=0; I<M; I++){
                   8568:                        for(J=I+1; J<M; J++, K++){
                   8569:                                if(LL==L) S[K]=[X[I],X[J]];
                   8570:                                LT=car(LL);
                   8571:                                R1=mydiff(LT[2],X[J]);
                   8572:                                R2=mydiff(-LT[2],X[I]);
                   8573:                                if(R2==0){
                   8574:                                        if(R1==0) continue;
                   8575:                                        R1=rmul(mydiff(LT[1],X[I]),R1);
                   8576:                                }else if(R1==0){
                   8577:                                        R1=rmul(mydiff(LT[1],X[J]),R2);
                   8578:                                }else
                   8579:                                        R1=rmul(mydiff(LT[1],X[I]),R1)+rmul(mydiff(LT[1],X[J]),R2);
                   8580:                                R1=rmul(LT[0],R1);
                   8581:                                R[K] = (R[K]==0)?R1:radd(R[K],R1);
                   8582:                        }
                   8583:                }
                   8584:        }
                   8585:        for(RR=[],I=N-1; I>=0; I--)
                   8586:                RR=cons([R[I],S[I][0],S[I][1]],RR);
                   8587:        return RR;
                   8588: }
                   8589:
                   8590: def polinvsym(P,Q,Sym)
                   8591: {
                   8592:        N  = length(Q);
                   8593:        T  = polbyroot(Q,zz);
                   8594:        for(I = 1; I <= N; I++){
                   8595:                P = mysubst(P,[makev([Sym,I]), (-1)^I*coef(T,N-I,zz)]);
                   8596:        }
                   8597:        return P;
                   8598: }
                   8599:
                   8600: def polinsym(P,Q,Sym)
                   8601: {
                   8602:        if(type(P) == 3){
                   8603:                P = red(P);
                   8604:                if(type(P) == 3){
                   8605:                        D = polinsym(dn(P),Q,Sym);
                   8606:                         if(D == 0)
                   8607:                                 return 0;
                   8608:                        return polinsym(nm(P),Q,Sym)/D;
                   8609:                }
                   8610:        }
                   8611:        N  = length(Q);
                   8612:        V  = newvect(N+1);
                   8613:        S  = newvect(N+1);
                   8614:        E  = newvect(N+1);
                   8615:        E0 = newvect(N+1);
                   8616:        T  = polbyroot(Q,zzz);
                   8617:        for(J = 1; J <= N; J++){
                   8618:                K = coef(T,N-J,zzz);
                   8619:                if(J % 2)
                   8620:                        K = -K;
                   8621:                S[J] = K;
                   8622:                V[J] = makev([Sym,J]);
                   8623:        }
                   8624:        K = deg(P,Q[0]);
                   8625:        for(J = 0; J <= N; J++)
                   8626:                E0[J] = K+1;
                   8627:        E[0] = K+1;
                   8628:        while(deg(P,Q[0]) > 0){
                   8629:                for(P0 = P, J = 1; J <= N; J++){
                   8630:                        E[J] = deg(P0,Q[J-1]);
                   8631:                        P0 = coef(P0,E[J],Q[J-1]);
                   8632:                }
                   8633:        /* P0*Q[0]^E[1]*Q[1]^E[2]*...  E[1] >= E[2} >= ... */
                   8634:                for(J = 1; J <= N; J++){
                   8635:                        if(E[J] < E0[J])
                   8636:                                break;
                   8637:                        if(E[J-1] < E[J])
                   8638:                                J = N;
                   8639:                }
                   8640:                if(J > N){
                   8641:                        print("Not symmetric");
                   8642:                        return 0;
                   8643:                }
                   8644:                for(J = 1; J <= N; J++)
                   8645:                        E0[J] = E[J];
                   8646:                for(J = N; J > 1; J--){
                   8647:                        if(E[J] != 0)
                   8648:                                for(K = 1; K < J; K++)
                   8649:                                        E[K] -= E[J];
                   8650:                }
                   8651:                for(R0 = P0, K = 1; K <= N; K++){
                   8652:                        if(E[K] > 0)
                   8653:                                P0 *= S[K]^E[K];
                   8654:                                R0 *= V[K]^E[K];
                   8655:                }
                   8656:                P += R0 - P0;
                   8657:        }
                   8658:        return P;
                   8659: }
                   8660:
                   8661: def tohomog(P,L,V)
                   8662: {
                   8663:        while(length(L)>0){
                   8664:                P = mysubst(P,[car(L),car(L)/V]);
                   8665:                L = cdr(L);
                   8666:        }
                   8667:        P = red(P);
                   8668:        N = mindeg(dn(P),V);
                   8669:        if(N > 0)
                   8670:                P = red(P*V^N);
                   8671:        N = mindeg(dn(P),V);
                   8672:        if(N > 0)
                   8673:                P = red(P/(V^N));
                   8674:        return P;
                   8675: }
                   8676:
                   8677: def substblock(P,X,Q,Y)
                   8678: {
                   8679:        P = red(P);
                   8680:        if(deg(dn(P),X) > 0)
                   8681:                return substblock(nm(P),X,Q,Y)/substblock(dn(P),X,Q,Y);
                   8682:        N = mydeg(Q,X);
                   8683:        if(N < 1)
                   8684:                return P;
                   8685:        R = mycoef(Q,N,X);
                   8686:        while(M = mydeg(P,X), M >= N)
                   8687:                P = red(P - mycoef(P,M,X)*(Q-Y)*X^(M-N)/R);
                   8688:        return P;
                   8689: }
                   8690:
                   8691: def okuboetos(P,L)
                   8692: {
                   8693:        L = vweyl(L); X = L[0]; DX = L[1];
                   8694:        N = mydeg(P,DX);
                   8695:        C = mycoef(P,N,DX);
                   8696:        K = mydeg(C,X);
                   8697:        if(K > N){
                   8698:                print("Irregular singularity at infinity")$
                   8699:                return 0;
                   8700:        }
                   8701:        if(N > K)
                   8702:                P *= x^(N-K);
                   8703:
                   8704:        L = getroot(mycoef(P,N,DX),x);
                   8705:        L = ltov(reverse(L));
                   8706:        if(length(L) != N || N == 0){
                   8707:                print("Cannot get exponents")$
                   8708:                return 0;
                   8709:        }
                   8710:        if( type(LL = getopt(diag)) == 4 ){
                   8711:                LL = ltov(LL);
                   8712:                if(length(LL) != N){
                   8713:                        mycat(["Length of the option should be", N]);
                   8714:                        return 0;
                   8715:                }
                   8716:                Tmp = newvect(N);
                   8717:                for(I = N-1; I >= 0; I--){
                   8718:                         for(LLT = LL[I], J = N-1; J >=0 ; J--){
                   8719:                                 if(LLT == L[J] && Tmp[J] == 0){
                   8720:                                         Tmp[J] = 1;
                   8721:                                         break;
                   8722:                                 }
                   8723:                         }
                   8724:                         if(J < 0){
                   8725:                                 print("option is wrong");
                   8726:                                 return 0;
                   8727:                         }
                   8728:                }
                   8729:                L = LL;
                   8730:        }
                   8731:        P /= mycoef(C,N,X);
                   8732:        A  = newmat(N,N);
                   8733:        AT = newmat(N+1,N+1);
                   8734:        Phi= newvect(N+1);
                   8735:        Phi[0] = 1;
                   8736:        for(J = 0; J < N; J++)
                   8737:                Phi[J+1] = Phi[J]*(X-L[J]);
                   8738:        for(ATT = AT[N], J = 0; J < N; J++)
                   8739:                ATT[J] = mycoef(P,J,DX);
                   8740:
                   8741:        for(K = 1; K <= N; K++){
                   8742:                for(J = N; J >= K; J--){
                   8743:                        Aj = A[J-1];
                   8744:                        SIG = AT[J][J-K];
                   8745:                        for(I = 0; I <= K-2; I++)
                   8746:                                SIG += Aj[J-I-1]*AT[J-I-1][J-K];
                   8747:                        if(K == 1)
                   8748:                                DAT = mydiff(Phi[J-1],X);
                   8749:                        else
                   8750:                                DAT = mydiff(AT[J-1][J-K],X);
                   8751:                        Aj[J-K] = -SIG+(X-L[J-1])*DAT;
                   8752:                        Aj[J-K] /= Phi[J-K];
                   8753:                        Aj[J-K] = mysubst(Aj[J-K],[X,L[J-1]]);
                   8754:                        if(J < K+1) continue;
                   8755:                        ATj = AT[J-1];
                   8756:                        ATj[J-K-1] = SIG+Aj[J-K]*Phi[J-K];
                   8757:                        ATj[J-K-1] /= (X - L[J-1]);
                   8758:                        ATj[J-K-1] = red(ATj[J-K-1]-DAT);
                   8759:                }
                   8760:        }
                   8761:
                   8762:        ATT  = newmat(N,N);
                   8763:        for(J = 0; J < N; J++){
                   8764:                for(K = 0; K < N; K++){
                   8765:                        ATj = ATT[J];
                   8766:                        ATj[K] = AT[J][K];
                   8767:                }
                   8768:                ATj[J] = Phi[J];
                   8769:                if(J < N-1){
                   8770:                        ATj = A[J];
                   8771:                        ATj[J+1] = 1;
                   8772:                }
                   8773:        }
                   8774:        return [L,A,ATT];
                   8775: }
                   8776:
                   8777: def heun(X,P,R)
                   8778: {
                   8779:        if(type(X) != 4 || length(X) != 5){
                   8780:                print("Usage: huen([a,b,c,d,e],p,r)");
                   8781:                print("0:     0  c");
                   8782:                print("1:     0  d");
                   8783:                print("p:     0  e");
                   8784:                print("infty: a  b");
                   8785:                print("Fuchs relation: a+b+1 = c+d+e");
                   8786:                return;
                   8787:        }
                   8788:        S = 1;
                   8789:        V = -1;
                   8790:        X = ltov(X);
                   8791:        for(I = 0; I < 5; I++){
                   8792:                if(X[I] == "?"){
                   8793:                        if(V >= 0)
                   8794:                                return;
                   8795:                        V = I;
                   8796:                }else if(I < 2){
                   8797:                        S += X[I];
                   8798:                }else
                   8799:                        S -= X[I];
                   8800:        }
                   8801:        if(V >= 0){
                   8802:         if(V < 2)
                   8803:                 X[V] = -S;
                   8804:         else
                   8805:                 X[V] = S;
                   8806:        }else if(S != 0){
                   8807:                mycat(["Fuch relation:", S,"should be zero!"]);
                   8808:                return;
                   8809:        }
                   8810:        return
                   8811:         x*(x-1)*(x-P)*dx^2
                   8812:                + (X[2]*(x-1)*(x-P)+X[3]*x*(x-P)+X[4]*x*(x-1))*dx
                   8813:                + X[0]*X[1]*(x-R);
                   8814: }
                   8815:
                   8816: def fspt(M,T)
                   8817: {
                   8818:        if(type(M)==7) M=s2sp(M);
                   8819:        if(T == 3)            /* 3: cut 0 */
                   8820:                return cutgrs(M);
                   8821:        if(T == 4 || T== 5){  /* 4: short  5: long */
                   8822:                for(MN = [] ; M != []; M = cdr(M)){
                   8823:                        MT = car(M);
                   8824:                        for(MNT = []; MT != []; MT = cdr(MT)){
                   8825:                                if(type(car(MT)) <= 3){
                   8826:                                        if(T == 4) MNT = cons(car(MT),MNT);
                   8827:                                        else       MNT = cons([1,car(MT)],MNT);
                   8828:                                }else{
                   8829:                                        if(T == 5 || car(MT)[0] > 1) MNT = cons(car(MT),MNT);
                   8830:                                        else if(car(MT)[0] == 1)  MNT = cons(car(MT)[1],MNT);
                   8831:                                }
                   8832:                        }
                   8833:                        MN = cons(reverse(MNT), MN);
                   8834:                }
                   8835:                return reverse(MN);
                   8836:        }
                   8837:        if(type(M[0][0]) == 4){
                   8838:                for(MN = [] ; M != []; M = cdr(M)){
                   8839:                        MT = car(M);
                   8840:                        for(MNT = []; MT != []; MT = cdr(MT))
                   8841:                                MNT = cons(car(MT)[0], MNT);
                   8842:                         MN = cons(reverse(MNT), MN);
                   8843:                }
                   8844:                return fspt(reverse(MN),T);
                   8845:        }
                   8846:        if(T == 0)  /* 0: sp */
                   8847:                return M;
                   8848:        for(MN = [] ; M != []; M = cdr(M)){
                   8849:                MT = qsort(ltov(car(M)));
                   8850:                L = length(MT);
                   8851:                for(MNT = [], I = 0; I < L; I++)
                   8852:                        MNT = cons(MT[I], MNT);
                   8853:                MN = cons(MNT, MN);
                   8854:        }
                   8855:        MN = reverse(MN);
                   8856:        if(T==6) return MN; /* 7: sort */
                   8857:        L = length(MN);
                   8858:        for(M = MN; M != []; M = cdr(M)){
                   8859:                for(I = 0, MT = car(M); MT != []; MT = cdr(MT))
                   8860:                        I += car(MT);
                   8861:                if(OD == 0)
                   8862:                        OD = I;
                   8863:                else if(OD != I || OD == 0)
                   8864:                        return 0;
                   8865:        }
                   8866:        ALL = [MN];
                   8867:        RD=[];
                   8868:        while(OD > 0){
                   8869:                for(S = 0, MT = MN; MT != []; MT = cdr(MT))
                   8870:                        S += car(MT)[0];
                   8871:                S -= (L-2)*OD;
                   8872:                if(S <= 0){
                   8873:                        if(T==7) return [ALL[0],ALL[length(ALL)-1],RD];
                   8874:                        return (T==1)?MN:ALL;
                   8875:                }
                   8876:                RD=cons([S,0,0],RD);
                   8877:                for(NP=0, M = [], MT = MN; MT != []; NP++, MT = cdr(MT)){
                   8878:                        MTT = car(MT);
                   8879:                        I = MTT[0] - S;
                   8880:                        if(I < 0){
                   8881:                                if(I+OD!=0) return 0;
                   8882:                                if(T==7) return [ALL[0],ALL[length(ALL)-1],cdr(RD)];
                   8883:                                return (T==1)?MN:ALL;
                   8884:                        }
                   8885:                        MTT = cdr(MTT);
                   8886:                        NC=1; DO=0;
                   8887:                        for(MNT = []; MTT != []; MTT = cdr(MTT)){
                   8888:                                if(MTT[0] > I){
                   8889:                                        if(DO==0) RD=cons([MTT[0]-I,NP,NC++],RD);
                   8890:                                        MNT = cons(MTT[0], MNT);
                   8891:                                }
                   8892:                                else if(MTT[0] <= I && I != 0){
                   8893:                                        DO=1;
                   8894:                                        MNT = cons(I, MNT);
                   8895:                                        I = 0;
                   8896:                                        if(MTT[0] > 0)
                   8897:                                                MNT = cons(MTT[0], MNT);
                   8898:                                }
                   8899:                        }
                   8900:                        if(I > 0)
                   8901:                                MNT = cons(I,MNT);
                   8902:                        M = cons(reverse(MNT), M);
                   8903:                }
                   8904:                MN = reverse(M);
                   8905:                ALL = cons(MN,ALL);
                   8906:                OD -= S;
                   8907:        }
                   8908: }
                   8909:
                   8910: def abs(X)
                   8911: {
                   8912:        if(vars(X)!=[]) return todf(os_md.abs,[X]);
                   8913:        if(type(X)==4){
                   8914:                P=X[1];X=X[0];
                   8915:        }else P=0;
                   8916:        if(type(X)==1){
                   8917:                if((T=ntype(X))<2 || T==3){
                   8918:                        if(X<0) X=-X;
                   8919:                }else if(T==4) X=P?pari(abs,X,P):pari(abs,X);
                   8920:        }
                   8921:        return X;
                   8922: }
                   8923:
1.20      takayama 8924: def sgn(X)
                   8925: {
                   8926:        if(X==0) return 0;
                   8927:        if(type(X)==1){
                   8928:                return (X>0)?1:-1;
                   8929:        }
                   8930:        if(type(X)==5) X=vtol(X);
                   8931:        if(type(X)==4){
                   8932:                for(W=0,Y=X;Y!=[];Y=cdr(Y))
                   8933:                        for(Z=cdr(Y);Z!=[];Z=cdr(Z))
                   8934:                                if(car(Y)>car(Z)) W++;
                   8935:                if(getopt(val)==1) return W;
                   8936:                return (iand(W,1))?-1:1;
                   8937:        }
                   8938: }
                   8939:
1.6       takayama 8940: def calc(X,L)
                   8941: {
1.10      takayama 8942:        if(type(X)<4||type(X)==7){
                   8943:                if(type(L)==4||type(L)==7){
1.6       takayama 8944:                        V=L[1];
1.10      takayama 8945:                        if(type(X)!=7){
                   8946:                                if((L0=L[0])=="+") X+=V;
                   8947:                                else if(L0=="-")   X-=V;
                   8948:                                else if(L0=="*")   X*=V;
                   8949:                                else if(L0=="/")   X/=V;
                   8950:                                else if(L0=="^")   X^=V;
                   8951:                        }
                   8952:                        if((L0=L[0])==">")      X=(X>V);
                   8953:                        else if(L0=="<")        X=(X<V);
                   8954:                        else if(L0=="=")        X=(X==V);
1.6       takayama 8955:                        else if(L0==">=")   X=(X>=V);
                   8956:                        else if(L0=="<=")   X=(X<=V);
                   8957:                        else if(L0=="!=")       X=(X!=V);
1.10      takayama 8958:                }else if(type(L)==7&&type(X)<4){
1.6       takayama 8959:                        if(L=="neg") X=-X;
                   8960:                        else if(L=="abs") X=abs(X);
                   8961:                        else if(L=="neg") X=-X;
                   8962:                        else if(L=="sqr") X*=X;
                   8963:                        else if(L=="inv") X=1/X;
                   8964:                        else if(L=="sgn"){
                   8965:                                if(X>0)X=1;
                   8966:                                else if(X<0) X=-1;
                   8967:                        }
                   8968:                }
                   8969:        }
                   8970:        return X;
                   8971: }
                   8972:
1.23      takayama 8973: def tobig(X)
                   8974: {
                   8975:        if((type(X)==1 && ntype(X)==3)||type(X)>3) return X;
                   8976:        return eval(X*exp(0));
                   8977: }
                   8978:
1.6       takayama 8979: def isint(X)
                   8980: {
                   8981:        if(X==0||(type(X)==1 && ntype(X)==0 && dn(X)==1)) return 1;
                   8982:        return 0;
                   8983: }
                   8984:
                   8985: def israt(X)
                   8986: {
                   8987:        if(X==0||(type(X)==1 && ntype(X)==0)) return 1;
                   8988:        return 0;
                   8989: }
                   8990:
                   8991: def iscrat(X)
                   8992: {
                   8993:        if(X==0 || (type(X)==1 && israt(real(X)) && israt(imag(X)))) return 1;
                   8994:        return 0;
                   8995: }
                   8996:
                   8997: def isalpha(X)
                   8998: {
                   8999:        return ((X>64&&X<91)||(X>96&&X<123))?1:0;
                   9000: }
                   9001:
                   9002: def isnum(X)
                   9003: {
                   9004:        return (X>47&&X<58)?1:0;
                   9005: }
                   9006:
                   9007: def isalphanum(X)
                   9008: {
                   9009:        return (isalpha(X)||isnum(X))?1:0;
                   9010: }
                   9011:
1.8       takayama 9012: def isdecimal(X)
                   9013: {
                   9014:        if(type(X)!=7) return 0;
                   9015:        F=S=0;
                   9016:        L=strtoascii(X);
                   9017:        while(L!=[]&&car(L)==32) L=cdr(L);
                   9018:        if(L!=[]&&car(L)==45) L=cdr(L);  /* - */
                   9019:        while(L!=[]&&isnum(car(L))){
                   9020:                F=1; L=cdr(L);
                   9021:        }
                   9022:        while(L!=[]&&car(L)<33){
                   9023:                S=1;L=cdr(L);
                   9024:        }
                   9025:        if(L==[]) return F;
                   9026:        else if(S||car(L)!=46) return 0; /* . */
                   9027:        L=cdr(L);F=0;
                   9028:        while(L!=[]&&isnum(car(L))){
                   9029:                F=1; L=cdr(L);
                   9030:        }
                   9031:        while(L!=[]&&car(L)<33) L=cdr(L);
                   9032:        return (L==[])?F:0;
                   9033: }
                   9034:
1.6       takayama 9035: def isvar(X)
                   9036: {
                   9037:        return ([X]==vars(X)&&vtype(X)<3)?1:0;
                   9038: }
                   9039:
                   9040: def isyes(F)
                   9041: {
                   9042:        if((CC=getopt(set))==1){
                   9043:                IsYes=(type(F[0])==4)?F:[F];
                   9044:                return 1;
                   9045:        }else if(CC==0) return(IsYes);
                   9046:        if(type(CC)!=7)
                   9047:                CC=IsYes;
                   9048:        for(;CC!=[]; CC=cdr(CC)){
                   9049:                C=car(CC);
                   9050:                V=call(C[0],cons(F,C[1]));
                   9051:                if(type(C[2])!=4){
                   9052:                        if(V!=C[2])     break;
                   9053:                }else{
                   9054:                        if(C[2][0]!="" && V<C[2][0]) break;
                   9055:                        if(C[2][1]!="" && V>C[2][1]) break;
                   9056:                }
                   9057:        }
                   9058:        return (CC==[])?1:0;
                   9059: }
                   9060:
                   9061: def isall(FN,M)
                   9062: {
                   9063:        if(type(M)<4 || type(M)>6) return ((*FN)(M)==0)?0:1;
                   9064:        if(type(M)==4){
                   9065:                for(;M!=[];M=cdr(M))
                   9066:                        if((*FN)(car(M))==0) return 0;
                   9067:        }else if(type(M)==5){
                   9068:                K=length(M);
                   9069:                for(I=0;I<K;I++)
                   9070:                        if((*FN)(M[I])==0) return 0;
                   9071:        }else if(type(M)==6){
                   9072:                K=size(M)[0];
                   9073:                for(I=0;I<K;I++)
                   9074:                        if (isall(FN,M[I])==0) return 0;
                   9075:        }
                   9076:        return 1;
                   9077: }
                   9078:
                   9079: def sproot(MP,T)
                   9080: {
                   9081:        if((I=str_chr(T,0,","))>0){
                   9082:                if(type(MP)==7) M=s2sp(MP);
                   9083:                else M=chkspt(MP|opt=0);
                   9084:                if(I==length(M[0])){
                   9085:                        N=s2sp(T);S=SM=SN=K=0;
                   9086:                        for(MM=M,NN=N;MM!=[];MM=cdr(MM),NN=cdr(NN),K++){
                   9087:                                for(MT=car(MM),NT=car(NN);MT!=[];MT=cdr(MT),NT=cdr(NT)){
                   9088:                                        S+=car(MT)*car(NT);
                   9089:                                        if(K==0){
                   9090:                                                SM+=car(MT);SN+=car(NT);
                   9091:                                        }
                   9092:                                }
                   9093:                        }
                   9094:                        return S-(length(M)-2)*SM*SN;
                   9095:                }
                   9096:        }
                   9097:        MM=chkspt(MP|opt=7);
                   9098:        if(T=="base") return MM;
                   9099:        Keep=(getopt(keep)==1)?1:0;
                   9100:        Null=getopt(null);
                   9101:        Only=getopt(only);
                   9102:        if(type(Only)!=1) Only=7;
                   9103:        M0=MM[0];
                   9104:        M1=MM[1];
                   9105:        M=MM[2];
                   9106:        if(T=="length") return length(M);
                   9107:        if(T=="height"){
                   9108:                for(J=2,S=M1[0][0],M2=M1; M2!=[]; M2=cdr(M2)){
                   9109:                        for(MT=cdr(car(M2)); MT!=[]; J++, MT=cdr(MT)){
                   9110:                                S+= J*car(MT);
                   9111:                        }
                   9112:                        J=1;
                   9113:                }
                   9114:                return S;
                   9115:        }
                   9116:        for(OD=0, MT=M1[0]; MT!=[]; MT=cdr(MT)) OD+=car(MT);
                   9117:        if(T=="type"){
                   9118:                R=newvect(OD+1);
                   9119:                for(MT=M; MT!=[]; MT=cdr(MT)) R[MT[0][0]]++;
                   9120:                for(RR=[],I=OD; I>0; I--)
                   9121:                        if(R[I]>0) RR=cons([R[I],I],RR);
                   9122:                return RR;
                   9123:        }
                   9124:        if(T=="part"||T=="pair"||T=="pairs"){
                   9125:                NP=length(M1);
                   9126:                LM=newvect(NP);
                   9127:                R=newvect(length(M));
                   9128:                for(K=0; K<NP; K++) LM[K]=length(M1[K]);
                   9129:                for(I=0,TM=M; TM!=[]; I++, TM=cdr(TM)){
                   9130:                        V=newvect(NP);
                   9131:                        for(K=0; K<NP; K++) V[K]=newvect(LM[K]);
                   9132:                        TP=car(TM);
                   9133:                        if(TP[2]==0){
                   9134:                                for(K=0;K<NP;K++) V[K][0]=1;
                   9135:                                for(J=0; J<I; J++){
                   9136:                                        VJ=R[J][1];
                   9137:                                        for(S=K=0;K<NP;K++) S+=VJ[K][0];
                   9138:                                        for(OD=0,K=0;K<LM[0];K++) OD+=VJ[0][K];
                   9139:                                        S-=(NP-2)*OD;
                   9140:                                        for(K=0;K<NP;K++) VJ[K][0]-=S;
                   9141:                                }
                   9142:                        }else{
                   9143:                                K=TP[1]; P=TP[2];
                   9144:                                V[K][P-1]=-1; V[K][P]=1;
                   9145:                                for(J=0; J<I; J++){
                   9146:                                        VJ=R[J][1];
                   9147:                                        S=VJ[K][P]; VJ[K][P]=VJ[K][P-1]; VJ[K][P-1]=S;
                   9148:                                }
                   9149:                        }
                   9150:                        R[I]=[TP[0],V];
                   9151:                }
                   9152:                if(T=="pair"||T=="pairs"){
                   9153:                        MV=ltov(M1);
                   9154:                        for(K=0; K<NP; K++) MV[K] = ltov(MV[K]);
                   9155:                        for(RR=UU=SS=[],I=0; I<length(M); I++){
                   9156:                                V=newvect(NP); W=newvect(NP); U=newvect(NP);
                   9157:                                for(K=0; K<NP; K++){
                   9158:                                        U[K]=newvect(LM[K]); V[K]=newvect(LM[K]); W[K]=newvect(LM[K]);
                   9159:                                }
                   9160:                                S=R[I][0];
                   9161:                                for(K=0; K<NP; K++){
                   9162:                                        for(Q=J=0; J<LM[K]; J++){
                   9163:                                                V[K][J] = S*(U[K][J] = R[I][1][K][J]);
                   9164:                                                Q+=(W[K][J] = MV[K][J] - V[K][J]);
                   9165:                                        }
                   9166:                                }
                   9167:                                if(Q>0 && iand(Only,1)==0) continue;
                   9168:                                if(Q==0 && iand(Only,2)==0) continue;
                   9169:                                if(Q<0 && iand(Only,4)==0) continue;
                   9170:                                for(K=0; K<NP; K++){
                   9171:                                        V[K] = vtol(V[K]); W[K] = vtol(W[K]); U[K]=vtol(U[K]);
                   9172:                                }
                   9173:                                V=vtol(V); W=vtol(W);U=vtol(U);
                   9174:                                if(Q<0) S=-S;
                   9175:                                RR = cons([V,W], RR); UU = cons(U,UU); SS=cons(S,SS);
                   9176:                        }
                   9177:                        RR = reverse(RR); UU=reverse(UU); SS=reverse(SS);
                   9178:                        if(getopt(dviout)==1 && (Null!=1 || RR!=[])){
                   9179:                                 Out=string_to_tb("\\begin{align}\\begin{split}"+s2sp(M1)+"&=");
                   9180:                                 for(I=0,R=RR, U=UU; R!=[]; I++, R=cdr(R), U=cdr(U)){
                   9181:                                         if(I>0) str_tb("\\\\\n &=",Out);
                   9182:                                         if(T=="pairs"){
                   9183:                                                 if((S=SS[I])<0) S=-S;
                   9184:                                                 if(S>1) str_tb([my_tex_form(S),"("],Out);
                   9185:                                                 str_tb(s2sp(car(U)),Out);
                   9186:                                                 if(S>1) str_tb(")",Out);
                   9187:                                                 str_tb(" \\oplus ",Out);
                   9188:                                                 if(SS[I]<0){
                   9189: #ifdef USEMODULE
                   9190:                                                         str_tb(["-(",s2sp(mtransbys(os_md.abs,car(R)[1],[])),")"],Out);
                   9191: #else
                   9192:                                                         str_tb(["-(",s2sp(mtransbys(abs,car(R)[1],[])),")"],Out);
                   9193: #endif
                   9194:                                                 }else
                   9195:                                                         str_tb(s2sp(car(R)[1]),Out);
                   9196:                                         }else
                   9197:                                                 str_tb([s2sp(car(R)[0])," \\oplus ",s2sp(car(R)[1])],Out);
                   9198:                                }
                   9199:                                 str_tb("\n\\end{split}\\end{align}",Out);
                   9200:                                 dviout(str_tb(0,Out)|keep=Keep);
                   9201:                        }
                   9202:                        return RR;
                   9203:                }
                   9204:                for(I=0; I<length(M); I++){
                   9205:                        for(K=0; K<NP; K++) R[I][1][K] = vtol(R[I][1][K]);
                   9206:                        R[I] = [R[I][0],vtol(R[I][1])];
                   9207:                }
                   9208:                R = vtol(R);
                   9209:                return [M0,M1,R];
                   9210:        }
                   9211: }
                   9212:
                   9213: def spgen(MO)
                   9214: {
                   9215:        Eq=(getopt(eq)==1)?1:0;
                   9216:        Sp=getopt(sp);
                   9217:        if(type(Sp)==7) Sp=s2sp(Sp);
                   9218:        St=getopt(str);
                   9219:        LP=getopt(pt);
                   9220:        F=getopt(std);
                   9221:        if(F!=1&&F!=-1) F=0;
                   9222:        if(type(LP)==4){
                   9223:                L0=LP[0]; L1=LP[1];
1.29      takayama 9224:        }else if(type(LP)==1){
                   9225:                L0=L1=LP;
1.6       takayama 9226:        }else{
                   9227:                L0=0; L1=MO+1;
                   9228:        }
1.53      takayama 9229:        if(M0<=0){
1.6       takayama 9230:                MO=-MO;
                   9231:                if(iand(MO,1)==1) return [];
1.53      takayama 9232:                MO=MO/2;
                   9233:                B=spbasic(-2*MO,0|str=1);
                   9234:                if(L1<3) L1=MO+4;
1.6       takayama 9235:                if(St!=1){
                   9236:                        for(R=[]; B!=[]; B=cdr(B)){
1.53      takayama 9237:                                RT= F?s2sp(car(B)|std=F): s2sp(car(B));
1.6       takayama 9238:                                if(length(RT)<L0 || length(RT)>L1) continue;
                   9239:                                R=cons(RT,R);
                   9240:                        }
                   9241:                        return reverse(R);
                   9242:                }else{
                   9243:                        if(L0<=3 && L1>=MO+4) return B;
                   9244:                        for(R=[]; B!=[]; B=cdr(B)){
                   9245:                                RT=s2sp(T=car(B));
                   9246:                                if(length(RT)<L0 || length(RT)>L1) continue;
                   9247:                                if(F) T=s2sp(s2sp(T|std=K));
                   9248:                                R=cons(T,R);
                   9249:                        }
                   9250:                        return reverse(R);
                   9251:                }
                   9252:        }
                   9253:        MP=(L1<MO+1)?L1:MO+1;
                   9254:        LL=newvect(MO+1);
                   9255:        R=newvect(MP+2);
                   9256:        R0=newvect(MP+2);
                   9257:        for(I=1; I<=MO; I++) LL[I]=[];
                   9258:        if(type(Sp)==4){
                   9259:                if(getopt(basic)==1) Sp=chkspt(Sp[6]);
                   9260:                R=chkspt(Sp);
                   9261:                if(R[1]>MO) return 0;
                   9262:                LL[R[1]]=R;
                   9263:                K=R[1];
                   9264:        }
                   9265:        if(K==1||type(Sp)!=4){
                   9266:                LL[1]=[[[1]]];
                   9267:                for(I=2; I<=MO && I<MP;I++){
                   9268:                        for(T=[], J=0; J<I+1; J++)
                   9269:                                T=cons([I-1,1],T);
                   9270:                        LL[I]=cons(T,LL[I]);
                   9271:                }
                   9272:                K=2;
                   9273:        }
                   9274:        for(OD=K; OD<MO; OD++){
                   9275:                for(LT=LL[OD]; LT!=[]; LT=cdr(LT)){
                   9276:                        for(II=0,L=car(LT); L!=[]; II++, L=cdr(L)){
                   9277:                                R0[II]=R[II]=car(L);
                   9278:                        }
                   9279:                        for(; ;){
                   9280:                                for(S=-2*OD, I=0; I<II; I++){
                   9281:                                        S += OD;
                   9282:                                        if(R[I]!=[]) S-=car(R[I]);
                   9283:                                }
                   9284:                                --I;
                   9285:                                for(;S+OD<=MO && I<=MP;S+=OD,I++){
                   9286:                                        if(S<=0) continue;
                   9287:                                        for(J=0;J<=I;J++){
                   9288:                                                if(J>=II){
                   9289:                                                        if(S<OD) break;
                   9290:                                                }else
                   9291:                                                        if(S+((R[J]==[])?0:car(R[J]))<car(R0[J])) break;
                   9292:                                        }
                   9293:                                        if(--J>=I){
                   9294:                                                V=newvect(I);
                   9295:                                                RRR=[];
                   9296:                                                for(;J>=0;J--){
                   9297:                                                        if(J>=II) RR=[OD,S];
                   9298:                                                        else{
                   9299:                                                                K=length(R[J]);
                   9300:                                                                RR=[S+((K==0)?0:car(R[J]))];
                   9301:                                                                K=length(R0[J])-K;
                   9302:                                                                for(RT=R0[J]; RT!=[]; K--,RT=cdr(RT)){
                   9303:                                                                        if(K!=0) RR=cons(car(RT),RR);
                   9304:                                                                }
                   9305:                                                        }
                   9306:                                                        RRR=cons(reverse(RR),RRR);
                   9307:                                                }
                   9308:                                                RRR=qsort(reverse(RRR));
                   9309:                                                if(findin(RRR,LL[S+OD])<0)
                   9310:                                                        LL[S+OD]=cons(RRR,LL[S+OD]);
                   9311:                                        }
                   9312:                                }
                   9313:                                for(K=0; K<II; K++){
                   9314:                                        if(R[K]!=[]){
                   9315:                                                S=car(R[K]);
                   9316:                                                while((R[K]=cdr(R[K]))!=[] && car(R[K])==S);
                   9317:                                                break;
                   9318:                                        }else R[K]=R0[K];
                   9319:                                }
                   9320:                                if(K>=II) break;
                   9321:                        }
                   9322:                }
                   9323:        }
                   9324:        if(L0>0 || L1<MO+1 || St==1 || F){
                   9325:                for(J=1; J<=MO; J++){
                   9326:                        for(RT=[],R=LL[J];R!=[];R=cdr(R)){
                   9327:                                L=length(T=car(R));
                   9328:                                if(L<L0 || L>L1) continue;
                   9329:                                if(F) T=s2sp(T|std=F);
                   9330:                                RT=cons((St==1)?s2sp(T):T,RT);
                   9331:                        }
                   9332:                        LL[J] = reverse(RT);
                   9333:                }
                   9334:        }
                   9335:        if(Eq==1) return LL[MO];
                   9336:        return LL;
                   9337: }
                   9338:
1.53      takayama 9339: def spbasic(Idx,D)
                   9340: {
                   9341: /*
                   9342:   D<=3|Idx|+6,  D<=|Idx|+2 (p>3),  p<=|Idx|/2+4
                   9343:   Idx=2*D^2-(D^2-\sum m_{j,\nu}^2); \sum(D-m_{j,1})>=2*D;
                   9344:   \sum (m_{j,1)-m_{j,\nu})*m_{j,\nu)
                   9345:   0<=(2*D-\sum(D-m_{j,1})})*D=\sum_(m_{j,1}-m_{j,\mu})*m_{j,\nu} -|Idx|
                   9346:   (-2,0)                                    13個 (9+3+?)
                   9347:   (-4,0)                                    37個 (25+9+?)
                   9348:   (-6,0) :  8.5sec  ?sec          0.05sec   69個 (46+17+?)
1.54      takayama 9349:   (-8,0) : 97  sec  1sec          0.13sec  113個 (73+29+?)   <- (-2,0)
                   9350:   (-10,0):          4sec          0.27sec  198個 (127+50+?)
                   9351:  (-12,0)          28sec   4.2sec 0.64sec  291個 (182+76+?)
                   9352:   (-14,0)          27sec  10.2sec 1.31sec  415個 (249+115+?)
                   9353:   (-16,0)                 34.0sec 2.47sec  647個 (395+172+?) <- (-4,0)
                   9354:   (-18,0)                         4.42sec  883個 (521+243+?) <- (-2,0)
                   9355:   (-20,0)                         8.17sec 1186個 (680+345+?)
1.53      takayama 9356: */
                   9357:        Idx=-Idx;
                   9358:        if((Str=getopt(str))!=1) Str=0;
                   9359:        if(!isint(Idx)||!isint(Idx/2)||Idx<0||!isint(D)||D<0||D==1||D>3*Idx+6) return [];
                   9360:        if(D==0){
                   9361:                for(R=[],D=3*Idx+6;D>=2;D--) R=append(spbasic(-Idx,D|str=Str),R);
                   9362:                return R;
                   9363:        }
                   9364:        if(!Idx){
                   9365:                R=0;
                   9366:                if(D==2) R="11,11,11,11";
                   9367:                if(D==3) R="111,111,111";
                   9368:                if(D==4) R="22,1111,1111";
                   9369:                if(D==6) R="33,222,111111";
                   9370:                if(!R) return [];
                   9371:                return [(Str==1)?R:s2sp(R)];
                   9372:        }
                   9373:        if(D>Idx+2){
                   9374:                L=3;
                   9375:                if(D==3*Idx+6){
                   9376:                        R=[[D/2,D/2],[D/3,D/3,D/3],[D/6,D/6,D/6,D/6,D/6,D/6-1,1]];
                   9377:                        return [(Str==1)?s2sp(R):R];
                   9378:                }
                   9379:                if(iand(D,1)&&(D-3)/2>Idx) return [];
                   9380:        }else L=Idx/2+4;
1.54      takayama 9381:        V=newvect(L);SV=newvect(L);
1.53      takayama 9382:        for(S1=[],I=0;I<D;I++) S1=cons(1,S1);
                   9383:        for(T=D-1;T>1;T--){
                   9384:                K=D%T;
                   9385:                if((T-K)*K<=Idx) break;
                   9386:        }
                   9387:        J=(T-K)*K;SJ=K^2+(D-K)*T;
                   9388:        TV=K?[K]:[];
                   9389:        for(I=(D-K)/T;I>0;I--) TV=cons(T,TV);
                   9390:        for(I=0;I<L;I++){
1.54      takayama 9391:                SV[I]=2*D^2-(I+1)*(D^2-J)-Idx;
1.53      takayama 9392:                V[I]=TV;
                   9393:        }
1.54      takayama 9394:        if(SV[2]>0) return [];
1.53      takayama 9395:        if(D>Idx+2 && V[0][0]+V[1][0]>=D && V[1][0]>1){
                   9396:                T=V[1][0]-1;K=D%T;TV=K?[K]:[];
                   9397:                for(I=(D-K)/T;I>0;I--) TV=cons(T,TV);
                   9398:                V[1]=V[2]=TV;
                   9399:        }
                   9400:        for(R=[];;){
                   9401:                if(D>Idx+2){
1.54      takayama 9402:                        if(3*V[0][0]<D) break;
                   9403:                        if(V[0][0]+V[1][0]>=D && (T=D-V[0][0]-1)>0){
1.53      takayama 9404:                                K=D%T;TV=K?[K]:[];
                   9405:                                for(I=(D-K)/T;I>0;I--) TV=cons(T,TV);
                   9406:                                V[1]=V[2]=TV;
                   9407:                        }
                   9408:                        S2=V[0][0]+V[1][0]+V[2][0]-D;
                   9409:                        if(V[0][0]+2*V[1][0]<D ||(S2<0&&V[1][0]==1) ){
                   9410:                                V[0]=V[1]=V[2]=nextpart(V[0]);
                   9411:                                T=V[0][0];
                   9412:                                T=D-2*T;
                   9413:                                if(T==0){
                   9414:                                        V[1]=[D/2-1,1];
                   9415:                                        V[2]=S1;
                   9416:                                }else if(T>0){
                   9417:                                        J=D%T;
1.54      takayama 9418:                                        K=J?[J]:[];
1.53      takayama 9419:                                        for(J=(D-J)/T;J>0;J--) K=cons(T,K);
                   9420:                                        V[2]=K;
                   9421:                                }
                   9422:                                continue;
                   9423:                        }
                   9424:                        if(S2<0||V[2][0]<=S2){
                   9425:                                V[1]=V[2]=nextpart(V[1]);
                   9426:                                continue;
                   9427:                        }else if(S2>0){
                   9428:                                T=V[2][0]-S2;J=D%T;
                   9429:                                K=J?[J]:[];
                   9430:                                for(J=(D-J)/T;J>0;J--) K=cons(T,K);
                   9431:                                V[2]=K;
                   9432:                        }
                   9433:                }
                   9434:                for(S=-2*D,IL=0;IL<L;IL++){
                   9435:                        S+=D-car(V[IL]);
                   9436:                        if(S>=0) break;
                   9437:                }
1.54      takayama 9438:                if((I=IL)==L){  /* reducible i.e. IL=L && S<0 */
1.53      takayama 9439:                        for(LL=L-1;LL>=0;LL--){
                   9440:                                if((K=car(V[LL]))+S>0){
                   9441:                                        K+=S;
                   9442:                                        for(TV=[],TD=D;TD>=K;TD-=K) TV=cons(K,TV);
                   9443:                                        if(TD>0) V[LL]=append(TV,[TD]);
                   9444:                                        else V[LL]=TV;
                   9445:                                        break;
                   9446:                                }else{
                   9447:                                        S+=K-1;
                   9448:                                        V[LL]=S1;
                   9449:                                }
                   9450:                        }
                   9451:                        if(LL<0) break;
                   9452:                        continue;
                   9453:                }
                   9454:                for(S0=K=0;K<=IL;K++){
                   9455:                        ST=car(V[K]);J=V[K][length(V[K])-1];S0+=(ST-J)*J;
                   9456:                        if(S0>Idx) break;
                   9457:                }
                   9458:                if(S0>Idx && car(V[K])!=1){
                   9459:                        ST=car(V[K]);
                   9460:                        S0-=(ST-J)*J;
                   9461:                        for(ST--;ST>0;ST--){
                   9462:                                J=D%ST;
                   9463:                                if(S0+(ST-J)*J <= Idx) break;
                   9464:                        }
                   9465:                        V[K]=J?[J]:[];
                   9466:                        for(J=D-J;J>0;J-=ST) V[K]=cons(ST,V[K]);
                   9467:                        for(J=K+1;J<L;J++) V[J]=V[K];
                   9468:                        continue;
                   9469:                }
                   9470:
                   9471:                for(K=SS=0;K<L&&SS<=Idx;K++){
                   9472:                        ST=car(V[K]);
                   9473:                        for(S0=0,TV=cdr(V[K]);TV!=[];TV=cdr(TV)) S0+=(ST-car(TV))*car(TV);
1.54      takayama 9474:                        SS+=S0;
1.53      takayama 9475:                }
1.54      takayama 9476:                if(SS>Idx && K<=IL && K!=L){
                   9477:                        SS0=Idx-SS+S0;
                   9478:                        for(TV=car(V[K]);TV>1;TV--){
                   9479:                                U=D%TV;
                   9480:                                if((D-U)*U<=SS0) break;
                   9481:                        }
                   9482:                        if(TV==car(V[K])){
                   9483:                                K=K-1;
                   9484:                                V[K]=nextpart(V[K]); /* to be improves */
                   9485:                        }else{
                   9486:                                V[K]=U?[U]:[];  /* to be improved */
                   9487:                                for(J=D-U;J>0;J-=TV) V[K]=cons(TV,V[K]);
                   9488:                        }
1.53      takayama 9489:                        for(J=K+1;J<L;J++) V[J]=V[K];
                   9490:                        continue;
                   9491:                }
                   9492:
                   9493:                for(Ix=2*D^2+Idx,J=0;J<L;J++){
                   9494:                        IxF=Ix;
                   9495:                        for(Ix-=D^2,TV=V[J];TV!=[];TV=cdr(TV)) Ix+=car(TV)^2;
                   9496:                        if(Ix<=0) break;
                   9497:                }
                   9498:                if(Ix==0&&(J>=I||IL==2)){
                   9499:                        for(TR=[],K=J;K>=0;K--) TR=cons(V[K],TR);
                   9500:                        R=cons((Str==1)?s2sp(TR):TR,R);
                   9501:                }
                   9502:                if(J>=0 && J<L && Ix<=0){
                   9503:                        I=V[J][0];K=D%I;S0=(D-K)*I+K^2;
                   9504:                        if(I>1&& IxF-D^2+S0<0){
                   9505:                                for(V[J]=[],K=D-I;K>0;K--) V[J]=cons(1,V[J]);
                   9506:                                V[J]=cons(I,V[J]);
                   9507:                                V[J]=nextpart(V[J]);
                   9508:                                for(I=J+1;I<L;I++) V[I]=V[J];
                   9509:                                continue;
                   9510:                        }
                   9511:                }
                   9512:                if(J>=0 && J<L && Ix<=0 && car(V[J])>(U=V[J][length(V[J])-1])+1){
                   9513:                        TV=reverse(V[J]);
                   9514:                        for(S0=0,K=[];TV!=[];TV=cdr(TV),S0++){
                   9515:                                if((I=car(TV))<U+2||(length(TV)>1&&S0<2)){
                   9516:                                        while(I-->0) K=cons(1,K);
                   9517:                                }else K=cons(car(TV),K);
                   9518:                        }
                   9519:                        V[I=J]=K;
                   9520:                }else{
                   9521:                        if(J>=L) J=L-1;
                   9522:                        for(I=J;I>=0&&length(V[I])==D;I--);
                   9523:                        if(I<0) break;
                   9524:                }
                   9525:                V[I]=nextpart(V[I]);                    /* to be improved */
                   9526:                for(J=I+1;J<L;J++) V[J]=V[I];
                   9527:        }
                   9528:        return R;
                   9529: }
                   9530:
1.6       takayama 9531: def spType2(L)
                   9532: {
                   9533:        C=0;R=[];
                   9534:        for(LT=L;LT!=[];LT=cdr(LT)){
                   9535:                D=-1;LP=car(LT);
                   9536:                for(LPT=LP;LPT!=[];LPT=cdr(LPT)){
                   9537:                        if(D==-1) D=car(LPT);
                   9538:                        else D=igcd(D,car(LPT));
                   9539:                        if(D==1){
                   9540:                                C++;break;
                   9541:                        }
                   9542:                }
                   9543:                if(C==2) return 0;
                   9544:                R=cons(D,R);
                   9545:        }
                   9546:        if(C==0) return L;
                   9547:        if(C==1){
                   9548:                for(K=length(R)-1;R[K]!=1;K--);
                   9549:                D=-1;
                   9550:                for(I=length(R)-1;I>=0;I--){
                   9551:                        if(I==K) continue;
                   9552:                        if(D==-1) D=R[I];
                   9553:                        else D=igcd(D,R[I]);
                   9554:                        if(D==1) return 0;
                   9555:                }
                   9556:        }
                   9557:        return L;
                   9558: }
                   9559:
                   9560:
                   9561: /* ret [#points, order, idx, Fuchs, reduction order, reduction exponents, fund] */
                   9562: def chkspt(M)
                   9563: {
                   9564:        Opt= getopt(opt);
                   9565:        Mat= getopt(mat);
                   9566:        if(type(M)==7) M=s2sp(M);
1.28      takayama 9567:        if(type(Opt) >= 0&&Opt!="idx"){
1.6       takayama 9568:                if(type(Opt) == 7)
                   9569:                        Opt = findin(Opt, ["sp","basic","construct","strip","short","long","sort","root"]);
                   9570:                if(Opt < 0){
                   9571:                        erno(2);
                   9572:                        return 0;
                   9573:                }
                   9574:                return fspt(M,Opt);
                   9575:        }
                   9576:        P  = length(M);
                   9577:        OD = -1;
                   9578:        XM = newvect(P);
                   9579:        Fu = 0;
                   9580:        for( I = SM = SSM = 0; I < P; I++ ){
                   9581:                LJ = length(M[I]);
                   9582:                JM = JMV = 0;
                   9583:                for(J = SM = 0; J < LJ; J++){
                   9584:                        MV = M[I][J];
                   9585:                        if(type(MV) == 4){
                   9586:                                Fu += MV[0]*MV[1];
                   9587:                                MV = MV[0];
                   9588:                        }
                   9589:                        if(MV > JMV){
                   9590:                                JM = J; JMV = MV;
                   9591:                        }
                   9592:                        SM  += MV;
                   9593:                        SSM += MV^2;
                   9594:                }
                   9595:                if(OD < 0)
                   9596:                        OD = SM;
                   9597:                else if(OD != SM){
1.28      takayama 9598:                        if(getopt(dumb)!=1) print("irregal partitions");
                   9599:                        return -1;
1.6       takayama 9600:                }
                   9601:                XM[I] = JM;
                   9602:        }
                   9603:        SSM -= (P-2)*OD^2;
                   9604:        for(I = SM = JM = 0; I < P; I++){
                   9605:                MV = M[I][XM[I]];
                   9606:                if(type(MV) == 4){
                   9607:                        MV = MV[0]; JM = 1;
                   9608:                }
                   9609:                if(I == 0)
                   9610:                 SMM = MV;
                   9611:                else if(SMM > MV)
                   9612:                 SMM = MV;
                   9613:                SM += MV;
                   9614:        }
                   9615:        SM -= (P-2)*OD;
1.28      takayama 9616:        if(Opt=="idx") return SSM;
1.6       takayama 9617:        if(SM > SMM && SM != 2*OD){
1.28      takayama 9618:                if(getopt(dumb)!=1) print("not realizable");
                   9619:                return 0;
1.6       takayama 9620:        }
                   9621:        if(JM==1 && Mat!=1)
                   9622:                Fu -= OD - SSM/2;
1.28      takayama 9623:        return [P, OD, SSM, Fu, SM, XM, fspt(M,1)];
1.6       takayama 9624: }
                   9625:
                   9626: def cterm(P)
                   9627: {
                   9628:        V = getopt(var);
                   9629:        if(type(V) != 4)
                   9630:                V=vars(P);
                   9631:        for(; V !=[]; V = cdr(V))
                   9632:                P = mycoef(P,0,car(V));
                   9633:        return P;
                   9634: }
                   9635:
                   9636: def terms(P,L)
                   9637: {
                   9638:        Lv=getopt(level);
                   9639:        if(type(Lv)!=1) Lv=0;
                   9640:        V=car(L);L=cdr(L);
                   9641:        for(R=[],D=mydeg(P,V);D>=0; D--){
                   9642:                if((Q=mycoef(P,D,V))==0) continue;
                   9643:                if(L!=[]){
                   9644:                        R0=terms(Q,L|level=Lv+1);
                   9645:                        for(;R0!=[];R0=cdr(R0)) R=cons(cons(D,car(R0)),R);
                   9646:                }else R=cons([D],R);
                   9647:        }
                   9648:        if(Lv>0) return R;
                   9649:        R=qsort(R);
                   9650:        Rev = getopt(rev); Dic=getopt(dic);
                   9651:        if(Dic==1 && Rev==1) R=reverse(R);
                   9652:        for(R0=[];R!=[];R=cdr(R)){
                   9653:                for(RT=car(R),S=0;RT!=[];RT=cdr(RT))    S+=car(RT);
                   9654:                R0=cons(cons(S,car(R)),R0);
                   9655:        }
                   9656:        if(Dic==1) return R0;
                   9657:        if(Rev==1){
                   9658:                for(R=[];R0!=[];R0=cdr(R0)){
                   9659:                        T=car(R0);
                   9660:                        R=cons(cons(-car(T),cdr(T)),R);
                   9661:                }
                   9662:                R0=R;
                   9663:        }
                   9664:        R0=qsort(R0);
                   9665:        if(Rev==1){
                   9666:                for(R=[];R0!=[];R0=cdr(R0)){
                   9667:                        T=car(R0);
                   9668:                        R=cons(cons(-car(T),cdr(T)),R);
                   9669:                }
                   9670:                R0=R;
                   9671:        }
                   9672:        return (Rev==1)?R0:reverse(R0);
                   9673: }
                   9674:
                   9675: def polcut(P,N,L)
                   9676: {
                   9677:        if(type(L)==2) L=[L];
                   9678:        M=getopt(top);
                   9679:        if(type(M)!=1) M=0;
                   9680:        T=terms(P,L);
                   9681:        for(S=0;T!=[];T=cdr(T)){
                   9682:                LT=car(T);
                   9683:                if(LT[0]<M || LT[0]>N) continue;
                   9684:                for(PW=1,LT=cdr(LT),V=L,Q=P;LT!=[];LT=cdr(LT),V=cdr(V)){
                   9685:                        Q=mycoef(Q,car(LT),car(V));PW*=car(V)^car(LT);
                   9686:                }
                   9687:                S+=Q*PW;
                   9688:        }
                   9689:        return S;
                   9690: }
                   9691:
                   9692: def redgrs(M)
                   9693: {
                   9694:        Mat = getopt(mat);
                   9695:        if(Mat!=1) Mat=0;
                   9696:        R = chkspt(M|mat=Mat);
                   9697:        if(type(R) < 4)
                   9698:                return -1;
                   9699:        if(R[4] <= 0)
                   9700:                return 1-R[4];
                   9701:        if(R[4] == 2*R[1])
                   9702:                return 0;
                   9703:        V = newvect(R[0]);
                   9704:        Type = type(M[0][0]);
                   9705:        if(Type > 3){
                   9706:                Mu = Mat-1;
                   9707:                for(I = 0; I < R[0]; I++)
                   9708:                        Mu += M[I][R[5][I]][1];
                   9709:        }
                   9710:        for(I = 0; I < R[0]; I++){
                   9711:                IR = R[5][I]; L = []; MI = M[I]; MIE=MI[IR];
                   9712:                for(J = length(MI)-1; J >= 0; J--){
                   9713:                        if(Type <= 3){
                   9714:                                VM = MI[J];
                   9715:                                if(J == IR){
                   9716:                                        VM -= R[4];
                   9717:                                        if(VM < 0) return -1;
                   9718:                                }
                   9719:                                L = cons(VM, L);
                   9720:                        }else{
                   9721:                                VM = MI[J][0];
                   9722:                                if(J == IR){
                   9723:                                        VM -= R[4];
                   9724:                                        if(VM < 0)
                   9725:                                                return -1;
                   9726:                                        if(I == 0)
                   9727:                                                EV = 1-Mat-Mu;
                   9728:                                        else
                   9729:                                                EV = 0;
                   9730:                                }else{
                   9731:                                        if(I == 0)
                   9732:                                                EV = MI[J][1] - M[0][R[5][0]][1] + 1-Mat; /* + MX - Mu; */
                   9733:                                        else
                   9734:                                                EV = MI[J][1] - MIE[1] + Mu;
                   9735:                                }
                   9736:                                L = cons([VM,EV], L);
                   9737: /*
1.24      takayama 9738:                                if(R[2] >= 2){ */ /* rigid */
1.6       takayama 9739: /*          P = dx^(R[1]);
                   9740:                                } */
                   9741:                        }
                   9742:                }
                   9743:                V[I] = L;
                   9744:        }
                   9745:        return [R[5], vtol(V)];
                   9746: }
                   9747:
                   9748: def cutgrs(A)
                   9749: {
                   9750:        for(AL=[] ; A!=[]; A=cdr(A)){    /* AT: level 2 */
                   9751:                for(ALT=[], AT=car(A); AT!=[]; AT=cdr(AT)){
                   9752:                        M = (type(car(AT)) < 4)?car(AT):car(AT)[0];
                   9753:                        if(M > 0)
                   9754:                                ALT = cons(car(AT), ALT);  /* ALT: level 2 */
                   9755:                }
                   9756:                AL = cons(reverse(ALT), AL);   /* AL: level 3 */
                   9757:        }
                   9758:        return reverse(AL);
                   9759: }
                   9760:
                   9761: def mcgrs(G, R)
                   9762: {
                   9763:        NP = length(G);
                   9764:        Mat = (getopt(mat)==1)?0:1;
1.36      takayama 9765:        if(Mat==0 && type(SM=getopt(slm))==4){
1.24      takayama 9766:                SM0=SM[0];SM1=anal2sp(SM[1],["*",-1]);
                   9767:                if(findin(0,SM0)>=0){
                   9768:                        for(SM=[],I=length(G)-1;I>0;I--)
                   9769:                                if(findin(I,SM0)<0) SM=cons(I,SM);
                   9770:                        SM=[SM,SM1];
1.36      takayama 9771:                        G=mcgrs(G,R|mat=1,slm=SM);
1.24      takayama 9772:                        return [G[0],anal2sp(G[1],["*",-1])];
                   9773:                }
                   9774:        }else SM0=0;
1.6       takayama 9775:        for(R = reverse(R) ; R != []; R = cdr(R)){
                   9776:                GN = [];
                   9777:                L = length(G)-1;
                   9778:                RT = car(R);
                   9779:                if(type(RT) == 4){
1.37      takayama 9780:                        if(length(RT)==L+1&&RT[0]!=0){
                   9781:                                R=cons(cdr(RT),cdr(R));
1.24      takayama 9782:                                R=cons(RT[0],R);
1.37      takayama 9783:                                R=cons(0,R);
1.24      takayama 9784:                                continue;
                   9785:                        }               /* addition */
                   9786:                        RT = reverse(RT); S = ADS = 0;
1.37      takayama 9787:                        for(G = reverse(G); G != []; G = cdr(G), L--, RT=cdr(RT)){
                   9788:                                AD = car(RT);
1.24      takayama 9789:                                if(L > 0){
1.6       takayama 9790:                                        S += AD;
1.24      takayama 9791:                                        if(SM && findin(L,SM0)>=0) ADS+=AD;
                   9792:                                }else
1.6       takayama 9793:                                        AD = -S;
                   9794:                                for(GTN = [], GT = reverse(car(G)); GT != []; GT = cdr(GT))
                   9795:                                        GTN = cons([car(GT)[0],car(GT)[1]+AD], GTN);
                   9796:                                GN = cons(GTN, GN);
                   9797:                        }
                   9798:                        G = GN;
1.24      takayama 9799:                        if(SM0){
                   9800:                                for(ST=reverse(SM1),SM1=[]; ST!=[]; ST=cdr(ST))
                   9801:                                        SM1 = cons([car(ST)[0],car(ST)[1]+ADS], SM1);
                   9802:                        }
1.6       takayama 9803:                        continue;
                   9804:                }
1.24      takayama 9805:                if(RT==0) continue;
                   9806:                VP = newvect(L+1); GV = ltov(G);        /* middle convolution */
1.6       takayama 9807:                for(I = S = OD = 0; I <= L; I++){
                   9808:                        RTT = (I==0)?(Mat-RT):0;
                   9809:                        VP[I] = -1;
1.24      takayama 9810:                        for(J = M = K = 0, GT = GV[I]; GT != []; GT = cdr(GT), J++){
1.6       takayama 9811:                                if(I == 0)
                   9812:                                        OD += car(GT)[0];
                   9813:                                if(car(GT)[1] == RTT && car(GT)[0] > M){
                   9814:                                        S += car(GT)[0]-M;
1.36      takayama 9815:                                        M=car(GT)[0];
1.6       takayama 9816:                                        VP[I] = J;
                   9817:                                }
                   9818:                        }
1.24      takayama 9819:                }
                   9820:                S -= (L-1)*OD;
                   9821:                for(GN = []; L >= 0; L--){
                   9822:                        GT = GV[L];
                   9823:                        RTT = (L==0)?(-RT):RT;
1.38      takayama 9824:                        GTN = (VP[L]>=0 || S == 0)?[]:[[-S,(L==0)?(Mat-RT):0]];
1.24      takayama 9825:                        for(J = 0; GT != []; GT = cdr(GT), J++){
                   9826:                                if(J != VP[L]){
                   9827:                                        GTN = cons([car(GT)[0],car(GT)[1]+RTT], GTN);
                   9828:                                        continue;
1.6       takayama 9829:                                }
1.24      takayama 9830:                                K = car(GT)[0] - S;
                   9831:                                if(K < 0){
                   9832:                                        print("Not realizable");
                   9833:                                        return;
                   9834:                                }
1.38      takayama 9835:                                if(K>0) GTN = cons([K,(L==0)?(Mat-RT):0], GTN);
1.24      takayama 9836:                        }
                   9837:                        GN = cons(reverse(GTN), GN);
                   9838:                }
1.36      takayama 9839:                if(SM0&&RT!=0){
                   9840:                        for(M0=M1=-OD,L=length(G)-1;L>=0;L--){
                   9841:                                if(findin(L,SM0)>=0){
                   9842:                                        M0+=OD;
                   9843:                                        if(VP[L]>=0) M0-=GV[L][VP[L]][0];
                   9844:                                }else{
                   9845:                                         M1+=OD;
                   9846:                                        if(VP[L]>=0) M1-=GV[L][VP[L]][0];
                   9847:                                }
                   9848:                        }
                   9849:                        SM2=[];
                   9850:                        if((Mx1=anal2sp(SM1,["max",1,-RT])[0])<0){
                   9851:                                if(M1>0) SM2=cons([M1,0],SM2);
1.38      takayama 9852:                        }else M1+=car(SM1[Mx1]);
1.36      takayama 9853:                        if((Mx0=anal2sp(SM1,["max",1,0])[0])<0){
                   9854:                                if(M0>0) SM2=cons([M0,RT],SM2);
1.38      takayama 9855:                        }else M0+=car(SM1[Mx0]);
1.36      takayama 9856:                        for(J=0;SM1!=[];J++,SM1=cdr(SM1)){
                   9857:                                if(J==Mx0){
                   9858:                                        if(M0>0) SM2=cons([M0,-RT],SM2);
                   9859:                                }else if(J==Mx1){
                   9860:                                        if(M1>0) SM2=cons([M1,0],SM2);
                   9861:                                }else SM2=cons([car(SM1)[0],car(SM1)[1]+RT],SM2);
1.6       takayama 9862:                        }
1.36      takayama 9863:                        SM1=reverse(SM2);
1.6       takayama 9864:                }
                   9865:                G = cutgrs(GN);
                   9866:        }
1.36      takayama 9867:        return SM0?[G,SM1]:G;
1.6       takayama 9868: }
                   9869:
1.38      takayama 9870: def spslm(M,TT)
                   9871: {
                   9872:        R=getbygrs(M,1|mat=1);
                   9873:        if(type(R)!=4||type(R[0])!=4||type(S=R[0][1])!=4){
                   9874:                errno(0);return0;
                   9875:        }
                   9876:        if(S[1]!=[[1,0]]){
                   9877:                print("Not rigid!");return0;
                   9878:        }
                   9879:        if((F=S[0][0][1])!=0){
                   9880:                for(V=vars(F);V!=[];V=cdr(V)){
                   9881:                        if(mydeg(F,car(V))==1){
                   9882:                                T=lsol(F,car(V));
                   9883:                                break;
                   9884:                        }
                   9885:                }
                   9886:                if(V==[]){
                   9887:                        print("Violate Fuchs condition!");
                   9888:                        return0;
                   9889:                }
                   9890:        }
                   9891:        for(P=[];R!=[];R=cdr(R))
                   9892:                P=cons(car(R)[0],P);
                   9893:        if(F!=0){
                   9894:                S=mysubst(S,[car(V),T]);P=mysubst(P,[car(V),T]);
                   9895:        }
                   9896:        return mcgrs(S,P|mat=1,slm=[TT,[[1,0]]]);
                   9897: }
                   9898:
1.6       takayama 9899: /*
                   9900:   F=0 : unify
                   9901:   F=["add",S] :
                   9902:   F=["sub",S] :
                   9903:   F=["+",A,B] :
                   9904:   F=["*",A,B] :
                   9905:   F=["mul",K];
                   9906:   F=["get",F,V] :
                   9907:   F=["put",F,V] :
                   9908:   F=["get1",F,V] :
                   9909:   F=["put1",F,V] :
1.24      takayama 9910:   F=["max"] :
                   9911:   F=["max",F.V] :
1.6       takayama 9912:   F=["put1"] :
                   9913:   F=["val",F];
                   9914:   F=["swap"];
                   9915:  */
                   9916: def anal2sp(R,F)
                   9917: {
                   9918:        if(type(F)==4&&type(F[0])==4){ /* multiple commands */
                   9919:                for(;F!=[];F=cdr(F)) R=anal2sp(R,car(F));
                   9920:                return R;
                   9921:        }
                   9922:        if(type(F)==7) F=[F];
                   9923:        if(F==0){               /* unify */
                   9924:                R=ltov(R);
                   9925:                L=length(R);
                   9926:                for(J=1;J<L;J++){
                   9927:                        for(I=0;I<J;I++){
                   9928:                                if(cdr(R[I])==cdr(R[J])){
                   9929:                                        R[I]=cons(R[I][0]+R[J][0],cdr(R[I]));
                   9930:                                        R[J]=cons(0,cdr(R[J]));
                   9931:                                        break;
                   9932:                                }
                   9933:                        }
                   9934:                }
                   9935:                for(G=[],I=L-1;I>=0;I--)
                   9936:                        if(R[I][0]!=0) G=cons(R[I],G);
                   9937:                if(length(G[0])==2){    /* sort by multiplicity */
                   9938:                        R=ltov(G);
                   9939:                        L=length(R);
                   9940:                        for(I=1;I<L;I++){
                   9941:                                for(J=I;J>0;J--){
                   9942:                                        if(R[J-1][0]>R[J][0]) break;
                   9943:                                        if(R[J-1][0]==R[J][0]){
                   9944:                                                S1=rtostr(R[J-1][1]);S2=rtostr(R[J][1]);
                   9945:                                                if((K=str_len(S1)-str_len(S2))<0) break;
                   9946:                                                if(!K&&S1<S2) break;
                   9947:                                        }
                   9948:                                        S=R[J-1];R[J-1]=R[J];R[J]=S;
                   9949:                                }
                   9950:                        }
                   9951:                        G=vtol(R);
                   9952:                }
                   9953:                return G;
                   9954:        }
                   9955:        if(F[0]=="add") return append(R,F[1]);
1.24      takayama 9956:        if(F[0]=="max"){
                   9957:                if(length(F)==3) C=1;
                   9958:                else C=0;
                   9959:                M=-10^10;K=[-1];
                   9960:                for(I=0;R!=[];R=cdr(R),I++){
                   9961:                        if(C>0&&car(R)[F[1]]!=F[2]) continue;
                   9962:                        if(M<car(R)[0]){
                   9963:                                M=car(R)[0];K=[I,car(R)];
                   9964:                        }
                   9965:                }
                   9966:                return K;
                   9967:        }
1.6       takayama 9968:        R=reverse(R);
                   9969:        if(F[0]=="sub"){
                   9970:                for(S=F[1];S!=[];S=cdr(S))
                   9971:                        R=cons(cons(-car(S)[0],cdr(car(S))),R);
                   9972:                return reverse(R);
                   9973:        }
                   9974:        if(F[0]=="swap"){
                   9975:                for(G=[];R!=[];R=cdr(R))
                   9976:                        G=cons([car(R)[0],car(R)[2],car(R)[1]],G);
                   9977:                return G;
                   9978:        }
                   9979:        if(F[0]=="+"){
1.24      takayama 9980:                L=length(F);
                   9981:                for(G=[];R!=[];R=cdr(R)){
                   9982:                        for(S=[],I=L-1;I>0;I--) S=cons(car(R)[I]+F[I],S);
                   9983:                        G=cons(cons(car(R)[0],S),G);
                   9984:                }
1.6       takayama 9985:                return G;
                   9986:        }
                   9987:        if(F[0]=="*"){
1.24      takayama 9988:                L=length(F);
                   9989:                for(G=[];R!=[];R=cdr(R)){
                   9990:                        for(S=0,I=1;I<L;I++) S+=car(R)[I]*F[I];
                   9991:                        G=cons([car(R)[0],S],G);
                   9992:                }
1.6       takayama 9993:                return G;
                   9994:        }
                   9995:        if(F[0]=="mult"){
                   9996:                K=F[1];
                   9997:                for(G=[];R!=[];R=cdr(R)) G=cons(cons(K*car(R)[0],cdr(car(R))),G);
                   9998:                return G;
                   9999:        }
                   10000:        if(F[0]=="get"){
                   10001:                for(G=[];R!=[];R=cdr(R))
                   10002:                        if(car(R)[F[1]]==F[2])  G=cons(car(R),G);
                   10003:                return G;
                   10004:        }
                   10005:        if(F[0]=="put"){
                   10006:                if(F[1]==1){
                   10007:                        for(G=[];R!=[];R=cdr(R)) G=cons([car(R)[0],F[2],car(R)[2]],G);
                   10008:                }else{
                   10009:                        for(G=[];R!=[];R=cdr(R)) G=cons([car(R)[0],car(R)[1],F[2]],G);
                   10010:                }
                   10011:                return G;
                   10012:        }
                   10013:        if(F[0]=="get1"){
                   10014:                if(length(F)==2){
                   10015:                        for(G=[];R!=[];R=cdr(R)) G=cons([R[0][0],car(R)[F[1]]],G);
                   10016:                        return G;
                   10017:                }
                   10018:                for(G=[];R!=[];R=cdr(R))
                   10019:                        if(car(R)[F[1]]==F[2])  G=cons([R[0][0],car(R)[3-F[1]]],G);
                   10020:                return G;
                   10021:        }
                   10022:        if(F[0]=="put1"){
                   10023:                if(length(F)==1)
                   10024:                        for(G=[];R!=[];R=cdr(R)) G=cons([car(R)[0],car(R)[1],car(R)[1]],G);
                   10025:                else if(F[1]==1)
                   10026:                        for(G=[];R!=[];R=cdr(R)) G=cons([car(R)[0],F[2],car(R)[1]],G);
                   10027:                else{
                   10028:                        for(G=[];R!=[];R=cdr(R)) G=cons([car(R)[0],car(R)[1],F[2]],G);
                   10029:                }
                   10030:                return G;
                   10031:        }
                   10032:        if(F[0]=="val"){
                   10033:                V=(length(F)==1)?1:F[1];
                   10034:                for(I=J=0;R!=[];R=cdr(R)){
                   10035:                        I+=car(R)[0];
                   10036:                        J+=car(R)[0]*car(R)[V];
                   10037:                }
                   10038:                return [I,J];
                   10039:        }
                   10040:        return 0;
                   10041: }
                   10042:
                   10043: /*
                   10044:  G=0          get trivial common spct
                   10045:  G="..,..,"   spectre type of 4 singular points
                   10046:  P=["get"]    all spct
                   10047:  P=["get",L]
                   10048:     L=n        for variable x_n
                   10049:     L=[m,n]    for residue [m,n]
1.23      takayama 10050:     L=[m,n,l]  for residue [m,n,l]
1.6       takayama 10051:     L=[[m,n],[m',n']] for common spct
1.23      takayama 10052:  P=["eigen",I]   decomposition of A_I
1.6       takayama 10053:  P=["get0",[m,n],[m',n']] for the sum of residues
1.23      takayama 10054:  P=["rest",[m,n]] restriction
1.6       takayama 10055:  P=["swap",[m,n]] for symmetry
                   10056:  P=["perm",[...]] for symmetry
                   10057:  P=["deg"]
                   10058:  P=["homog"]
                   10059:  P=["sort"]
                   10060:  P=[[[m,n],c],...] for addition
                   10061:  P=[c] or [[c],...] for middle convolution wrt 0
                   10062:  P=[m,c] or [[m,c],...] for general middle convolution
                   10063:  P=[[a,b,c]] for special additions
                   10064:  P=[[d,a,b,c]] for middle convotution and additions
                   10065:  P=["multi",...] multiple commands
                   10066:  P=0,1,3 : return sim. spectre of 4 singular points
                   10067: */
                   10068: def mc2grs(G,P)
                   10069: {
                   10070:        if(G==0){
                   10071:                G=[];
                   10072:                for(I=4;I>=0;I--){
                   10073:                        V=lsort([0,1,2,3,4],[I],1);
                   10074:                        for(J=1;J<4;J++){
                   10075:                                for(T=[],K=3;K>0;K--)
                   10076:                                        if(K!=J) T=cons(V[K],T);
                   10077:                                G=cons([[[V[0],V[J]],T],[1,0,0]],G);
                   10078:                        }
                   10079:                }
                   10080:                G=mc2grs(G,"sort");
                   10081:        }else if(type(G)==7||(type(G)==4&&length(G)==4)){
                   10082:                if(type(G)==7) G=s2sp(G);
                   10083:                F=(getopt(top)==0)?1:0;
                   10084:                K=[];
                   10085:                if(type(P)==1&&iand(P,1)&&type(G[0][0])<4){
                   10086:                        G=s2sp(G|std=1);
                   10087:                        if(F) G=[G[1],G[2],G[3],G[0]];
                   10088:                        G=sp2grs(G,[d,c,b,a],[1,length(G[0]),-1]|mat=1);
                   10089:                        G=reverse(G);
                   10090:                        if(iand(P,3)==3){
                   10091:                                V=vars(G);
                   10092:                                for(H=L=[a,b,c,d];H!=[];H=cdr(H))
                   10093:                                        if(findin(car(H),V)>=0) G=subst(G,car(H),makev([car(H),1]));
                   10094:                                G=shortv(G,[a,b,c,d]);
                   10095:                                V=vars(G);
                   10096:                                for(H=G[3];H!=[];H=cdr(H)){
                   10097:                                        T=car(H)[1];
                   10098:                                        if(type(T)>1&&!isvar(T)){
                   10099:                                                K=[car(H)[0],T];
                   10100:                                                break;
                   10101:                                        }
                   10102:                                }
                   10103:                        }
                   10104:                        F=1;
                   10105:                }
                   10106:                if(F) G=[G[3],G[0],G[1],G[2]];
                   10107:                S=cons(["anal",1],getopt());
                   10108:                if(!(R=m2mc(G,0|option_list=S))) return R;
                   10109:                for(G=0,R=cdr(R);R!=[];R=cdr(R)){
                   10110:                        TR=car(R)[0];
                   10111:                        if(TR[0]) G=mc2grs(G,[[TR[0]]]);
                   10112:                        G=mc2grs(G,[cdr(TR)]);
                   10113:                }
                   10114:                if(type(P)==1&&K!=[]){
                   10115:                        for(T=10;T<36;T++){
                   10116:                                if(findin(X=makev([T]),V)>=0) continue;
                   10117:                                F=K[0]*(X-K[1]);
                   10118:                                return [F,simplify(G,[F],4)];
                   10119:                        }
                   10120:                }
                   10121:        }
                   10122:        if(type(P)<2) return G;
                   10123:        F=0;
1.25      takayama 10124:        if(type(P)==7||(type(P)==4&&
                   10125:                (type(P[0])<4||(type(P[0])==4&&length(P[0])==2&&type(P[0][0])<4&&type(P[1])<4))
                   10126:          )) P=[P];
1.6       takayama 10127:        if((Dvi=getopt(dviout))!=1&&Dvi!=2&&Dvi!=-1) Dvi=0;
                   10128:        Keep=(Dvi==2)?1:0;
                   10129:        if(type(P)==4&&type(F=car(P))==7){
                   10130:                if(F=="mult"){
                   10131:                        for(P=cdr(P);P!=[];P=cdr(P)) G=mc2grs(G,car(P)|option_list=getopt());
                   10132:                        return G;
                   10133:                }
                   10134:                if(F=="show"){
                   10135:                        for(R=str_tb(0,0);G!=[];){
                   10136:                                L=car(G);
                   10137:                                I=L[0][0];J=L[0][1];
                   10138:                                str_tb("[A_{"+rtostr(I[0])+rtostr(I[1])+"}:A_{"+rtostr(J[0])+rtostr(J[1])
                   10139:                                        +"}]&=\\left\\{",R);
                   10140:                                for(L=cdr(L);;){
                   10141:                                        S=car(L);
                   10142:                                        str_tb("["+my_tex_form(S[1])+":"+my_tex_form(S[2])+"]",R);
                   10143:                                        if(S[0]!=1) str_tb("_{"+rtostr(S[0])+"}",R);
                   10144:                                        if((L=cdr(L))==[]) break;
                   10145:                                        str_tb(",\\,",R);
                   10146:                                }
                   10147:                                str_tb("\\right\\}",R);
                   10148:                                if((G=cdr(G))==[]) break;
                   10149:                                str_tb(",\\\\\n",R);
                   10150:                        }
                   10151:                        R=texbegin("align*",str_tb(0,R));
                   10152:                        if(Dvi!=-1) dviout(R|keep=Keep);
                   10153:                        return R;
                   10154:                }
                   10155:                if(F=="show0"){
1.26      takayama 10156:                        if(type(Fig=getopt(fig))>0){
                   10157:                                PP=[[-1.24747,-5.86889],[1.24747,-5.86889],[3.52671,-4.8541],[5.19615,-3],
                   10158:                                  [5.96713,-0.627171],[5.70634,1.8541],[4.45887,4.01478],[2.44042,5.48127],
                   10159:                                  [0,6],[-2.44042,5.48127],[-4.45887,4.01478],[-5.70634,1.8541],
                   10160:                                  [-5.96713,-0.627171],[-5.19615,-3],[-3.52671,-4.8541]];
                   10161:                                PL=[[1.8,-5.2],[5.7,-1.7],[3.2,5],[-3.6,4.7],[2.2,3],[-2.8,2.8],
                   10162:                                  [-1.5,-1.4],[-3.2,-2.5],[0.76,-1.4],[-2,0.2]];
                   10163:                                PC=["black,dashed","green,dashed","red,dashed","blue,dashed",
                   10164:                                        "black","cyan","green","blue","red","magenta"];
                   10165:                                N=["1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"];
                   10166:                                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],
                   10167:                                  [2,9,14],[3,6,13]];
                   10168:                                TB=str_tb("\\draw\n",TB);
                   10169:                                if(type(Fig)==4){
                   10170:                                        if(type(car(Fig))==1){
                   10171:                                                PP=ptaffine(car(Fig)/12,PP);PL=ptaffine(car(Fig)/12,PL);
                   10172:                                                Fig=cdr(Fig);
                   10173:                                        }
                   10174:                                        if(Fig!=[]&&length(Fig)==10) PC=Fig;
                   10175:                                }
                   10176:                                for(R=mc2grs(G,"show0"|dviout=-1),I=0;R!="";I++){       /* 頂点 */
                   10177:                                        J=str_chr(R,0,",");
                   10178:                                        if(J>0){
                   10179:                                                S=str_cut(R,0,J-1);
                   10180:                                                R=str_cut(R,J+1,1000);
                   10181:                                        }else{
                   10182:                                                S=R;R="";
                   10183:                                        }
                   10184:                                        T=(str_chr(S,0,"1")==0)?"":"[red]";
                   10185:                                        str_tb(["node",T,"(",N[I],") at ",xypos(PP[I]),"{$",S,"$}\n"],TB);
                   10186:                                }
                   10187:                                for(S=PC,P=PL,I=0;I<4;I++){
                   10188:                                        for(J=I+1;J<5;J++,S=cdr(S),P=cdr(P)){                   /* 線の番号 */
                   10189:                                                SS=car(S);
                   10190:                                                if((K=str_chr(SS,0,","))>0) SS=sub_str(SS,0,K-1);
                   10191:                                                str_tb(["node[",SS,"] at ",xypos(car(P)),
                   10192:                                                        "{$[",rtostr(I),rtostr(J),"]$}\n"],TB);
                   10193:                                        }
                   10194:                                }
                   10195:                                str_tb(";\n",TB);
                   10196:                                for(I=0;I<10;I++){              /* 線 */
                   10197:                                        S=car(PC);P0=car(PC);L0=car(LL);PC=cdr(PC);LL=cdr(LL);
                   10198:                                        C=[N[L0[0]-1],N[L0[1]-1],N[L0[2]-1]];
                   10199:                                        str_tb(["\\draw[",S,"] (", C[0],")--(",C[1],") (",
                   10200:                                                C[0],")--(",C[2],") (",C[1],")--(",C[2],");\n"],TB);
                   10201:                                }
                   10202:                                R=str_tb(0,TB);
                   10203:                                if(TikZ==1&&Dvi!=-1) dviout(xyproc(R)|dviout=1,keep=Keep);
                   10204:                                return R;
                   10205:                        }
1.6       takayama 10206:                        for(S="",L=[];G!=[];G=cdr(G)){
                   10207:                                for(TL=[],TG=cdr(car(G));TG!=[];TG=cdr(TG)) TL=cons(car(TG)[0],TL);
                   10208:                                TL=msort(TL,[-1,0]);
                   10209:                                if(Dvi){
                   10210:                                        if(S!="") S=S+",";
                   10211:                                        for(I=J=0,T=append(TL,[[0]]);T!=[];T=cdr(T)){
                   10212:                                                if(car(T)==I) J++;
                   10213:                                                else{
                   10214:                                                        if(I>0&&J>0){
                   10215:                                                                if(I>9) S=S+"("+rtostr(I)+")";
                   10216:                                                                else S=S+rtostr(I);
                   10217:                                                                if(J>1){
                   10218:                                                                        if(J>9) S=S+"^{"+rtostr(J)+"}";
                   10219:                                                                        else S=S+"^"+rtostr(J);
                   10220:                                                                }
                   10221:                                                        }
                   10222:                                                        I=car(T);J=1;
                   10223:                                                }
                   10224:                                        }
                   10225:                                }
                   10226:                                L=cons(TL,L);
                   10227:                        }
                   10228:                        if(Dvi){
1.43      takayama 10229:                                if(Dvi!=-1) dviout(S|eq=0);
1.6       takayama 10230:                                return S;
                   10231:                        }
                   10232:                        return reverse(L);
                   10233:                }
                   10234:                if(F=="sort"){
                   10235:                        G=ltov(G);L=length(G);
                   10236:                        for(I=0;I<L;I++){
                   10237:                                S=G[I][0];
                   10238:                                if(S[0][0]>S[0][1]) S=[[S[0][1],S[0][0]],S[1]];
                   10239:                                if(S[1][0]>S[1][1]) S=[S[0],[S[1][1],S[1][0]]];
                   10240:                                if(S[0]>S[1]){
                   10241:                                        F=0;S=[S[1],S[0]];
                   10242:                                }
                   10243:                                if(S!=G[I][0]){
                   10244:                                        if(F==0) G[I]=cons(S,anal2sp(cdr(G[I]),"swap"));
                   10245:                                        else G[I]=cons(S,cdr(G[I]));
                   10246:                                }
                   10247:                                for(J=I;J>0;J--){
                   10248:                                        if(G[J-1][0]<G[J][0]) break;
                   10249:                                        S=G[J-1];G[J-1]=G[J];G[J]=S;
                   10250:                                }
                   10251:                        }
                   10252:                        return vtol(G);
                   10253:                }
                   10254:                if(F=="get"||F=="get0"){
                   10255:                        if(Dvi!=0) F="get";
                   10256:                        if(length(P)==1||type(P[1])<2){
                   10257:                                L=[];
                   10258:                                if(length(P)==1){
                   10259:                                        for(I=3;I>=0;I--){
                   10260:                                                for(J=4;J>I;J--) L=cons(mc2grs(G,[F,[I,J]]),L);
                   10261:                                        }
                   10262:                                }else{
                   10263:                                        for(I=P[1],J=4;J>=0;J--){
                   10264:                                                if(I==J) continue;
                   10265:                                                L=cons(mc2grs(G,[F,(I<J)?[I,J]:[J,I]]),L);
                   10266:                                        }
                   10267:                                }
                   10268:                                if(Dvi){
                   10269:                                        if(length(L)==10){
                   10270:                                                R=ltov(L);
                   10271:                                                if(R[6][0]==[1,4]){
                   10272:                                                        S=R[6];R[6]=R[7];R[7]=S;
                   10273:                                                        L=vtol(R);
                   10274:                                                }
                   10275:                                        }
                   10276:                                        for(R=S=[],L=reverse(L);L!=[];L=cdr(L)){
                   10277:                                                T=car(L);
                   10278:                                                R=cons(cdr(T),R);
                   10279:                                                if(S==[]) S="A_{"+rtostr(T[0][0])+rtostr(T[0][1])+"}\\\\\n";
                   10280:                                                else S="A_{"+rtostr(T[0][0])+rtostr(T[0][1])+"}&"+S;
                   10281:                                        }
                   10282:                                        L=ltotex(R|opt="GRS",pre=S);
1.26      takayama 10283:                                        if(type(D=getopt(div))==1 || type(D)==4) L=divmattex(L,D);
1.6       takayama 10284:                                        if(Dvi>0) dviout(L|eq=0,keep=Keep);
                   10285:                                }
                   10286:                                return L; /* get all spct */
                   10287:                        }
                   10288:                        if(type(T=P[1])==4){
                   10289:                                if(F=="get0"&&length(P)==3&&type(I=P[1])==4&&type(J=P[2])==4){
                   10290:                                        if(I[0]>I[1]) I=[I[1],I[0]];
                   10291:                                        if(J[0]>J[1]) J=[J[1],J[0]];
                   10292:                                        if(I[0]>I[0]){S=I;I=J;J=S;};
                   10293:                                        K=lsort(I,J,0);
                   10294:                                        if(length(K)==4){
1.24      takayama 10295:                                                S=mc2grs(G,["get0",[I,J]]);
1.6       takayama 10296:                                                return anal2sp(S,[["*",1,1],0]);
                   10297:                                        }
                   10298:                                        I=lsort(K,lsort(I,J,2),1);
                   10299:                                        S=lsort([0,1,2,3,4],K,1);
1.24      takayama 10300:                                        D=mc2grs(G,"deg");
1.6       takayama 10301:                                        if(findin(4,S)<0) D=-D;
1.24      takayama 10302:                                        J=mc2grs(G,["get0",[I,S]]);
1.6       takayama 10303:                                        if(I[0]>S[0]) J=sp2grs(J,"swap");
                   10304:                                        return anal2sp(J,[["+",0,D],["*",-1,1]]);
                   10305:                                }
                   10306:                                if(type(car(T))==4){
                   10307:                                        if(T[0][0]>T[0][1]) T=[[T[0][1],T[0][0]],T[1]];
                   10308:                                        if(T[1][0]>T[1][1]) T=[T[0],[T[1][1],T[1][0]]];
                   10309:                                        if(T[0][0]>T[1][0]) T=[T[1],T[0]];
                   10310:                                        for(PG=G;PG!=[];PG=cdr(PG))
                   10311:                                                if(car(PG)[0]==T) return (F=="get")?car(PG):cdr(car(PG));
                   10312:                                        return [];      /* get common spct */
                   10313:                                }
1.23      takayama 10314:                                if(length(T)==3){
                   10315:                                        T0=T;T=lsort([0,1,2,3,4],T,1);
                   10316:                                        if(length(T)!=2) return [];
                   10317:                                }else T0=0;
1.6       takayama 10318:                                if(T[0]>T[1]) T=[T[1],T[0]];
                   10319:                                for(FT=0,PG=G;PG!=[];PG=cdr(PG)){
                   10320:                                        if(car(PG)[0][0]==T){
                   10321:                                                FT=1;break;
                   10322:                                        }
                   10323:                                        if(car(PG)[0][1]==T){
                   10324:                                                FT=2;break;
                   10325:                                        }
                   10326:                                }
                   10327:                                if(!FT) return [];
                   10328:                                L=anal2sp(cdr(car(PG)),[["get1",FT],0]);
1.23      takayama 10329:                                if(T0!=0){
                   10330:                                        if((K=mc2grs(G,"deg"))!=0){
                   10331:                                                if(T[1]!=4) K=-K;
                   10332:                                                R=reverse(L);
                   10333:                                                for(L=[];R!=[];R=cdr(R)) L=cons([car(R)[0],car(R)[1]+K],L);
                   10334:                                        }
                   10335:                                        T=T0;
                   10336:                                }
1.6       takayama 10337:                                return (F=="get")?cons(T,L):L;
                   10338:                        }
                   10339:                }
1.27      takayama 10340:                if(F=="rest"||F=="eigen"||F=="rest0"||F=="rest1"){
1.79      takayama 10341:                        if((Hg=getopt(homog))!=0) Hg=1;
                   10342:                        if(F!="eigen"&&Hg) G=mc2grs(G,"homog");
1.26      takayama 10343:                        if(length(P)==1){
                   10344:                                for(R=[],I=0;I<4;I++){
                   10345:                                        for(J=I+1;J<5;J++){
1.79      takayama 10346:                                                S=mc2grs(G,[F,[I,J]]|homog=Hg);
1.27      takayama 10347:                                                if(S!=[]) R=cons(cons([I,J],S),R);
1.26      takayama 10348:                                        }
                   10349:                                }
                   10350:                                R=reverse(R);
                   10351:                                if(Dvi){
                   10352:                                        TB=str_tb(0,0);
1.27      takayama 10353:                                        if(F=="rest0"||F=="rest1"){
1.26      takayama 10354:                                                for(T=R;;){
                   10355:                                                        TT=car(T);
                   10356:                                                        S=rtostr(car(TT)[0])+rtostr(car(TT)[1]);
                   10357:                                                        str_tb(["[",S,"]","&: "],TB);
                   10358:                                                        for(TR=[],TT=cdr(TT);TT!=[];TT=cdr(TT))
                   10359:                                                                TR=cons(car(TT)[1],TR);
                   10360:                                                        for(TR=qsort(TR);TR!=[];TR=cdr(TR))
                   10361:                                                                str_tb([s2sp(car(TR)|short=1,std=-1),"\\ \\ "],TB);
                   10362:                                                        if((T=cdr(T))==[]) break;
                   10363:                                                        str_tb("\\\\\n",TB);
                   10364:                                                }
                   10365:                                        }else{
                   10366:                                                TB=str_tb(0,0);
                   10367:                                                for(T=R;;){
                   10368:                                                        TT=car(T);
                   10369:                                                        S=rtostr(car(TT)[0])+rtostr(car(TT)[1]);
                   10370:                                                        str_tb(["[",S,"]",":\\ "],TB);
                   10371:                                                        for(TR=[],TT=cdr(TT);;){
                   10372:                                                                T0=car(TT);
                   10373:                                                                str_tb(["&",my_tex_form(car(T0)),"&&\\to\\ \n",
                   10374:                                                                        ltotex(cdr(T0)|opt="GRS")],TB);
                   10375:                                                                if((TT=cdr(TT))==[]) break;
                   10376:                                                                str_tb("\\\\\n",TB);
                   10377:                                                        }
                   10378:                                                        if((T=cdr(T))==[]) break;
                   10379:                                                        str_tb("\\allowdisplaybreaks\\\\\n",TB);
                   10380:                                                }
                   10381:                                        }
                   10382:                                        R=texbegin("align*",str_tb(0,TB));
                   10383:                                        if(Dvi!=-1) dviout(R|keep=Keep);
                   10384:                                }
                   10385:                                return R;
                   10386:                        }
1.23      takayama 10387:                        I=P[1];
                   10388:                        if(I[0]>I[1]) I=[I[1],I[0]];
                   10389:                        L=lsort([0,1,2,3,4],I,1);
1.29      takayama 10390:                        if(F=="rest"&&length(P)==3){
                   10391:                                J=P[2];if(J[0]>J[1]) J=[J[1],J[0]];
                   10392:                                L=lsort(L,J,1);
                   10393:                                if(length(L)!=1) return 0;
                   10394:                                return [mc2grs(G,["get0",I]),mc2grs(G,["get0",[I[0],J[0]],[I[1],J[1]]]),
                   10395:                                        mc2grs(G,["get0",[I[0],J[1]],[I[1],J[0]]]),mc2grs(G,["get0",[I[0],I[1],L[0]]])];
                   10396:                        }
1.23      takayama 10397:                        L=[[L[0],L[1]],[L[0],L[2]],[L[1],L[2]]];
1.24      takayama 10398:                        if(F!="eigen"){
                   10399:                                if(I==[0,4]) L=reverse(L);
                   10400:                                else{
                   10401:                                        for(V=[],J=2;J>=0;J--){
                   10402:                                                if(L[J][0]==0) V=cons([L[J][1],J],V);
                   10403:                                                else{
                   10404:                                                        for(K=4;K>=0;K--){
                   10405:                                                                if(findin(K,L[J])<0){
                   10406:                                                                        V=cons([K,J],V);break;
                   10407:                                                                }
                   10408:                                                        }
                   10409:                                                }
                   10410:                                        }
                   10411:                                        V=qsort(V);
                   10412:                                        L=[L[V[0][1]],L[V[1][1]],L[V[2][1]]];
                   10413:                                }
                   10414:                        }
1.23      takayama 10415:                        for(LL=[],T=L;T!=[];T=cdr(T))
                   10416:                                LL=cons(mc2grs(G,["get0",[I,car(T)]]),LL);
                   10417:                        LL=reverse(LL);
                   10418:                        for(R=[],Q=mc2grs(G,["get0",I]);Q!=[];Q=cdr(Q)){
1.24      takayama 10419:                                for(T=[],J=2;J>=0;J--){
                   10420:                                        V=anal2sp(LL[J],["get1",(I[0]<L[J][0])?1:2,car(Q)[1]]);
                   10421:                                        if(F=="rest"){
                   10422:                                                if(I[0]==0){
                   10423:                                                        if(I[1]!=4){
                   10424:                                                                if(L[J][1]!=4) V=anal2sp(V,["+",-car(Q)[1]]);
                   10425:                                                        }else if (L[J][0]!=2) V=anal2sp(V,["+",-car(Q)[1]]);
                   10426:                                                }else if(L[J][0]!=0) V=anal2sp(V,["+",-car(Q)[1]]);
                   10427:                                        }
                   10428:                                        T=cons(V,T);
                   10429:                                }
1.23      takayama 10430:                                R=cons(cons(car(Q)[1],T),R);
                   10431:                        }
1.27      takayama 10432:                        if(F=="rest0"||F=="rest1"){
                   10433:                                for(L=[];R!=[];R=cdr(R)){
                   10434:                                        TR=cdr(car(R));
1.28      takayama 10435:                                        if(F=="rest1"&&chkspt(TR|opt="idx")==2) continue;
1.27      takayama 10436:                                        L=cons([car(R)[0],s2sp(chkspt(TR|opt=6))],L);
                   10437:                                }
1.23      takayama 10438:                                R=reverse(L);
                   10439:                        }
                   10440:                        return R;
                   10441:                }
1.6       takayama 10442:                if(F=="deg"){
                   10443:                        for(S=I=0;I<3;I++){
                   10444:                                for(J=I+1;J<4;J++){
                   10445:                                        L=mc2grs(G,["get0",[I,J]]);
                   10446:                                        L=anal2sp(L,"val");
                   10447:                                        S+=L[1];
                   10448:                                }
                   10449:                        }
                   10450:                        return S/L[0];
                   10451:                }
1.27      takayama 10452:                if(F=="spct"||F=="spct1"){
                   10453:                        K=(F=="spct")?5:6;
1.6       takayama 10454:                        G=mc2grs(G,"get");
1.27      takayama 10455:                        M=newmat(5,K);
1.6       takayama 10456:                        for(;G!=[];G=cdr(G)){
                   10457:                                GT=car(G);I=GT[0][0];J=GT[0][1];
                   10458:                                for(S=0,L=[],GT=cdr(GT);GT!=[];GT=cdr(GT)){
                   10459:                                        L=cons(car(GT)[0],L);
                   10460:                                }
                   10461:                                L=reverse(qsort(L));
                   10462:                                M[I][J]=M[J][I]=L;
                   10463:                        }
                   10464:                        for(D=0,GT=M[0][1];GT!=[];GT=cdr(GT)) D+=car(GT);
                   10465:                        for(I=0;I<5;I++){
                   10466:                                S=-2*D^2;
                   10467:                                for(J=0;J<5;J++){
                   10468:                                        if(I==J) continue;
                   10469:                                        for(L=M[I][J];L!=[];L=cdr(L)) S+=car(L)^2;
                   10470:                                }
                   10471:                                M[I][I]=S;
1.27      takayama 10472:                                if(K==6){
                   10473:                                        for(S=[],J=4;J>=0;J--)
                   10474:                                                if(I!=J) S=cons(M[I][J],S);
                   10475:                                        R=chkspt(S|opt=2);
                   10476:                                        M[I][5]=((L=length(R))>1)?s2sp(R[L-2]|short=1):"";
                   10477:                                }
1.6       takayama 10478:                        }
                   10479:                        if(Dvi){
                   10480:                                S=[];
                   10481:                                for(I=4;I>=0;I--){
1.27      takayama 10482:                                        L=(K==6)?[M[I][5]]:[];
                   10483:                                        L=cons(M[I][I],L);
1.6       takayama 10484:                                        for(J=4;J>=0;J--){
                   10485:                                                if(I==J) L=cons("",L);
                   10486:                                                else L=cons(s2sp([M[I][J]]),L);
                   10487:                                        }
                   10488:                                        S=cons(L,S);
                   10489:                                }
1.27      takayama 10490:                                T=(K==6)?["reduction"]:[];
                   10491:                                S=cons(append([x0,x1,x2,x3,x4,"idx"],T),S);
                   10492:                                M=ltotex(S|opt="tab",hline=[0,1,z],
1.41      takayama 10493:                                        vline=(K==6)?[0,1,z-2,z-1,z]:[0,1,z-1,z],
1.26      takayama 10494:                                        left=["","$x_0$","$x_1$","$x_2$","$x_3$","$x_4$"]);
1.6       takayama 10495:                                if(Dvi>0) dviout(M|keep=Keep);
                   10496:                        }
                   10497:                        return M;
                   10498:                }
                   10499:                if(F=="swap"||F=="perm"){
                   10500:                        if(F=="perm") TR=P[1];
                   10501:                        else{
                   10502:                                TR=newvect(5,[0,1,2,3,4]);
                   10503:                                K=P[1][0];L=P[1][1];
                   10504:                                TR[K]=L;TR[L]=K;
                   10505:                                if(TR[4]!=4) G=mc2grs(G,"deg");
                   10506:                        }
                   10507:                        V=newvect(2);
                   10508:                        for(L=[],T=G;T!=[];T=cdr(T)){
                   10509:                                TP=car(T)[0];
                   10510:                                for(TQ=[],I=1;I>=0;I--){
                   10511:                                        V=[TR[TP[I][0]],TR[TP[I][1]]];
                   10512:                                        if(V[0]>V[1]) V=[V[1],V[0]];
                   10513:                                        TQ=cons(V,TQ);
                   10514:                                }
                   10515:                                if(TQ[0][0]<TQ[1][0]){
                   10516:                                        L=cons(cons(TQ,cdr(car(T))),L);
                   10517:                                        continue;
                   10518:                                }
                   10519:                                TQ=[[TQ[1],TQ[0]]];
                   10520:                                for(TP=cdr(car(T));TP!=[];TP=cdr(TP))
                   10521:                                        TQ=cons([car(TP)[0],car(TP)[2],car(TP)[1]],TQ);
                   10522:                                L=cons(reverse(TQ),L);
                   10523:                        }
                   10524:                        return mc2grs(L,"sort");
                   10525:                }
                   10526:                if(F=="homog"){
                   10527:                        V=mc2grs(G,"deg");
                   10528:                        return mc2grs(G,[[[2,3],-V]]);
                   10529:                }else if(F=="deg"){
                   10530:                        R=mc2grs(G,4);
                   10531:                        for(V=0;R!=[];R++){
                   10532:                                for(TR=cdr(R);TR!=[];TR=cdr(TR))
                   10533:                                        V+=car(TR)[0]*car(TR)[1];
                   10534:                        }
                   10535:                        return -V;
                   10536:                }
                   10537:        }
                   10538:        if(type(F)!=4) return 0;
                   10539:        if(type(P[0])!=4) P=[P];
                   10540:        for(;P!=[];P=cdr(P)){
                   10541:                if(type((S=P[0])[0])==4){ /* addition */
                   10542:                        T=P[0][0];
                   10543:                        if(T[0]>T[1]) T=[T[1],T[0]];
                   10544:                        T1=[T[0],4];T2=[T[1],4];
                   10545:                        for(L=[],PG=reverse(G);PG!=[];PG=cdr(PG)){
                   10546:                                R=car(PG);R0=R[0];F=0;K=P[0][1];
                   10547:                                if(R0[0]==T) F=1;
                   10548:                                else if(R0[1]==T) F=2;
                   10549:                                else if(getopt(unique)!=1){
                   10550:                                        K=-K;
                   10551:                                        if(R0[0]==T1||R0[0]==T2) F=1;
                   10552:                                        else if(R0[1]==T1||R0[1]==T2) F=2;
                   10553:                                }
                   10554:                                if(F==0) L=cons(R,L);
                   10555:                                else{
                   10556:                                        R1=anal2sp(cdr(R),(F==1)?["+",K,0]:["+",0,K]);
                   10557:                                        L=cons(cons(R0,R1),L);
                   10558:                                }
                   10559:                        }
                   10560:                        G=L;
                   10561:                }else if(type(S[0])<4){
                   10562:                         if(length(S)==1){       /* mc wrt0 4:cases */
                   10563:                                U=mc2grs(G,"deg");
                   10564:                                C=P[0][0];
                   10565:                                L=[];
                   10566:                        /* [[0,1],[2,3]] : [K=[0,k],J=[i,j]], S=[k,4] : 3 cases */
                   10567:                                for(K=1;K<4;K++){
                   10568:                                        J=lsort([1,2,3],[K],1);
                   10569:                                        K4=[K,4];K0=[0,K];
                   10570:                                        G0=mc2grs(G,["get0",[K0,J]]);
                   10571:                                        LT=anal2sp(G0,["+",C,0]);
                   10572:                                        G0=mc2grs(G,["get0",J]);
                   10573:                                        L0=anal2sp(G0,["put1",1,0]);
                   10574:                                        LT=anal2sp(LT,["add",L0]);
                   10575:                                        G0=mc2grs(G,["get0",K4]);
                   10576:                                        L0=anal2sp(G0,[["put1",1,0],["+",0,U]]);
                   10577:                                        LT=anal2sp(LT,["add",L0]);
                   10578:                                        G0=mc2grs(G,["get0",[[0,J[0]],K4]]);
                   10579:                                        L0=anal2sp(G0,[["get",1,0],["+",0,U]]);
                   10580:                                        LT=anal2sp(LT,["sub",L0]);
                   10581:                                        G0=mc2grs(G,["get0",[[0,J[1]],K4]]);
                   10582:                                        L0=anal2sp(G0,[["get",1,0],["+",0,U]]);
                   10583:                                        LT=anal2sp(LT,["sub",L0]);
                   10584:                                        G0=mc2grs(G,["get0",[K0,J]]);
                   10585:                                        L0=anal2sp(G0,[["get",1,0],["+",C,0]]);
                   10586:                                        LT=anal2sp(LT,["sub",L0]);
                   10587:                                        G0=mc2grs(G,["get0",[[0,4],J]]);
                   10588:                                        L0=anal2sp(G0,[["+",-C,0],["get",1,0]]);
                   10589:                                        LT=anal2sp(LT,[["sub",L0],0]);
                   10590:                                        L=cons(cons([K0,J],LT),L);
                   10591:                                }
                   10592:                        /* [[0,1],[2,4]] : [K,I]=[[0,k],[i,4]] S=[j,k] : 6 cases */
                   10593:                                for(K=1;K<4;K++){
                   10594:                                  for(I=1;I<4;I++){
                   10595:                                        if(I==K) continue;
                   10596:                                        for(J=1;J<4;J++) if(J!=I&&J!=K)  break;
                   10597:                                        I4=[I,4];S=(J<K)?[J,K]:[K,J];K0=[0,K];
                   10598:                                        G0=cdr(mc2grs(G,["get",[K0,I4]]));
                   10599:                                        LT=anal2sp(G0,["+",C,0]);
                   10600:                                        G0=cdr(mc2grs(G,["get",I4]));
                   10601:                                        L0=anal2sp(G0,["put1",1,0]);
                   10602:                                        LT=anal2sp(LT,["add",L0]);
                   10603:                                        G0=cdr(mc2grs(G,["get",S]));
                   10604:                                        L0=anal2sp(G0,[["put1",1,0],["+",0,-C-U]]);
                   10605:                                        LT=anal2sp(LT,["add",L0]);
                   10606:
                   10607:                                        G0=cdr(mc2grs(G,["get",[[0,I],S]]));
                   10608:                                        L0=anal2sp(G0,[["get",1,0],["+",0,-C-U]]);
                   10609:                                        LT=anal2sp(LT,["sub",L0]);
                   10610:                                        G0=cdr(mc2grs(G,["get",[[0,J],I4]]));
                   10611:                                        L0=anal2sp(G0,["get",1,0]);
                   10612:                                        LT=anal2sp(LT,["sub",L0]);
                   10613:                                        G0=cdr(mc2grs(G,["get",[K0,I4]]));
                   10614:                                        L0=anal2sp(G0,[["get",1,0],["+",C,0]]);
                   10615:                                        LT=anal2sp(LT,["sub",L0]);
                   10616:                                        G0=cdr(mc2grs(G,["get",[[0,4],S]]));
                   10617:                                        L0=anal2sp(G0,[["get",1,C],["+",-C,-C-U]]);
                   10618:                                        LT=anal2sp(LT,[["sub",L0],0]);
                   10619:                                        L=cons(cons([K0,I4],LT),L);
                   10620:                                  }
                   10621:                                }
                   10622:                        /* [[0,4],[2,3]] : [[0,4],J]=[[0,4],[i,j]] 3 cases */
                   10623:                                for(K=3;K>0;K--){
                   10624:                                        J=lsort([1,2,3],[K],1);
                   10625:                                        G0=mc2grs(G,["get0",[[0,4],J]]);
                   10626:                                        LT=anal2sp(G0,["+",-C,0]);
                   10627:                                        G0=mc2grs(G,["get0",J]);
                   10628:                                        L0=anal2sp(G0,["put1",1,-C]);
                   10629:                                        LT=anal2sp(LT,["add",L0]);
                   10630:                                        G0=mc2grs(G,["get0",[K,4]]);
                   10631:                                        L0=anal2sp(G0,[["put1",1,-C],["+",0,U]]);
                   10632:                                        LT=anal2sp(LT,["add",L0]);
                   10633:
                   10634:                                        G0=mc2grs(G,["get0",[[0,J[0]],[K,4]]]);
                   10635:                                        L0=anal2sp(G0,[["get",1,0],["+",-C,U]]);
                   10636:                                        LT=anal2sp(LT,["sub",L0]);
                   10637:                                        G0=mc2grs(G,["get0",[[0,J[1]],[K,4]]]);
                   10638:                                        L0=anal2sp(G0,[["get",1,0],["+",-C,U]]);
                   10639:                                        LT=anal2sp(LT,["sub",L0]);
                   10640:                                        G0=mc2grs(G,["get0",[[0,K],J]]);
                   10641:                                        L0=anal2sp(G0,[["get",1,0],["+",-C,0]]);
                   10642:                                        LT=anal2sp(LT,["sub",L0]);
                   10643:                                        G0=mc2grs(G,["get0",[[0,4],J]]);
                   10644:                                        L0=anal2sp(G0,[["get",1,C],["put",1,0]]);
                   10645:                                        LT=anal2sp(LT,[["sub",L0],0]);
                   10646:                                        L=cons(cons([[0,4],J],LT),L);
                   10647:                                }
                   10648:                        /* [[1,2],[3,4]] : [J,K]=[[i,j],[k,4]] 3 cases  */
                   10649:                                for(K=3;K>0;K--){
                   10650:                                        J=lsort([1,2,3],[K],1);
                   10651:                                        if(K>1)
                   10652:                                                LT=mc2grs(G,["get0",[J,[K,4]]]);
                   10653:                                        else{
                   10654:                                                LT=mc2grs(G,["get0",[[K,4],J]]);
                   10655:                                                LT=anal2sp(LT,"swap");
                   10656:                                        }
                   10657:                                        G0=mc2grs(G,["get0",J]);
                   10658:                                        L0=anal2sp(G0,[["put1"],["+",0,-C-U]]);
                   10659:                                        LT=anal2sp(LT,["add",L0]);
                   10660:                                        G0=mc2grs(G,["get0",[K,4]]);
                   10661:                                        L0=anal2sp(G0,[["put1"],["+",U,0]]);
                   10662:                                        LT=anal2sp(LT,["add",L0]);
                   10663:
                   10664:                                        G0=mc2grs(G,["get0",[[0,J[0]],[K,4]]]);
                   10665:                                        L0=anal2sp(G0,[["get1",1,0],["put1"],["+",U,0]]);
                   10666:                                        LT=anal2sp(LT,["sub",L0]);
                   10667:                                        G0=mc2grs(G,["get0",[[0,J[1]],[K,4]]]);
                   10668:                                        L0=anal2sp(G0,[["get1",1,0],["put1"],["+",U,0]]);
                   10669:                                        LT=anal2sp(LT,["sub",L0]);
                   10670:                                        G0=mc2grs(G,["get0",[[0,K],J]]);
                   10671:                                        L0=anal2sp(G0,[["get1",1,0],["put1"],["+",0,-C-U]]);
                   10672:                                        LT=anal2sp(LT,["sub",L0]);
                   10673:                                        G0=mc2grs(G,["get0",[[0,4],J]]);
                   10674:                                        L0=anal2sp(G0,[["get1",1,C],["put1"],["+",0,-C-U]]);
                   10675:                                        LT=anal2sp(LT,[["sub",L0],0]);
                   10676:                                        if(K==1){
                   10677:                                                LT=anal2sp(LT,"swap");
                   10678:                                                L=cons(cons([[K,4],J],LT),L);
                   10679:                                        }else L=cons(cons([J,[K,4]],LT),L);
                   10680:                                }
                   10681:                                G=L;
                   10682:                          }else if(length(S)==2){        /* general mc */
                   10683:                                if(S[1]!=0){
                   10684:                                        I=S[0];
                   10685:                                        if(I!=0) G=mc2grs(G,["swap",[0,I]]);
                   10686:                                        G=mc2grs(G,[S[1]]);
                   10687:                                        if(I!=0) G=mc2grs(G,["swap",[0,I]]);
                   10688:                                }
                   10689:                        }else if(length(S)==3||length(S)==4){   /* addition */
                   10690:                                for(I=1;I<4;I++,S=cdr(S))
                   10691:                                        if(S[0]) G=mc2grs(G,[[[0,I],S[0]]]);
                   10692:                                if(length(S)==1 && S[0])                        /* mc */
                   10693:                                        G=mc2grs(G,[S[0]]);
                   10694:                        }
                   10695:                }
                   10696:        }
                   10697:        return mc2grs(G,"sort");
                   10698: }
                   10699:
                   10700: def mcmgrs(G,P)
                   10701: {
                   10702:        if(type(G)<2){
                   10703:                if(G>1){
                   10704:                        N=G+2;G=[];
                   10705:                        for(I=1;I<=N;I++){
                   10706:                                for(J=1;J<N;J++){
                   10707:                                        if(I==J) continue;
                   10708:                                        for(K=J+1;K<=N;K++){
                   10709:                                                if(I==K) continue;
                   10710:                                                G=cons([[[0,I],[J,K]],[1,0,0]],G);
                   10711:                                        }
                   10712:                                }
                   10713:                        }
                   10714:                        for(I=1;I<=N;I++){
                   10715:                                for(J=1;J<I;J++) G=cons([[[0,I],[0,J,I]],[1,0,0]],G);
                   10716:                                for(J=I+1;J<=N;J++) G=cons([[[0,I],[0,I,J]],[1,0,0]],G);
                   10717:                        }
                   10718:                        return reverse(G);
                   10719:                }
                   10720:                return 0;
                   10721:        }
                   10722:        if(type(G)==7) G=os_md.s2sp(G);
                   10723:        if(type(G)!=4||type(G[0])!=4) return 0;
                   10724:        if(type(G[0][0])!=4){                   /* spectre type -> GRS */
                   10725:                G=s2sp(G|std=1);
                   10726:                L=length(G);
                   10727:                for(V=[],I=L-2;I>=0;I--) V=cons(makev([I+10]),V);
                   10728:                V=cons(makev([L+9]),V);
                   10729:                G=sp2grs(G,V,[1,length(G[0]),-1]|mat=1);
                   10730:                if(getopt(short)!=0){
                   10731:                        V=append(cdr(V),[V[0]]);
                   10732:                        G=shortv(G,V);
                   10733:                }
                   10734:                R=chkspt(G|mat=1);
                   10735:                if(R[2] != 2 || R[3] != 0 || !(R=getbygrs(G,1|mat=1))) return 0;
                   10736:                if(getopt(anal)==1) return R;   /* called by mcmgrs() */
                   10737:                if(!(G=mcmgrs(L-2,0))) return 0;
                   10738:                for(R=cdr(R);R!=[];R=cdr(R)){
                   10739:                        TR=car(R)[0];
                   10740:                        if(TR[0]) G=mcmgrs(G,[[TR[0]]]);
                   10741:                        G=mcmgrs(G,[cdr(TR)]);
                   10742:                }
                   10743:        }
                   10744:        L=length(G);
                   10745:        for(N=4;N<25;N++){
                   10746:                K=N^2*(N-1)/2;
                   10747:                if(K>L) return 0;
                   10748:                if(K==L) break;
                   10749:        }
                   10750:        if(type(P)<2) return G;
                   10751:        F=0;
                   10752:        if(type(P)==7||(type(P)==4&&type(P[0])<4)) P=[P];
                   10753:        if((Dvi=getopt(dviout))!=1&&Dvi!=2&&Dvi!=-1) Dvi=0;
                   10754:        Keep=(Dvi==2)?1:0;
                   10755:        if(type(P)==4 && type(F=car(P))==7){
                   10756:                if(F=="mult"){
1.24      takayama 10757:                        for(P=cdr(P);P!=[];P=cdr(P)) G=mc2grs(G,car(P)|option_list=getopt());
1.6       takayama 10758:                        return G;
                   10759:                }
                   10760:                if(F=="get"||F=="get0"){
                   10761:                        if(Dvi!=0) F="get";
                   10762:                        if(length(P)==2){
                   10763:                                if(type(P[1])==4){
                   10764:                                        if(type(P[1][1])==4){           /* [[,],[,]] */
                   10765:                                                for(PG=reverse(G);PG!=[];PG=cdr(PG)){
                   10766:                                                        TP=car(PG);
                   10767:                                                        if(TP[0]==P[1]) return (F=="get")?TP:cdr(TP);
                   10768:                                                }
                   10769:                                                return [];
                   10770:                                        }
                   10771:                                        if(P[1][0]==0){
                   10772:                                                if(length(P[1])==2){    /* [0,] */
                   10773:                                                        for(J=1;J<=N;J++) if(J!=P[1][1]) break;
                   10774:                                                        for(K=J+1;K<=N;K++) if(K!=P[1][1]) break;
                   10775:                                                        L=mcmgrs(G,["get0",[P[1],[J,K]]]);
                   10776:                                                        L=anal2sp(L,["get1",1]);
                   10777:                                                }else{                                  /* [0,*,*] */
                   10778:                                                        L=mcmgrs(G,["get0",[[P[1][0],P[1][1]],P[1]]]);
                   10779:                                                        L=anal2sp(L,["get1",2]);
                   10780:                                                }
                   10781:                                        }else{                                          /* [,] */
                   10782:                                                for(J=1;J<=N;J++) if(J!=P[1][0]&&J!=P[1][1]) break;
                   10783:                                                L=mcmgrs(G,["get0",[[0,J],P[1]]]);
                   10784:                                                L=anal2sp(L,["get1",2]);
                   10785:                                        }
                   10786:                                        L=anal2sp(L,0);
                   10787:                                        if(F=="get") L=cons(P[1],L);
                   10788:                                        return L;
                   10789:                                }else{  /* I */
                   10790:                                        for(L=[],I=P[1],J=0;J<=N;J++){
                   10791:                                                if(I==J) continue;
                   10792:                                                II=(I<J)?[I,J]:[J,I];
                   10793:                                                L=cons(mcmgrs(G,[F,II]),L);
                   10794:                                        }
                   10795:                                }
                   10796:                        }else{
                   10797:                                for(L=[],I=0;I<N;I++){
                   10798:                                        for(J=I+1;J<=N;J++) L=cons(mcmgrs(G,[F,[I,J]]),L);
                   10799:                                }
                   10800:                        }
                   10801:                        if(Dvi){
                   10802:                                for(R=S=[];L!=[];L=cdr(L)){
                   10803:                                        T=car(L);
                   10804:                                        R=cons(cdr(T),R);
                   10805:                                        if(S==[]) S="A_{"+rtostr(T[0][0])+rtostr(T[0][1])+"}\\\\\n";
                   10806:                                        else S="A_{"+rtostr(T[0][0])+rtostr(T[0][1])+"}&"+S;
                   10807:                                }
                   10808:                                L=ltotex(R|opt="GRS",pre=S);
                   10809:                                if(type(V=getopt(div))!=4) V=[];
                   10810:                                if(V==[]&&(K=length(R))>10)
                   10811:                                        for(I=9;I<K;I+=9) V=cons(I,V);
                   10812:                                V=reverse(V);
                   10813:                                if(V!=[]) L=divmattex(L,V);
                   10814:                                if(Dvi>0){
                   10815:                                        if(V!=[]) dviout(L|keep=Keep);
                   10816:                                        else dviout(L|eq=0,keep=Keep);
                   10817:                                }
                   10818:                        }else L=reverse(L);
                   10819:                        return L;
                   10820:                }
                   10821:                if(F=="show"){
                   10822:                        for(R=str_tb(0,0);G!=[];){
                   10823:                                L=car(G);
                   10824:                                I=L[0][0];J=L[0][1];
                   10825:                                str_tb("[A_{"+rtostr(I[0])+rtostr(I[1])+"}:A_{"+rtostr(J[0])+rtostr(J[1]),R);
                   10826:                                if(length(J)==3) str_tb(rtostr(J[2]),R);
                   10827:                                str_tb("}]&=\\left\\{",R);
                   10828:                                for(L=cdr(L);;){
                   10829:                                        S=car(L);
                   10830:                                        str_tb("["+my_tex_form(S[1])+":"+my_tex_form(S[2])+"]",R);
                   10831:                                        if(S[0]!=1) str_tb("_{"+rtostr(S[0])+"}",R);
                   10832:                                        if((L=cdr(L))==[]) break;
                   10833:                                        str_tb(",\\,",R);
                   10834:                                }
                   10835:                                str_tb("\\right\\}",R);
                   10836:                                if((G=cdr(G))==[]) break;
                   10837:                                str_tb(texcr(43),R);
                   10838:                        }
                   10839:                        R=texbegin("align*",str_tb(0,R));
                   10840:                        if(Dvi!=-1) dviout(R|keep=Keep);
                   10841:                        return R;
                   10842:                }
                   10843:                if(F=="show0"){
                   10844:                        for(C=N*(N-1)*(N-2)/2,S="",L=[];G!=[];G=cdr(G)){
                   10845:                                for(TL=[],TG=cdr(car(G));TG!=[];TG=cdr(TG)) TL=cons(car(TG)[0],TL);
                   10846:                                TL=msort(TL,[-1,0]);
                   10847:                                if(Dvi){
                   10848:                                        if(S!=""){
                   10849:                                                if(--C==0) S=S+";";
                   10850:                                                else S=S+",";
                   10851:                                        }
                   10852:                                        for(I=J=0,T=append(TL,[[0]]);T!=[];T=cdr(T)){
                   10853:                                                if(car(T)==I) J++;
                   10854:                                                else{
                   10855:                                                        if(I>0&&J>0){
                   10856:                                                                if(I>9) S=S+"("+rtostr(I)+")";
                   10857:                                                                else S=S+rtostr(I);
                   10858:                                                                if(J>1){
                   10859:                                                                        if(J>9) S=S+"^{"+rtostr(J)+"}";
                   10860:                                                                        else S=S+"^"+rtostr(J);
                   10861:                                                                }
                   10862:                                                        }
                   10863:                                                        I=car(T);J=1;
                   10864:                                                }
                   10865:                                        }
                   10866:                                }
                   10867:                                L=cons(TL,L);
                   10868:                        }
                   10869:                        if(Dvi){
1.43      takayama 10870:                                if(Dvi!=-1) dviout(S|eq=0,keep=Keep);
1.6       takayama 10871:                                return S;
                   10872:                        }
                   10873:                        return reverse(L);
                   10874:                }
                   10875:                if(F=="spct"){
                   10876:                        G=mcmgrs(G,"get");
                   10877:                        M=newmat(N+1,N+1);
                   10878:                        for(;G!=[];G=cdr(G)){
                   10879:                                GT=car(G);I=GT[0][0];J=GT[0][1];
                   10880:                                for(S=0,L=[],GT=cdr(GT);GT!=[];GT=cdr(GT)){
                   10881:                                        L=cons(car(GT)[0],L);
                   10882:                                }
                   10883:                                L=reverse(qsort(L));
                   10884:                                M[I][J]=M[J][I]=L;
                   10885:                        }
                   10886:                        for(D=0,GT=M[0][1];GT!=[];GT=cdr(GT)) D+=car(GT);
                   10887:                        for(I=0;I<=N;I++){
                   10888:                                S=-(N-2)*D^2;
                   10889:                                for(J=0;J<=N;J++){
                   10890:                                        if(I==J) continue;
                   10891:                                        for(L=M[I][J];L!=[];L=cdr(L)) S+=car(L)^2;
                   10892:                                }
                   10893:                                M[I][I]=S;
                   10894:                        }
                   10895:                        if(Dvi){
                   10896:                                S=[];
                   10897:                                for(LS=[],I=N;I>=0;I--){
                   10898:                                        L=[M[I][I]];
                   10899:                                        for(J=N;J>=0;J--){
                   10900:                                                if(I==J) L=cons("",L);
                   10901:                                                else L=cons(s2sp([M[I][J]]),L);
                   10902:                                        }
                   10903:                                        S=cons(L,S);
                   10904:                                        LS=cons("$x_"+rtostr(I)+"$",LS);
                   10905:                                }
                   10906:                                S=cons(append(LS,["idx"]),S);
                   10907:                                M=ltotex(S|opt="tab",hline=[0,1,z],vline=[0,1,z-1,z],left=cons("",LS));
                   10908:                                if(Dvi>0) dviout(M|keep=Keep);
                   10909:                        }
                   10910:                        return M;
                   10911:                }
                   10912:                if(F=="deg"){
                   10913:                        for(S=I=0;I<N-1;I++){
                   10914:                                for(J=I+1;J<N;J++){
                   10915:                                        L=mcmgrs(G,["get0",[I,J]]);
                   10916:                                        L=anal2sp(L,"val");
                   10917:                                        S+=L[1];
                   10918:                                }
                   10919:                        }
                   10920:                        return S/L[0];
                   10921:                }
                   10922:        }
                   10923:        L=[];
                   10924:        if(type(F)!=4) return 0;
                   10925:        if(type(P[0])!=4||length(P[0])==2) P=[P];
                   10926:        for(;P!=[];P=cdr(P)){
                   10927:                if(type(T=(S=car(P))[0])==4){ /* addition */
                   10928:                        if((K=P[0][1])!=0){
                   10929:                                if(T[0]>T[1]) T=[T[1],T[0]];
                   10930:                                T1=[T[0],N];T2=[T[1],N];
                   10931:                                T01=cons(0,T1);T02=cons(0,T2);
                   10932:                                for(PG=G;PG!=[];PG=cdr(PG)){
                   10933:                                        R=car(PG);R0=R[0];K1=K2=0;
                   10934:                                        TP=R0[0];
                   10935:                                        if(TP==T) K1=K;
                   10936:                                        else if(TP==T1||TP==T2) K1=-K;
                   10937:                                        if(length(TP=R0[1])==2){
                   10938:                                                if(TP==T) K2=K;
                   10939:                                                else if(TP==T1||TP==T2) K2=-K;
                   10940:                                        }else{
                   10941:                                                S=0;
                   10942:                                                if(findin(T[0],TP)>=0) S++;
                   10943:                                                if(findin(T[1],TP)>=0) S++;
                   10944:                                                if(S>0&&TP[2]==N) K2=-K;
                   10945:                                                else if(S==2) K2=K;
                   10946:                                        }
                   10947:                                        R1=anal2sp(cdr(R),["+",K1,K2]);
                   10948:                                        L=cons(cons(R0,R1),L);
                   10949:                                }
                   10950:                                G=reverse(L);
                   10951:                        }
                   10952:                }else if(length(S)==1){         /* middle convolution */
                   10953:                        C=S[0];L=[];
                   10954:                        for(I=1;I<=N;I++){
                   10955:                                for(J=1;J<=N;J++){
                   10956:                                        if(I==J) continue;
                   10957:                                        for(K=J+1;K<=N;K++){    /* [[0,I],[J,K]] */
                   10958:                                                if(I==K)continue;
                   10959:                                                T=[[0,I],JK=[J,K]];
                   10960:                                                if(I==N){
                   10961:                                                        LT=mcmgrs(G,["get0",T]);
                   10962:                                                        G0=mcmgrs(G,["get0",JK]);
                   10963:                                                        L0=anal2sp(G0,[["put1",1,0],["mult",N-3]]);
                   10964:                                                        G0=mcmgrs(G,["get0",[0,J,K]]);
                   10965:                                                        LT=anal2sp(LT,["add",L0]);
                   10966:                                                        L0=anal2sp(G0,["put1",1,0]);
                   10967:                                                        LT=anal2sp(LT,["add",L0]);
                   10968:                                                        for(V=1;V<=N;V++){
                   10969:                                                                if(V==I){
                   10970:                                                                        G0=mcmgrs(G,["get0",T]);
                   10971:                                                                        L0=anal2sp(G0,["get",1,C]);
                   10972:                                                                }else if(V==J||V==K){
                   10973:                                                                        G0=mcmgrs(G,["get0",[[0,V],[0,J,K]]]);
                   10974:                                                                        L0=anal2sp(G0,["get",1,0]);
                   10975:                                                                }else{
                   10976:                                                                        G0=mcmgrs(G,["get0",[[0,V],JK]]);
                   10977:                                                                        L0=anal2sp(G0,["get",1,0]);
                   10978:                                                                }
                   10979:                                                                LT=anal2sp(LT,["sub",L0]);
                   10980:                                                        }
                   10981:                                                        LT=anal2sp(LT,["+",-C,0]);
                   10982:                                                }else if(K==N){
                   10983:                                                        LT=mcmgrs(G,["get0",T]);
                   10984:                                                        LT=anal2sp(LT,["+",C,0]);
                   10985:                                                        G0=mcmgrs(G,["get0",JK]);
                   10986:                                                        L0=anal2sp(G0,[["put1",1,0],["mult",N-3]]);
                   10987:                                                        LT=anal2sp(LT,["add",L0]);
                   10988:                                                        G0=mcmgrs(G,["get0",[0,J,K]]);
                   10989:                                                        L0=anal2sp(G0,[["put1",1,0],["+",0,-C]]);
                   10990:                                                        LT=anal2sp(LT,["add",L0]);
                   10991:                                                        for(V=1;V<=N;V++){
                   10992:                                                                if(V==I){
                   10993:                                                                        G0=mcmgrs(G,["get0",T]);
                   10994:                                                                        L0=anal2sp(G0,[["get",1,0],["+",C,0]]);
                   10995:                                                                }else if(V==J){
                   10996:                                                                        G0=mcmgrs(G,["get0",[[0,V],[0,J,K]]]);
                   10997:                                                                        L0=anal2sp(G0,[["get",1,0],["+",0,-C]]);
                   10998:                                                                }else if(V==N){
                   10999:                                                                        G0=mcmgrs(G,["get0",[[0,V],[0,J,K]]]);
                   11000:                                                                        L0=anal2sp(G0,[["get",1,C],["+",-C,-C]]);
                   11001:                                                                }else{
                   11002:                                                                        G0=mcmgrs(G,["get0",[[0,V],JK]]);
                   11003:                                                                        L0=anal2sp(G0,["get",1,0]);
                   11004:                                                                }
                   11005:                                                                LT=anal2sp(LT,["sub",L0]);
                   11006:                                                        }
                   11007:                                                }else{
                   11008:                                                        G0=mcmgrs(G,["get0",T]);
                   11009:                                                        LT=anal2sp(G0,["+",C,0]);
                   11010:                                                        G0=mcmgrs(G,["get0",JK]);
                   11011:                                                        L0=anal2sp(G0,[["put1",1,0],["mult",N-3]]);
                   11012:                                                        LT=anal2sp(LT,["add",L0]);
                   11013:                                                        G0=mcmgrs(G,["get0",[0,J,K]]);
                   11014:                                                        L0=anal2sp(G0,["put1",1,0]);
                   11015:                                                        LT=anal2sp(LT,["add",L0]);
                   11016:                                                        for(V=1;V<=N;V++){
                   11017:                                                                if(V==I){
                   11018:                                                                        G0=mcmgrs(G,["get0",T]);
                   11019:                                                                        L0=anal2sp(G0,[["get",1,0],["+",C,0]]);
                   11020:                                                                }else if(V==J||V==K){
                   11021:                                                                        G0=mcmgrs(G,["get0",[[0,V],[0,J,K]]]);
                   11022:                                                                        L0=anal2sp(G0,["get",1,0]);
                   11023:                                                                }else if(V==N){
                   11024:                                                                        G0=mcmgrs(G,["get0",[[0,V],JK]]);
                   11025:                                                                        L0=anal2sp(G0,[["get",1,C],["+",-C,0]]);
                   11026:                                                                }else{
                   11027:                                                                        G0=mcmgrs(G,["get0",[[0,V],JK]]);
                   11028:                                                                        L0=anal2sp(G0,["get",1,0]);
                   11029:                                                                }
                   11030:                                                                LT=anal2sp(LT,["sub",L0]);
                   11031:                                                        }
                   11032:                                                }
                   11033:                                                LT=anal2sp(LT,0);
                   11034:                                                L=cons(cons(T,LT),L);
                   11035:                                        }
                   11036:                                        T=[[0,I],(I<J)?[0,I,J]:[0,J,I]]; /* [0,I], [0,I,J] */
                   11037:                                        JK=(I<J)?[I,J]:[J,I];
                   11038:                                        if(I==N){
                   11039:                                                G0=mcmgrs(G,["get0",T]);
                   11040:                                                LT=anal2sp(G0,["+",-C,0]);
                   11041:                                                G0=mcmgrs(G,["get0",JK]);
                   11042:                                                L0=anal2sp(G0,[["put1",1,-C],["mult",N-3]]);
                   11043:                                                LT=anal2sp(LT,["add",L0]);
                   11044:                                                G0=mcmgrs(G,["get0",T[1]]);
                   11045:                                                L0=anal2sp(G0,["put1",1,-C]);
                   11046:                                                LT=anal2sp(LT,["add",L0]);
                   11047:                                                for(V=1;V<=N;V++){
                   11048:                                                        if(V==J){
                   11049:                                                                G0=mcmgrs(G,["get0",T]);
                   11050:                                                                L0=anal2sp(G0,[["get",1,0],["+",-C,0]]);
                   11051:                                                        }else if(V==N){
                   11052:                                                                G0=mcmgrs(G,["get0",[[0,V],T[1]]]);
                   11053:                                                                L0=anal2sp(G0,[["get",1,C],["+",-C,0]]);
                   11054:                                                        }else{
                   11055:                                                                G0=mcmgrs(G,["get0",[[0,V],JK]]);
                   11056:                                                                L0=anal2sp(G0,[["get",1,0],["+",-C,0]]);
                   11057:                                                        }
                   11058:                                                        LT=anal2sp(LT,["sub",L0]);
                   11059:                                                }
                   11060:                                                LT=anal2sp(LT,["+",0,C]);
                   11061:                                        }else if(J==N){
                   11062:                                                G0=mcmgrs(G,["get0",T]);
                   11063:                                                LT=anal2sp(G0,["+",C,0]);
                   11064:                                                G0=mcmgrs(G,["get0",T[0]]);
                   11065:                                                L0=anal2sp(G0,[["put1",1,0],["mult",N-3]]);
                   11066:                                                LT=anal2sp(LT,["add",L0]);
                   11067:                                                G0=mcmgrs(G,["get0",T[1]]);
                   11068:                                                L0=anal2sp(G0,["put1",1,0]);
                   11069:                                                LT=anal2sp(LT,["add",L0]);
                   11070:                                                for(V=1;V<=N;V++){
                   11071:                                                        if(V==I){
                   11072:                                                                G0=mcmgrs(G,["get0",T]);
                   11073:                                                                L0=anal2sp(G0,[["get",1,0],["+",C,0]]);
                   11074:                                                        }else if(V==N){
                   11075:                                                                G0=mcmgrs(G,["get0",[[0,V],T[1]]]);
                   11076:                                                                L0=anal2sp(G0,[["get",1,C],["+",-C,0]]);
                   11077:                                                        }else{
                   11078:                                                                G0=mcmgrs(G,["get0",[[0,V],JK]]);
                   11079:                                                                L0=anal2sp(G0,["get",1,0]);
                   11080:                                                        }
                   11081:                                                        LT=anal2sp(LT,["sub",L0]);
                   11082:                                                }
                   11083:                                                LT=anal2sp(LT,["+",0,-C]);
                   11084:                                        }else{
                   11085:                                                G0=mcmgrs(G,["get0",T]);
                   11086:                                                LT=anal2sp(G0,["+",C,C]);
                   11087:                                                G0=mcmgrs(G,["get0",JK]);
                   11088:                                                L0=anal2sp(G0,[["put1",1,0],["mult",N-3]]);
                   11089:                                                LT=anal2sp(LT,["add",L0]);
                   11090:                                                G0=mcmgrs(G,["get0",T[1]]);
                   11091:                                                L0=anal2sp(G0,[["put1",1,0],["+",0,C]]);
                   11092:                                                LT=anal2sp(LT,["add",L0]);
                   11093:                                                for(V=1;V<=N;V++){
                   11094:                                                        if(V==I){
                   11095:                                                                G0=mcmgrs(G,["get0",T]);
                   11096:                                                                L0=anal2sp(G0,[["get",1,0],["+",C,C]]);
                   11097:                                                        }else if(V==J){
                   11098:                                                                G0=mcmgrs(G,["get0",[[0,V],T[1]]]);
                   11099:                                                                L0=anal2sp(G0,[["get",1,0],["+",0,C]]);
                   11100:                                                        }else if(V==N){
                   11101:                                                                G0=mcmgrs(G,["get0",[[0,V],JK]]);                                                                                                                                       L0=anal2sp(G0,[["get",1,C],["+",-C,0]]);
                   11102:                                                        }else{
                   11103:                                                                G0=mcmgrs(G,["get0",[[0,V],JK]]);
                   11104:                                                                L0=anal2sp(G0,["get",1,0]);
                   11105:                                                        }
                   11106:                                                        LT=anal2sp(LT,["sub",L0]);
                   11107:                                                }
                   11108:                                        }
                   11109:                                        LT=anal2sp(LT,0);
                   11110:                                        L=cons(cons(T,LT),L);
                   11111:                                }
                   11112:                        }
                   11113:                        for(G0=G=[];L!=[];L=cdr(L)){
                   11114:                                if(length(car(L)[0][1])==2) G0=cons(car(L),G0);
                   11115:                                else G=cons(car(L),G);
                   11116:                        }
                   11117:                        G=append(G0,G);
                   11118:                }else{
                   11119:                        if(length(S)==N-1||length(S)==N){               /* [a_1,...,a_{N-1},c] */
                   11120:                                for(I=1;I<N;S=cdr(S),I++) G=mcmgrs(G,[[0,I],car(S)]);
                   11121:                                if(length(S)==1) G=mcmgrs(G,[S[0]]);
                   11122:                        }else return 0;
                   11123:                }
                   11124:        }
                   11125:        return G;
                   11126: }
                   11127:
                   11128:
                   11129: def delopt(L,S)
                   11130: {
1.81      takayama 11131:        if(getopt(get)==1){
                   11132:                for(;L!=[];L=cdr(L)) if(car(L)[0]==S) return car(L)[1];
                   11133:                return [];
                   11134:        }
1.70      takayama 11135:        if((Inv=getopt(inv))!=1&&Inv!=2) Inv=0;
                   11136:        if(Inv&&type(S)==4&&type(car(S))==4){
                   11137:                for(R=[];L!=[];L=cdr(L)){
                   11138:                        L0=car(L)[0];
                   11139:                        for(F=0,TS=[];S!=[];S=cdr(S)){
                   11140:                                if(!F&&L0==car(S)[0]){
                   11141:                                        R=cons(car(S),R);
                   11142:                                        F++;
                   11143:                                        continue;
                   11144:                                }
                   11145:                                TS=cons(car(S),TS);
                   11146:                        }
                   11147:                        if(!F) R=cons(car(L),R);
                   11148:                        S=reverse(TS);
                   11149:                }
                   11150:                R=reverse(R);
                   11151:                return Inv==1?append(S,R):append(R,S);
                   11152:        }
1.6       takayama 11153:        for(R=[];L!=[];L=cdr(L)){
                   11154:                if(type(car(L))!=4) F=0;
                   11155:                else if(type(S)==4) F=(findin(car(L)[0],S)<0)?0:1;
                   11156:                else F=(car(L)[0]==S)?1:0;
                   11157:                if(F==Inv) R=cons(car(L),R);
                   11158:        }
                   11159:        return reverse(R);
                   11160: }
                   11161:
                   11162: def str_char(S,N,L)
                   11163: {
                   11164:        if(type(S)==7){
                   11165:                if(type(L)==1) L=asciitostr([L]);
                   11166:                return str_chr(S,N,L);
                   11167:        }
                   11168:        if(type(L)==7)  L=strtoascii(L)[0];
                   11169:        if(type(S)==4){
                   11170:                M=N;
                   11171:                while(M-->0) S=cdr(S);
                   11172:                M=findin(L,S);
                   11173:                return (M>=0)?findin(L,S)+N:-1;
                   11174:        }else if(type(S)==5){
                   11175:                K=length(S);
                   11176:                for(I=N;I<K;I++)
                   11177:                        if(S[I]==L) return I;
                   11178:        }
                   11179:        return -1;
                   11180: }
                   11181:
                   11182: def str_pair(S,N,I,J)
                   11183: {
                   11184:        if(type(I)==7)  I=(II=strtoascii(I))[0];
                   11185:        if(type(J)==7)  J=(JJ=strtoascii(J))[0];
                   11186:        if(type(S)==7)  S=strtoascii(S);
                   11187:        if(getopt(inv)==1){
                   11188:                if(II!=0){
                   11189:                        I=asciitostr(reverse(II));
                   11190:                        IL=length(II);
                   11191:                }else IL=1;
                   11192:                if(JJ!=0) J=asciitostr(reverse(JJ));
                   11193:                R=str_pair(reverse(S),length(S)-N-1,J,I);
                   11194:                if(R>=0) R=length(S)-IL-R;
                   11195:                return R;
                   11196:        }
                   11197:        if((SJIS=getopt(sjis))!=1) SJIS=0;
                   11198:        if((II!=0&&length(II)>1)||(JJ!=0&&length(JJ)>1)){
                   11199:                for(;;){
                   11200:                        MJ=str_str(S,N|top=JJ,sjis=SJIS);
                   11201:                        if(MJ>=0){
                   11202:                                MI=str_str(S,II|top=N,sjis=SJIS);
                   11203:                                if(MI<0 || MI>MJ){
                   11204:                                        if(C==0) return MJ;
                   11205:                                        C--; N=MJ+length(II);
                   11206:                                }else if(MI>=0){
                   11207:                                        C++; N=MI+length(JJ);
                   11208:                                }
                   11209:                        }
                   11210:                        return -1;
                   11211:                }
                   11212:        }
                   11213:        if(type(S)==4){
                   11214:                M=N;
                   11215:                while(M-->0) S=cdr(S);
                   11216:                while(S!=[]){
                   11217:                        if(car(S)==I) C++;
                   11218:                        else if(car(S)==J){
                   11219:                                if(C==0) return N;
                   11220:                                C--;
                   11221:                        }
                   11222:                        S=cdr(S);N++;
                   11223:                }
                   11224:        }else if(type(S)==5){
                   11225:                K=length(S);
                   11226:                for(T=N;T<K && C>=0;T++){
                   11227:                        if(S[T]==I) C++;
                   11228:                        else if(S[T]==J){
                   11229:                                if(C==0) return T;
                   11230:                                C--;
                   11231:                        }
                   11232:                }
                   11233:        }
                   11234:        return -1;
                   11235: }
                   11236:
                   11237:
                   11238: def str_cut(S,I,J)
                   11239: {
                   11240:        if(type(S)==7) return sub_str(S,I,J);
                   11241:        if((JJ=length(S))<=J) J=JJ-1;
                   11242:        if(type(S)==5){
                   11243:                for(L=[],K=J; K>=I; K--)        L=cons(S[K],L);
                   11244:        }else if(type(S)==4){
                   11245:                J-=I;
                   11246:                while(I-->0) S=cdr(S);
                   11247:                for(L=[];J-->=0;S=cdr(S)) L=cons(car(S),L);
                   11248:                L=reverse(L);
                   11249:        }
                   11250:        return asciitostr(L);
                   11251: }
                   11252:
                   11253: def str_str(S,T)
                   11254: {
                   11255:        if(S==0) return -1;
                   11256:        if(type(S) == 7)
                   11257:                S = strtoascii(S);
                   11258:        if(type(J=getopt(top))!=1 || J<0) J=0;
                   11259:        LS=length(S);
                   11260:        if(LS-J<1)      return -1;
                   11261:        if(type(S)==4){
                   11262:                LS-=(J0=J);
                   11263:                for( ; J>0 && S!=[]; S=cdr(S),J--);
                   11264:        }
                   11265:        if(type(JJ=getopt(end))!=1 && JJ!=0) JJ=LS;
                   11266:        else JJ-=J0;
                   11267:        if((SJIS=getopt(sjis))!=1) SJIS=0;
                   11268:        if(JJ-J<0) return -1;
                   11269:        /* search from J-th to JJ-th */
                   11270:        if(type(T)==1)  T=[T];
                   11271:        else if(type(T)==7)     T = strtoascii(T);
                   11272:        else if(type(T)==4 && type(T[0])>3){
                   11273:                for(K=(KF=-1)-J0; T!=[]; F++,T=cdr(T)){
                   11274:                        JK=str_str(S,car(T)|top=J,end=JJ,sjis=SJIS);
                   11275:                        if(JK>=0){
                   11276:                                JJ=(K=JK)-1; KF=F;
                   11277:                                if(J>JJ) break;
                   11278:                        }
                   11279:                }
                   11280:                return [KF,J0+K];
                   11281:        }
                   11282:        if(type(T)==4)  T=ltov(T);
                   11283:        LT = length(T);
                   11284:        if(LT>0){
                   11285:                LE = LS-LT;
                   11286:                LP = T[0];
                   11287:                if(JJ==0 ||(type(JJ)==1 && JJ<LE)) LE=JJ;
                   11288:                if(type(S)==5){
                   11289:                        for(; J <= LE; J++){
                   11290:                                if(S[J] != LP){
                   11291:                                        if(SJIS && (V=S[J])>128){
                   11292:                                                if(V<160 || (V>223 && V<240)) J++;
                   11293:                                        }
                   11294:                                        continue;
                   11295:                                }
                   11296:                                for(I = 1; I < LT && S[I+J] == T[I]; I++);
                   11297:                                if(I >= LT)  return J;
                   11298:                        }
                   11299:                }else if(type(S)==4){
                   11300:                        for(; J<=LE; S=cdr(S),J++){
                   11301:                                if(car(S) != LP){
1.56      takayama 11302:                                        if(SJIS && (V=car(S))>128){
                   11303:                                                if((V<160 || (V>223 && V<240))&&S!=[]) {
                   11304:                                                        J++;S=cdr(S);
                   11305:                                                }
1.6       takayama 11306:                                        }
                   11307:                                        continue;
                   11308:                                }
                   11309:                                for(ST=cdr(S), I = 1; I < LT && car(ST) == T[I]; I++, ST=cdr(ST));
                   11310:                                if(I >= LT) return J0+J;
                   11311:                        }
                   11312:                }
                   11313:        }
                   11314:        return -1;
                   11315: }
                   11316:
                   11317: def str_times(S,N)
                   11318: {
                   11319:        if(!isint(N))   return "";
                   11320:        if(type(S)==7){
                   11321:                for(Tb=str_tb(0,0);N-->0;)
                   11322:                        str_tb(S,Tb);
                   11323:                return str_tb(0,Tb);
                   11324:        }
                   11325:        if(type(S)==4){
                   11326:                for(LT=[],I=0;I<N;I++){
                   11327:                        if(type(car(S))==7){
                   11328:                                LT=cons(car(S),LT);
                   11329:                                S=cdr(S);
                   11330:                                if(S==[]) S=[[""]];
                   11331:                        }else if(type(car(S))==4){
                   11332:                                ST=car(S);
                   11333:                                for(J=0;I<N;I++){
                   11334:                                        if(J==length(ST)) J=0;
                   11335:                                        LT=cons(ST[J++],LT);
                   11336:                                }
                   11337:                        }
                   11338:                }
                   11339:                return reverse(LT);
                   11340:        }
                   11341:        return S;
                   11342: }
                   11343:
                   11344: def ssubgrs(M,L)
                   11345: {
                   11346:        if(type(L)==7) L=s2sp(L);
                   11347:        for(S=0, L=L, M=M; L!=[]; L=cdr(L), M=cdr(M)){
                   11348:                 for(LT=car(L), MT=car(M); LT!=[]; LT=cdr(LT), MT=cdr(MT)){
                   11349:                         S += car(LT)*car(MT)[1];
                   11350:                 }
                   11351:        }
                   11352:        return S;
                   11353: }
                   11354:
                   11355: def s2os(S)
                   11356: {
                   11357:        return str_subst(S,[["\\","\\\\"],["\"","\\\""]],0);
                   11358: }
                   11359:
                   11360: def l2os(S)
                   11361: {
                   11362:        if(type(S)==6)
                   11363:                S=m2ll(S);
                   11364:        else if(type(S)==5)
                   11365:                S=vtol(S);
                   11366:        else if(type(S)==7) return "\""+s2os(S)+"\"";
                   11367:        else if(type(S)<4) return rtostr(S);
                   11368:        if(type(S)==4){
                   11369:                for(F=0,Tb=str_tb("[",0);S!=[];S=cdr(S)){
                   11370:                        if(F++) str_tb(", ",Tb);
                   11371:                        str_tb(l2os(car(S)),Tb);
                   11372:                }
                   11373:                str_tb("]",Tb);
                   11374:                return str_tb(0,Tb);
                   11375:        }
                   11376:        return 0;
                   11377: }
                   11378:
                   11379: def r2os(S)
                   11380: {
                   11381:        if(type(S)==6){
                   11382:                for(T="",S=m2ll(S);S!=[];S=cdr(S)){
                   11383:                        if(T!="") T=T+","+r2os(car(S));
                   11384:                        else T=r2os(car(S));
                   11385:                }
                   11386:                return "mat("+T+")\n";
                   11387:        }else if(type(S)==5){
                   11388:                for(T="",S=v2l(S);S!=[];S=cdr(S)){
                   11389:                        if(T!="") T=T+","+r2os(car(S));
                   11390:                        else T=r2os(car(S));
                   11391:                }
                   11392:                return "vect("+T+")\n";
                   11393:        }else if(type(S)<4) return rtostr(S);
                   11394:        else if(type(S)==4){
                   11395:                for(T="";S!=[];S=cdr(S)){
                   11396:                        if(T!="") T=T+","+r2os(car(S));
                   11397:                        else T=r2os(car(S));
                   11398:                }
                   11399:                return "["+T+"]";
                   11400:        }else if(type(S)==7) return "\""+s2os(S)+"\"";
                   11401:        return "";
                   11402: }
                   11403:
                   11404: def s2euc(S)
                   11405: {
                   11406:        for(R=[],CR=0,L=strtoascii(S);L!=[];L=cdr(L)){
                   11407:                if((C=car(L)) == 0x1b && length(L)>1) {
                   11408:                        if((C=car(L=cdr(L)))==0x24 && length(L)>1){     /* $ */
                   11409:                                if((C = car(L=cdr(L))) == 0x40 || C == 0x42) {  /* @, B */
                   11410:                                        Mode = 1;
                   11411:                                } else return 0;
                   11412:                        }else if(C == 0x28 && length(L)>1) {    /* ( */
                   11413:                                if((C = car(L=cdr(L)))== 0x42 || C == 0x4a) {  /* B, J */
                   11414:                                        Mode = 0;
                   11415:                                }else if(C == 0x49) {   /* I */
                   11416:                                        Mode = 2;
                   11417:                                }else{
                   11418:                                        R=cons(0x1b,R);R=cons(0x28,R);R=cons(C,R);
                   11419:                                }
                   11420:                        }else if (C == 0x26 && length(L)>1 && car(cdr(L))==0x1b) { /* & ESC */
                   11421:                                L=cdr(L);
                   11422:                        }else{
                   11423:                                R=cons(0x1b,R);R=cons(C,R);
                   11424:                        }
                   11425:                }else if(C == 0x0e) {
                   11426:                        Mode = 2;
                   11427:         }else if(C == 0x0f) {
                   11428:             Mode = 0;
                   11429:                }else if(Mode == 1 && C>0x20 && C<0x7f && length(L)>1) {        /* JIS KANJI */
                   11430:                        D=car(L=cdr(L));
                   11431:                        if(D>0x20 && D<0x7f) {
                   11432:                                R=cons(ior(C,0x80),R);R=cons(ior(D,0x80),R);
                   11433:                        } else return 0;
                   11434:                }else if(Mode == 2 && C > 0x1f && C < 0x60) {                   /* JIS KANA */
                   11435:                        R=cons(0x8e,R);  R=cons(ior(C,0x80),R);
                   11436:                }else if(((C>0x80 && C<0xa0) || (C>0xdf && C<0xf0)) && length(L)>1) {   /* ShiftJIS */
                   11437:                        D=car(L=cdr(L));
                   11438:                        if(D>0x3f && D<0xfd && D!=0x7f) {
                   11439:                                T=sjis2jis([C,D]);
                   11440:                                R=cons(ior(T[0],0x80),R); R=cons(ior(T[1],0x80),R);
                   11441:                        }else return 0;
                   11442:                }else if(C>0x9f && C<0xe0) {            /* HanKana */
                   11443:                        R=cons(0x8e,R);  R=cons(C,R);
                   11444:                }else if(C == 0x0a){
                   11445:                        CR++;
                   11446:                }else if(C == 0x0d){
                   11447:                        R=cons(0x0d,R);
                   11448:                        CR=0;
                   11449:                }else{
                   11450:                        while(CR-->0) R=cons(0x0d,R);
                   11451:                        R=cons(C,R);
                   11452:                }
                   11453:        }
                   11454:        while(CR-->0) R=cons(0x0d,R);
                   11455:        return asciitostr(reverse(R));
                   11456: }
                   11457:
                   11458: def s2sjis(S)
                   11459: {
                   11460:        for(R=[],CR=0,L=strtoascii(S);L!=[];L=cdr(L)){
                   11461:                if((C=car(L)) == 0x1b && length(L)>1) {
                   11462:                        if((C=car(L=cdr(L)))==0x24 && length(L)>1){     /* $ */
                   11463:                                if((C = car(L=cdr(L))) == 0x40 || C == 0x42) {  /* @, B */
                   11464:                                        Mode = 1;
                   11465:                                } else return 0;
                   11466:                        }else if(C == 0x28 && length(L)>1) {    /* ( */
                   11467:                                if((C = car(L=cdr(L)))== 0x42 || C == 0x4a) {  /* B, J */
                   11468:                                        Mode = 0;
                   11469:                                }else if(C == 0x49) {   /* I */
                   11470:                                        Mode = 2;
                   11471:                                }else{
                   11472:                                        R=cons(0x1b,R);R=cons(0x28,R);R=cons(C,R);
                   11473:                                }
                   11474:                        }else if (C == 0x26 && length(L)>1 && car(cdr(L))==0x1b) { /* & ESC */
                   11475:                                L=cdr(L);
                   11476:                        }else{
                   11477:                                R=cons(0x1b,R);R=cons(C,R);
                   11478:                        }
                   11479:                }else if(C == 0x0e) {
                   11480:                        Mode = 2;
                   11481:         }else if(C == 0x0f) {
                   11482:             Mode = 0;
                   11483:                }else if(Mode == 1 && C>0x20 && C<0x7f && length(L)>1) {        /* JIS KANJI */
                   11484:                        D=car(L=cdr(L));
                   11485:                        if(D>0x20 && D<0x7f) {
                   11486:                                T=jis2sjis([C,D]);
                   11487:                                R=cons(T[0],R);R=cons(T[1],R);
                   11488:                        } else return 0;
                   11489:                }else if(Mode == 2 && C > 0x1f && C < 0x60) {                   /* JIS KANA */
                   11490:                        R=cons(ior(C,0x80),R);
                   11491:                }else if(C>0xa0 && C<0xff && length(L)>1) {                             /* EUC */
                   11492:                        D=car(L=cdr(L));
                   11493:                        if(D>0xa0 && D<0xff) {
                   11494:                                T=jis2sjis([iand(C,0x7f),iand(D,0x7f)]);
                   11495:                                R=cons(T[0],R);R=cons(T[1],R);
                   11496:                        }else return 0;
                   11497:                }else if(C == 0x0a){
                   11498:                        CR++;
                   11499:                }else if(C == 0x0d){
                   11500:                        R=cons(0x0a,R);R=cons(0x0d,R);
                   11501:                        CR=0;
                   11502:                }else{
                   11503:                        while(CR-->0){
                   11504:                                R=cons(0x0a,R);R=cons(0x0d,R);
                   11505:                        }
                   11506:                        R=cons(C,R);
                   11507:                }
                   11508:        }
                   11509:        while(CR-->0){
                   11510:                R=cons(0x0a,R);R=cons(0x0d,R);
                   11511:        }
                   11512:        return asciitostr(reverse(R));
                   11513: }
                   11514:
                   11515: def r2ma(S)
                   11516: {
                   11517:        return evalma(S|inv=1);
                   11518: }
                   11519:
                   11520: def evalma(S)
                   11521: {
                   11522:        L0=["\n","\d","{","}","[","]","Log","Exp","Sinh","Cosh","Tanh","Sin","Cos","Tan",
                   11523:                "ArcSin","ArcCos","ArcTan"];
                   11524:        L1=["",  ""  ,"[","]","(",")","log","exp","sinh","cosh","tanh","sin","cos","tan",
                   11525:                "asin",  "acos", "atan"];
                   11526:        if(getopt(inv)==1){
                   11527:                if(type(S)==6) S=m2ll(S);
                   11528:                else if(type(S)==5) S=vtol(S);
                   11529:                if(type(S)==4){
                   11530:                        for(L=[];S!=[];S=cdr(S)){
                   11531:                                if(type(car(S))==6) L=cons(m2ll(car(S)),L);
                   11532:                                else if(type(car(S))==5) L=cons(vtol(car(S)),L);
                   11533:                                else L=cons(car(S),L);
                   11534:                        }
                   11535:                        S=reverse(L);
                   11536:                }else return 0;
                   11537:                return str_subst(rtostr(S),cdr(cdr(L1)),cdr(cdr(L0)));
                   11538:        }
                   11539:        if(S==0){
                   11540:                print("Mathematica text (terminated by ;) ?");
                   11541:                purge_stdin();
                   11542:                Tb=str_tb(0,0);
                   11543:                for(;;){
                   11544:                        S=get_line();
                   11545:                        str_tb(S,Tb);
                   11546:                        if(str_char(S,0,";")>=0) break;
                   11547:                }
                   11548:                S=str_tb(0,Tb);
                   11549:        }
                   11550: /*
                   11551:        while((P=str_chr(S,0,";"))>=0){
                   11552:                V0=evalma(str_cut(S,0,P+1));
                   11553:                S=str_cut(S,P+1,length(S));
                   11554:        }
                   11555:        if((P=str_char(S,0,"="))>=0){
                   11556:                X=strtoascii(str_cut(S,0,P));
                   11557:                L=length(X);
                   11558:                for(P0=P1=-1,I=0;I<L;I++){
                   11559:                        if(L(I)<=32) continue;
                   11560:                        if(isalphanum(L[I])){
                   11561:                                if(P0<0){
                   11562:                                        if(isnum(L[I])) break;
                   11563:                                        P0=I;
                   11564:                                }
                   11565:                                else if(P1!=I+1) break;
                   11566:                                P1=I;
                   11567:                        }
                   11568:                }
                   11569:                if(I==L && P0>=0){
                   11570:                        for(I==P0;I-->0;) X=cdr(X);
                   11571:                        if((X0=car(X))>96) X0-=32;
                   11572:                        Y=[X0];X=cdr(X);
                   11573:                        for(I=P1-P0;I-->0;X=cdr(X))
                   11574:                                Y=cons(car(X),Y);
                   11575:                        Y=cons(61,Y);
                   11576:                        Var=asciitostr(reverse(Y));
                   11577:                        S=str_cut(S,P,length(S));
                   11578:                }
                   11579:        }
                   11580: */
                   11581:        S=eval_str(str_subst(S,L0,L1));
                   11582:        if(type(S)==4){
                   11583:                for(L=-1,T=S;T!=[];T=cdr(T)){
                   11584:                        if(type(T0=car(T))>4) break;
                   11585:                        if(type(T0)<4){
                   11586:                                if(L>=0) break;
                   11587:                                L=-2;continue;
                   11588:                        }
                   11589:                        if(L<-2) break;
                   11590:                        if(L==-1) L=length(T0);
                   11591:                        else if(L!=length(T0)) break;
                   11592:                }
                   11593:                if(T==[]){
                   11594:                        if(L>0) S=s2m(S);
                   11595:                        else S=ltov(S);
                   11596:                }
                   11597:        }
                   11598: /*
                   11599:        if(S==0 && V0!=0) return V0;
                   11600:        if(type(Var)==7){
                   11601:                T=rtostr(S);
                   11602:                if(type(S)==7) T="\""+T+"\"";
                   11603:                S=eval_str(Var+T);
                   11604:                mycat(["Define",Var]);
                   11605:        }
                   11606: */
                   11607:        return S;
                   11608: }
                   11609:
1.73      takayama 11610: def evalcoord(L)
                   11611: {
                   11612:        if(type(L)==7) L=strtoascii(L);
                   11613:        I=str_str(L,"(");
                   11614:        if(I>=0) J=str_pair(L,I+1,"(",")");
                   11615:        if(I<0 || J<I) return [0,[]];
                   11616:        for(F=1,K=I+1;K<J;K++){
                   11617:                C=L[K];
                   11618:                if(C>32&&(C<40||C>58)){F=0;break;}
                   11619:        }
                   11620:        S0=str_cut(L,I+1,J-1);
                   11621:        for(;J>=0;J--) L=cdr(L);
                   11622:        while(L!=[]&&car(L)<33) L=cdr(L);
                   11623:        if(F){
                   11624:                S="["+S0+"]";
                   11625:                return [eval_str(S),L];
                   11626:        }else return [[S0],L];
                   11627: }
                   11628:
                   11629: def readTikZ(L)
                   11630: {
                   11631:        if(type(L)!=4) L=strtoascii(L);
                   11632:        R=[];
1.75      takayama 11633:        CMD=["draw","fill","filldraw","shade","shadedraw","clip","pattern","node","begin"];
1.73      takayama 11634:        while(L!=0&&L!=[]){
                   11635:                while(L!=[]&&car(L)<33) L=cdr(L);
                   11636:                if(L==[]) break;
1.75      takayama 11637:                if(car(L)==34){                                                 /* % */
1.73      takayama 11638:                        while(L!=[]&&car(L)!=10) L=cdr(L);
                   11639:                        continue;
                   11640:                }
1.75      takayama 11641:                if(car(L)!=92) {L=0;break;}                             /* \ */
                   11642:                for(DF=0;DF<9;DF++) if(str_str(L,CMD[DF]|top=1,end=1)==1) break;
                   11643:                if(DF<7){
1.73      takayama 11644:                        S=T=0;
                   11645:                        I=str_str(L,"(");J=str_str(L,"[");
                   11646:                        if(J>0&&I>J){
                   11647:                                K=str_str(L,"]");
                   11648:                                S=str_cut(L,J+1,K-1);
                   11649:                        }
                   11650:                        F0=F=0;C=[];
                   11651:                        while(L!=0&&L!=[]){
                   11652:                                V=evalcoord(L);
                   11653:                                L=V[1];
                   11654:                                if(L==[]) break;
                   11655:                                if(F0){
                   11656:                                        if (!F) C=cons(0,C);
                   11657:                                        else if(F0!=3) C=cons(1,C);
                   11658:                                }
                   11659:                                C=cons(V[0],C);
                   11660:                                F0=F;F=0;
                   11661:                                if(L[0]==34){                                           /* % */
                   11662:                                        while(L!=[]&&car(L)!=10) L=cdr(L);
                   11663:                                        continue;
                   11664:                                }
                   11665:                                if(!str_str(L,"..")){                   /* .. */
                   11666:                                        L=cdr(L);L=cdr(L);
                   11667:                                        F=1;
                   11668:                                }else if(!str_str(L,"--")){             /* -- */
                   11669:                                        L=cdr(L);L=cdr(L);
                   11670:                                        F=2;
                   11671:                                }
                   11672:                                while(L!=[]&&car(L)<33) L=cdr(L);
                   11673:                                if(L==[]){L=0; break;}
                   11674:                                if(!str_str(L,"cycle")){
                   11675:                                        if(F==2) C=cons(1,C);
                   11676:                                        C=cons(-1,C);
                   11677:                                        F0=F=0;
                   11678:                                        continue;
                   11679:                                }
                   11680:                                if(!str_str(L,"and")||!str_str(L,"control"))
                   11681:                                        F=3;                            /* control, and */
                   11682:                                else if(car(L)==59){                    /* ; */
                   11683:                                        L=cdr(L);
                   11684:                                        break;
                   11685:                                }else if(isalpha(car(L))){
1.75      takayama 11686:                                        T=[];
1.73      takayama 11687:                                        while(car(L)!=40 && car(L)!=59){ /* ( ; */
                   11688:                                                T=cons(car(L),T);
                   11689:                                                if((L=cdr(L))==[]){L=0;break;}
                   11690:                                        }
                   11691:                                        T=asciitostr(reverse(T));
1.75      takayama 11692:                                        if(car(L)==59){ /* ; */
1.73      takayama 11693:                                                L=cdr(L);
                   11694:                                                break;
                   11695:                                        }
                   11696:                                        F0=0;continue;
                   11697:                                }else if(F!=1&&F!=2){
                   11698:                                        L=0;break;
                   11699:                                }
                   11700:                        }
                   11701:                        if(T){
1.75      takayama 11702:                                if(length(C)==1||length(C)==2) S=(!S)?["",T]:[S,T];
                   11703:                                else{
                   11704:                                        L=0;break;
                   11705:                                }
1.74      takayama 11706:                        }
                   11707:                        S=(!S)? []:[["opt",S]];
1.75      takayama 11708:                        if(DF) S=S=cons(["cmd",CMD[DF]],S);
                   11709:                        if(T&&length(C)) R=cons((length(C)==1)?[3,S,C[0],DF]:[3,S,C[1],C[0]],R);
                   11710:                        else  R=cons([1,S,reverse(C)],R);
                   11711:                }else{ /*  \node  */
1.73      takayama 11712:                        U=0;
                   11713:                        I=str_str(L,"(");J=str_str(L,"[");
                   11714:                        if(J>0&&I>J){
                   11715:                                K=str_str(L,"]");
                   11716:                                U=str_cut(L,J+1,K-1);
                   11717:                        }
                   11718:                        V=evalcoord(L);
                   11719:                        C=V[0];L=V[1];
                   11720:                        J=str_str(L,"{");K=str_pair(L,J+1,"{","}");
                   11721:                        S=str_cut(L,J+1,K-1);
                   11722:                        if(U) S=[U,S];
1.75      takayama 11723:                        R=cons([2,[],C,[S]],R);
1.73      takayama 11724:                        for(;K>=0;K--) L=cdr(L);
                   11725:                        K=str_str(L,";");
                   11726:                        for(;K>=0;K--) L=cdr(L);
1.75      takayama 11727:                };
1.73      takayama 11728:        }
                   11729:        if(!L){
                   11730:                mycat("Can't understand!");
                   11731:                return -1;
                   11732:        }
1.75      takayama 11733:        return reverse(R);
1.73      takayama 11734: }
                   11735:
1.6       takayama 11736: def i2hex(N)
                   11737: {
                   11738:        Opt=getopt();
                   11739:        if(type(N)==4 && isint(car(N))){
                   11740: #ifdef USEMODULE
                   11741:                L=mtransbys(os_md.i2hex,N,[]|option_list=Opt);
                   11742: #else
                   11743:                L=mtransbys(i2hex,N,[]|option_list=Opt);
                   11744: #endif
                   11745:                return rtostr(L);
                   11746:        }
                   11747:        if(!isint(N) || N<0) return 0;
                   11748:        if(!N) L=[];
                   11749:        else{
                   11750:                Cap=(getopt(cap)==1)?32:0;
                   11751:                for(L=[];N!=0;N=ishift(N,4)){
                   11752:                        J=iand(N,15);
                   11753:                        L=cons(((J>9)?(87-Cap):48)+J,L);
                   11754:                }
                   11755:        }
                   11756:        if(!isint(Min=getopt(min))) Min=2;
                   11757:        for(Min-=length(L);Min-->0;)
                   11758:                L=cons(48,L);
                   11759:        if(getopt(num)==1){
                   11760:                L=cons(120,L);L=cons(48,L);
                   11761:        }
                   11762:        return asciitostr(L);
                   11763: }
                   11764:
                   11765: def sjis2jis(L)
                   11766: {
                   11767:        L1=L[1];
                   11768:        if((L0=L[0])<=0x9f){
                   11769:                if(L1<0x9f) L0=L0*2-0xe1;
                   11770:                else L0=(L0*2)-0xe0;
                   11771:        }else{
                   11772:                if(L1<0x9f) L0=L0*2-0x161;
                   11773:                else L0=L0*2-0x160;
                   11774:        }
                   11775:        if(L1<0x7f) return [L0,L1-0x1f];
                   11776:        else if(L1<0x9f) return [L0,L1-0x20];
                   11777:        return [L0,L1-0x7e];
                   11778: }
                   11779:
                   11780: def jis2sjis(L)
                   11781: {
                   11782:        L1=L[1];
                   11783:        if(iand(L0=L[0],1)){
                   11784:                if(L1<0x60) L=[L1+0x1f];
                   11785:                else L=[L1+0x20];
                   11786:        }else L=[L1+0x7e];
                   11787:        if(L0<0x5f) return cons(ishift(L0+0xe1,1),L);
                   11788:        return cons(ishift(L0+0x161,1),L);
                   11789: }
                   11790:
                   11791: def verb_tex_form(P)
                   11792: {
                   11793:        L = reverse(strtoascii(rtostr(P)));
                   11794:        for(SS = []; L != []; L = cdr(L)){
                   11795:                Ch = car(L);  /* ^~\{} */
                   11796:                if(Ch == 92 || Ch == 94 || Ch == 123 || Ch == 125 || Ch == 126){
                   11797:                        SS = append([92,Ch,123,125],SS); /* \Ch{}  */
                   11798:                        if(Ch != 94 && Ch != 126)        /* \char` */
                   11799:                                SS = append([92,99,104,97,114,96],SS);
                   11800:                        continue;
                   11801:                }
                   11802:                SS = cons(Ch, SS);
                   11803:                if((Ch >= 35 && Ch <= 38) || Ch == 95)  /* #$%&_ */
                   11804:                        SS = cons(92, SS);  /* \Ch */
                   11805:        }
                   11806:        return asciitostr(SS);
                   11807: }
                   11808:
                   11809: def tex_cuteq(S,P)
                   11810: {
                   11811:        if(P==0) return 0;
                   11812:        if(S[P]==125){ /* } */
                   11813:                if((Q=str_pair(S,P-1,"{","}"|inv=1))<0) return -1;
                   11814:                if(Q<2||S[Q-1]!=95) return Q;
                   11815:                return tex_cuteq(S,Q-2);
                   11816:        }
                   11817:        if(!isalphanum(S[Q=P--])) return -1;
                   11818:        while(P>0&&isalphanum(S[P])) P--;
                   11819:        if(S[P]==92){ /* \ */
                   11820:                if(P==0) return P;
                   11821:                else P--;
                   11822:        }
                   11823:        if(S[P]!=95||P==0) return Q; /* _ */
                   11824:        return tex_cuteq(S,P-1);
                   11825: }
                   11826:
                   11827:
                   11828: def texket(S)
                   11829: {
                   11830:        if(!isint(F=getopt(all))) F=0;
                   11831:        if(type(S)==7){
                   11832:                L=str_len(S);
                   11833:                SS=strtoascii(S);
                   11834:        }else{
                   11835:                L=length(S);
                   11836:                SS=S;
                   11837:        }
                   11838:        for(T="",I=I0=0;I<L-1;){
                   11839:                J=str_char(SS,I,"(");
                   11840:                if(J<0) break;
                   11841:                if(J<L-1 && J>4 && str_str(SS,"\\left"|top=J-5,end=J-1)>=0){
                   11842:                        I=J+1;continue;
                   11843:                }
                   11844:                if((K=str_pair(SS,J+1,"(",")"))>=0){
                   11845:                        KK=str_char(SS,J+2,"(");
                   11846:                        if(KK>K||KK<0){
                   11847:                                if(F!=1){
                   11848:                                        if(!F){
                   11849:                                                for(N=J+1;N<K;N++)      /* + - _   { } */
                   11850:                                                        if(!isalphanum(P=SS[N])&&findin(P,[32,43,45,95,123,125])<0) break;
                   11851:                                        }else N=K;
                   11852:                                        if(N==K){
                   11853:                                                I=K+1;continue;
                   11854:                                        }
                   11855:                                }
                   11856:                                T=T+str_cut(SS,I0,J-1)+"\\left"+str_cut(SS,J,K-1)+"\\right)";
                   11857:                                I0=I=K+1;
                   11858:                        }else{
                   11859:                                T=T+str_cut(SS,I0,J-1)+"\\left("+texket(str_cut(SS,J+1,K-1)|all=F) +"\\right)";
                   11860:                                I0=I=K+1;
                   11861:                        }
                   11862:                }else break;
                   11863:        }
                   11864:        return T+str_cut(SS,I0,L);
                   11865: }
                   11866:
                   11867:
                   11868: def my_tex_form(S)
                   11869: {
                   11870:        if(getopt(skip) != 1){
                   11871:                if(type(S)==1 && S<0)   return "-"+print_tex_form(-S);
                   11872:                if(type(S)==6) return mtotex(S);
                   11873:                S = print_tex_form(S);
                   11874:                for(F=Top=0;(L=str_str(S,"\\verb`"|top=Top))>=0;Top=LV+1){
                   11875:                        F++;
                   11876:                        if(Top==0)      Tb = string_to_tb("");
                   11877:                        LV = str_chr(S, L+6, "`");
                   11878:                        if(LV<0)        LV=str_len(S);
                   11879:                        str_tb([my_tex_form(sub_str(S, Top, L-1)|skip=1), "\\texttt{"], Tb);
                   11880:                        str_tb([verb_tex_form(sub_str(S,L+6, LV-1)),"}"], Tb);
                   11881:                        Top=LV+1;
                   11882:                }
                   11883:                if(F>0){
                   11884:                        str_tb(my_tex_form(sub_str(S, Top,str_len(S)-1)|skip=1), Tb);
                   11885:                        return tb_to_string(Tb);
                   11886:                }
                   11887:        }
                   11888:        if(S==0) return "";
                   11889:        S = ltov(strtoascii(S));
                   11890:        L = length(S)-1;
                   11891:        while(L >= 1 && S[L] == 10)
                   11892:                L--;
                   11893:        if((Fr=getopt(frac))!=0 && Fr!=1) Fr=2;
                   11894:        for(I = L+1, T = K = 0, SS = []; --I >= 0; ){
                   11895:                if(S[I] == 32 && I!=L){
                   11896:                        if(I==L) continue;
                   11897:                        if(findin(S[I+1], [32,40,41,43,45,123,125]) >= 0  /* " ()+-{}" */
                   11898:                                || (S[I+1] >= 49 && S[I+1] <= 57))  /* 1 - 9 */
                   11899:                                        if(I == 0 || S[I-1] >= 32) continue;
                   11900:                }
                   11901:                if(Fr && S[I]>=48 && S[I]<=57){ /* 2/3 -> \tfrac{2}{3} */
                   11902:                        for(K=0,II=I; II>=0; II--){
                   11903:                                if(S[II]>=48 && S[II]<=57) continue;
                   11904:                                if(S[II]==47){  /* / */
                   11905:                                        if(K>0) break;
                   11906:                                        K=II;
                   11907:                                }else break;
                   11908:                        }
                   11909:                        if(K>II+1){
                   11910:                                SS=cons(125,SS);
                   11911:                                for(J=I; J>K; J--) SS=cons(S[J],SS);
                   11912:                                if(AMSTeX){
                   11913:                                        SS=cons(123,SS);SS=cons(125,SS);
                   11914:                                }else{
                   11915:                                        for(J=[114,101,118,111,92];J!=[];J=cdr(J))      /* \over */
                   11916:                                                SS=cons(car(J),SS);
                   11917:                                }
                   11918:                                for(J=K-1;J>II;J--) SS=cons(S[J],SS);
                   11919:                                SS=cons(123,SS);
                   11920:                                if(AMSTeX){
                   11921:                                        J=(Fr==2)?[99,97,114,102,116,92]:[99,97,114,102,92];
                   11922:                                        for(;J!=[];J=cdr(J))    /* \tfrac */
                   11923:                                                SS=cons(car(J),SS);
                   11924:                                }
                   11925:                                I=II+1;
                   11926:                        }else{
                   11927:                                for(;I>II;I--) SS = cons(S[I], SS);
                   11928:                                I++;
                   11929:                        }
                   11930:                        continue;
                   11931:                }
                   11932:                SS = cons(S[I], SS);
                   11933:        }
1.52      takayama 11934:        SS=str_subst(SS,"\n\\\\\n\\end{pmatrix}","\n\\end{pmatrix}"|raw=1);
1.6       takayama 11935:        SS=str_subst(SS,"\\\\\n\\end{pmatrix}","\n\\end{pmatrix}"|raw=1);
                   11936:        Subst=getopt(subst);
                   11937:        Sub0=["{asin}","{acos}","{atan}"];
                   11938:        Sub1=["\\arcsin ","\\arccos","\\arctan "];
                   11939:        if(type(Subst) == 4){
                   11940:                Sub0=append(Sub0,Subst[0]);Sub1=append(Sub1,Subst[1]);
                   11941:        }
                   11942:        SS = str_subst(SS,Sub0,Sub1|raw=1);
                   11943:        S = ltov(SS);
                   11944:        L = length(S);
                   11945:        SS = [];
                   11946:        while(--L >= 0){
                   11947:                if(S[I=L] == 125){
                   11948:                        while(--I >= 0 && S[I] == 125);
                   11949:                        J = 2*I - L;
                   11950:                        if(J >= 0 && S[I] != 123){
                   11951:                                for(K = J; K < I && S[K] == 123; K++);
                   11952:                                if(K == I){
                   11953:                                        if(J-- <= 0 || S[J] < 65 || S[J] > 122 || (S[J] > 90 && S[J] < 97)){
                   11954:                                                SS = cons(S[I],SS);
                   11955:                                                L = J+1;
                   11956:                                                continue;
                   11957:                                        }
                   11958:                                }
                   11959:                        }
                   11960:                }
                   11961:                SS = cons(S[L],SS);
                   11962:        }
                   11963:        RT=getopt(root);
                   11964:        for(Top=0;;Top++){      /* ((x+1))^{y} , 1/y=2,3,...,9 */
                   11965: #if 1
                   11966:                P=str_str(SS,["))^","^{\\tfrac{1}"]|top=Top);
                   11967:                if(P[0]<0) break;
                   11968:                Sq=0;
                   11969:                if(P[0]==0){
                   11970:                        P=P[1];
                   11971:                        if((Q=str_pair(SS,P,"(",")"|inv=1))<0||SS[Q+1]!=40) continue;
                   11972:                        if((RT==2||(RT!=0 && P-Q<33)) && str_str(SS,"{\\tfrac{1}"|top=P+3,end=P+3)==P+3
                   11973:                        && SS[P+14]==125){
                   11974:                                if((Sq=SS[P+13]-48)<2||Sq>9) Sq=0;
                   11975:                        }
                   11976:                        F=2;
                   11977:                }else{
                   11978:                        P=P[1];
                   11979:                        if(SS[P+12]!=125||(Sq=(SS[P+11]-48))<2||Sq>9) break;
                   11980:                        if(SS[P-1]==125){
                   11981:                                if((Q=str_pair(SS,P-2,"{","}"|inv=1))<0) break;
                   11982:                                if(Q>1&&SS[Q-1]==95){
                   11983:                                        if((Q=tex_cuteq(SS,Q-2))<0) break;
                   11984:                                        F=0;
                   11985:                                }else F=1;
                   11986:                        }else{
                   11987:                                if(!isalphanum(SS[Q=P-1]) || (Q=tex_cuteq(SS,Q))<0) break;
                   11988:                                F=0;
                   11989:                        }
                   11990:                        if(RT!=2&&P-Q>32) break;
                   11991:                }
                   11992: #else
                   11993:                if((P=str_str(SS,"))^"|top=Top))<0 || (Q=str_pair(SS,P,"(",")"|inv=1))<0) break;
                   11994:                else F=2;
                   11995:                Sq=0;
                   11996:                if((RT==2||(RT!=0 && P-Q<33)) && str_str(SS,"{\\tfrac{1}"|top=P+3,end=P+3)==P+3
                   11997:                   && SS[P+14]==125){
                   11998:                        if((Sq=SS[P+13]-48)<2||Sq>9) Sq=0;
                   11999:                }
                   12000: #endif
                   12001:                for(I=0,S=[];SS!=[];SS=cdr(SS),I++){
                   12002:                        if(I==Q){
                   12003:                                if(Sq){
                   12004:                                        S=append([116,114,113,115,92],S);
                   12005:                                        if(Sq>2) S=append([93,Sq+48,91],S);
                   12006:                                        S=cons(123,S);
                   12007:                                        if(F==2) SS=cdr(SS);
                   12008:                                        else if(F==0) S=cons(car(SS),S);
1.68      takayama 12009:                                }else if(F==2&&P-Q==3){         /* (2)^x -> 2^x */
1.6       takayama 12010:                                        SS=cdr(SS);SS=cdr(SS);
                   12011:                                        S=cons(123,S);S=cons(car(SS),S);S=cons(125,S);
                   12012:                                        SS=cdr(SS);SS=cdr(SS);
                   12013:                                        I+=3;
                   12014:                                }
                   12015:                                continue;
                   12016:                        }else if(I==P){
                   12017:                                if(Sq){
                   12018:                                        if(F>0) S=cdr(S);
                   12019:                                        S=cons(125,S);
                   12020:                                        if(F==2) SS=cdr(SS);
                   12021:                                        for(J=0;J<12;J++) SS=cdr(SS);
                   12022:                                }
                   12023:                                continue;
                   12024:                        }
                   12025:                        S=cons(car(SS),S);
                   12026:                }
                   12027:                SS=reverse(S);
                   12028:                Top=P;
                   12029:        }
1.68      takayama 12030:     for(F=G=0,S=[];SS!=[];SS=cdr(SS)){  /* 22^x -> 2\cdot 2^x */
                   12031:                if(F==1&&G!=-1&&car(SS)==123 && length(SS)>1 && isnum(SS[1]))
                   12032:                        S=append([116,111,100,99,92],S);
                   12033:                G=F;
                   12034:                if(car(SS)==125||car(SS)==95) F=-1;
                   12035:                else F=isnum(car(SS));
                   12036:                S=cons(car(SS),S);
                   12037:        }
                   12038:        S=asciitostr(reverse(S));
                   12039: /*     S=asciitostr(SS); */
1.6       takayama 12040:        if((K=getopt(ket))==1) S=texket(S);
                   12041:        else if(K==2) S=texket(S|all=1);
                   12042:        return S;
                   12043: }
                   12044:
                   12045: def smallmattex(S)
                   12046: {
                   12047:  return str_subst(S,[["\\begin{pmatrix}","\\left(\\begin{smallmatrix}"],
                   12048:        ["\\end{pmatrix}","\\end{smallmatrix}\\right)"],
                   12049:        ["\\begin{Bmatrix}","\\left\\{\\begin{smallmatrix}"],
                   12050:        ["\\end{Bmatrix}","\\end{smallmatrix}\\right\\}"],
                   12051:        ["\\begin{bmatrix}","\\left[{\\begin{smallmatrix}"],
                   12052:        ["\\end{bmatrix}","\\end{smallmatrix}\\right]"],
                   12053:        ["\\begin{vmatrix}","\\left|\\begin{smallmatrix}"],
                   12054:        ["\\end{vmatrix}","\\end{smallmatrix}\\right|"],
                   12055:        ["\\begin{Vmatrix}","\\left\\|\\begin{smallmatrix}"],
                   12056:        ["\\end{Vmatrix}","\\end{smallmatrix}\\right\\|"],
                   12057:        ["\\begin{matrix}","\\begin{smallmatrix}"],
                   12058:        ["\\end{matrix}","\\end{smallmatrix}"]],0);
                   12059: }
                   12060:
                   12061:
                   12062: def divmattex(S,T)
                   12063: {
                   12064:        TF=["matrix","pmatrix","Bmatrix","bmatrix","vmatrix","Vmatrix"];
                   12065:        TG=[0,"(","\\{","[","|","\\|"];
                   12066:        TH=[0,")","\\}","]","|","\\|"];
                   12067:        if(type(S)!=7) S=mtotex(S);
                   12068:        S=strtoascii(S0=S);
                   12069:        if((P0=str_str(S,"\\begin{"))<0 || (P1=str_str(S,"}"|top=P0+7))<0)
                   12070:                return S0;
                   12071:        F=str_cut(S,P0+7,P1-1);
                   12072:        if((K=findin(F,TF))<0) return S0;
                   12073:        Q=str_str(S,"\\end{"+F+"}");
                   12074:        if(Q<0) return S0;
                   12075:        for(J=P1+1;S[J]<33;J++);
                   12076:        for(L0=L=[],I=J;J<Q;J++){
                   12077:                if(S[J]==38){   /* & */
                   12078:                        if(I>=J) L0=cons(0,L0);
                   12079:                        else L0=cons(str_cut(S,I,J-1),L0);
                   12080:                        I=J+1;
                   12081:                }
                   12082:                if(S[J]==92&&S[J+1]==92){ /* \\ */
                   12083:                        if(I>=J) L0=cons(0,L0);
                   12084:                        else L0=cons(str_cut(S,I,J-1),L0);
                   12085:                        L=cons(reverse(L0),L);
                   12086:                        L0=[];
                   12087:                        J++;
                   12088:                        for(I=J+1;S[I]<33;I++);
                   12089:                }
                   12090:        }
                   12091:        J--;
                   12092:        if(S[J]<33) J--;
                   12093:        if(I<=J) L0=cons(str_cut(S,I,J),L0);
                   12094:        if(length(L0)>0) L=cons(reverse(L0),L);
                   12095:        L=lv2m(reverse(L));     /* get matrix */
                   12096:        if(T==0) return L;
1.26      takayama 12097:        if(type(T)==1) T=[T];
1.6       takayama 12098:        Size=size(L);S0=Size[0];
                   12099:        if(type(T[0])!=4){
                   12100:                S1=Size[1];
                   12101:                T=append(T,[S1]);
                   12102:                for(TT=[],I=0;T!=[];T=cdr(T)){
                   12103:                        J=car(T);
                   12104:                        if(J>S1) J=S1;
                   12105:                        for(T0=[];J>I;J--) T0=cons(J-1,T0);
                   12106:                        if(T0!=[]) TT=cons(T0,TT);
                   12107:                        I=car(T);
                   12108:                }
                   12109:                T=reverse(TT);
                   12110:        }
                   12111:        SS=length(T);
                   12112:        St=str_tb(0,0);
                   12113:        if(SS==1) St=str_tb("\\begin{"+F+"}\n",St);
                   12114:        else{
                   12115:                if(K>0) St=str_tb("&\\left"+TG[K],St);
                   12116:                St=str_tb("\\begin{matrix}\n",St);
                   12117:        }
                   12118:        for(;T!=[];T=cdr(T)){
                   12119:                for(I=0;I<S0;I++){
                   12120:                        for(J=0,TT=car(T);TT!=[];TT=cdr(TT),J++){
                   12121:                                if(J>0) St=str_tb("&",St);
                   12122:                                if(L[I][car(TT)]!=0) St=str_tb(L[I][car(TT)],St);
                   12123:                        }
                   12124:                        if(I<S0-1) St=str_tb("\\\\",St);
                   12125:                        St=str_tb("\n",St);
                   12126:                }
                   12127:                if(length(T)>1)
                   12128:                        St=str_tb("\\end{matrix}\\right.\\\\\n&\\quad\\left.\\begin{matrix}\n",St);
                   12129:                else{
                   12130:                        if(SS==1) St=str_tb("\\end{"+F+"}\n",St);
                   12131:                        else St=str_tb("\\end{matrix}\\right"+TH[K]+"\n",St);
                   12132:                }
                   12133:        }
                   12134:        S=str_tb(0,St);
                   12135:        if(SS==1) return S;
                   12136:        return texbegin("align*",S);
                   12137: }
                   12138:
                   12139: def str_subst(S, L0, L1)
                   12140: {
                   12141:        if(type(S) == 7)
                   12142:                S = strtoascii(S);
                   12143:        if(type(S) == 4)
                   12144:                S = ltov(S);
                   12145:        SE = length(S);
                   12146:        if(L1 == 0){
                   12147:                for(L1 = L = [], L0 = reverse(L0); L0 != []; L0 = cdr(L0)){
                   12148:                        L  = cons(car(L0)[0], L);
                   12149:                        L1 = cons(car(L0)[1], L1);
                   12150:                }
                   12151:                L0 = L;
                   12152:        }
                   12153:        if(type(L0)==7) L0 = [strtoascii(L0)];
                   12154:        else{
                   12155:                for(LT = []; L0 != []; L0 = cdr(L0))
                   12156:                        LT = cons(strtoascii(car(L0)), LT);
                   12157:                L0 = ltov(LT);
                   12158:        }
                   12159:        E0 = length(L0);
                   12160:        if(type(L1)==7) L1 = [strtoascii(L1)];
                   12161:        else{
                   12162:                for(LT = []; L1 != []; L1 = cdr(L1))
                   12163:                        LT = cons(strtoascii(car(L1)), LT);
                   12164:                L1 = ltov(LT);
                   12165:        }
                   12166:        if(getopt(inv)==1){
                   12167:                L2=L0;L0=L1;L0=L2;
                   12168:        }
                   12169:        if((SJIS=getopt(sjis))!=1) SJIS=0;
                   12170:        for(J = JJ = 0, ST = []; J < SE; J++){
                   12171:                SP = S[J];
                   12172:                for(I = E0-1; I >= 0; I--){
                   12173:                        if(SP != L0[I][0] || J + (K = length(L0[I])) > SE)
                   12174:                                continue;
                   12175:                        while(--K >= 1)
                   12176:                                if(L0[I][K] != S[J+K]) break;
                   12177:                        if(K > 0) continue;
                   12178:                        for(KE = length(L1[I]), K = 0 ;K < KE; K++)
                   12179:                                ST = cons(L1[I][K],ST);
                   12180:                        J += length(L0[I])-1;
                   12181:                        break;
                   12182:                }
                   12183:                if(I < 0){
                   12184:                        ST = cons(S[J],ST);
                   12185:                        if(SJIS && (V=S[J])>128){
                   12186:                                if(V<160 || (V>223 && V<240)) ST = cons(S[J++],ST);
                   12187:                        }
                   12188:                }
                   12189:        }
                   12190:        if(getopt(raw)==1) return reverse(ST);
                   12191:        return asciitostr(reverse(ST));
                   12192: }
                   12193:
                   12194: def dviout0(L)
                   12195: {
1.70      takayama 12196:        Cmd=["TikZ","TeXLim","TeXEq","DVIOUT","XYPrec","XYcm","XYLim","Canvas","TeXPages"];
1.6       takayama 12197:        if(type(Opt=getopt(opt))==7){
                   12198:                if((F=findin(Opt,Cmd)) < 0) return -1;
                   12199:                if(L==-1){
                   12200:                        if(F<=3){
                   12201:                                if(F==0) V=TikZ;
                   12202:                                else if(F==1) V=TeXLim;
                   12203:                                else if(F==2) V=TeXEq;
                   12204:                                else V=iand(DVIOUTF,1);
                   12205:                        }else{
                   12206:                                if(F==4) V=XYPrec;
                   12207:                                else if(F==5) V=XYcm;
                   12208:                                else if(F==6) V=XYLim;
1.70      takayama 12209:                                else if(F==7) V=Canvas;
                   12210:                                else if(F==8) V=TeXPages;
1.6       takayama 12211:                        }
                   12212:                        return V;
                   12213:                }
                   12214:                if(F==0) TikZ=L;
                   12215:                else if(F==2) TeXEq=L;
                   12216:                else if(F==3){
                   12217:                        if(iand(DVIOUTF,1)==L)
                   12218:                                mycat0(["DVIOUTA=\"", DVIOUTA,"\""],1);
                   12219:                        else dviout0(4);
                   12220:                        return 1;
                   12221:                }else if(F==7&&type(L)==4)
                   12222:                        Canvas=L;
                   12223:                else if(L>0){
                   12224:                        if(F==1) TeXLim=L;
                   12225:                        else if(F==4) XYPrec=L;
                   12226:                        else if(F==5) XYcm=L;
                   12227:                        else if(F==6) XYLim=L;
1.70      takayama 12228:                        else if(F==8) TeXPages=L;
1.6       takayama 12229:                }
                   12230:                mycat0([Cmd[F],"=",L],1);
                   12231:                return 1;
                   12232:        }
                   12233:        if(type(L) == 4){
                   12234:                for( ; L != []; L = cdr(L)) dviout0(car(L));
                   12235:                return 1;
                   12236:        }
                   12237:        if(type(L) == 7){
                   12238:                if(L=="")  dviout(" \n"|keep=1);
                   12239:                else if(L=="cls")  dviout0(0);
                   12240:                else if(L=="show") dviout(" ");
                   12241:                else if(L=="?")    dviout0(3);
                   12242:                else dviout("\\"+L+"\n"|keep=1);
                   12243:                return 1;
                   12244:        }
                   12245:        if(L == 0)
                   12246:                dviout(" "|keep=1,clear=1);
                   12247:        else if(L == 1)
                   12248:                dviout(" ");
                   12249:        else if(L == 2)
                   12250:                dviout(" "|clear=1);
                   12251:        else if(L>10)
                   12252:                dviout("\\setcounter{MaxMatrixCols}{"+rtostr(L)+"}%"|keep=1);
                   12253:        else if(L < 0)
                   12254:                dviout(" "|delete=-L,keep=1);
                   12255:        else if(L == 3){
                   12256:                mycat0(["DIROUT =\"", DIROUT,"\""],1);
                   12257:                mycat0(["DVIOUTH=\"", DVIOUTH,"\""],1);
                   12258:                mycat0(["DVIOUTA=\"", DVIOUTA,"\""],1);
                   12259:                mycat0(["DVIOUTB=\"", DVIOUTB,"\""],1);
                   12260:                mycat0(["DVIOUTL=\"", DVIOUTL,"\""],1);
                   12261:                mycat(["Canvas =", Canvas]);
                   12262:                mycat(["TeXLim =", TeXLim]);
1.70      takayama 12263:                mycat(["TeXPages =", TeXPages]);
1.6       takayama 12264:                mycat(["TeXEq  =", TeXEq]);
                   12265:                mycat(["AMSTeX =", AMSTeX]);
                   12266:                mycat(["TikZ   =", TikZ]);
                   12267:                mycat(["XYPrec =", XYPrec]);
                   12268:                mycat(["XYcm   =", XYcm]);
                   12269:                mycat(["XYLim  =", XYLim]);
                   12270:        }else if(L==4){
                   12271:                Tmp=DVIOUTA; DVIOUTA=DVIOUTB; DVIOUTB=Tmp;
                   12272:                mycat0(["DVIOUTA=\"", DVIOUTA,"\""],1);
                   12273:                DVIOUTF++;
                   12274:        }else if(L==5){
                   12275:                if(!iand(DVIOUTF,1)) dviout0(4);
                   12276:        }else if(L==6){
                   12277:                TikZ=1;mycat("TikZ=1");
                   12278:        }else if(L==7){
                   12279:                TikZ=0;mycat("TikZ=0");
                   12280:        }
                   12281:        return 1;
                   12282: }
                   12283:
                   12284: def myhelp(T)
                   12285: {
                   12286:        /* extern DVIOUT;       */
                   12287:        /* extern HDVI; */
                   12288:        /* extern DVIOUTH;      */
                   12289:
                   12290:        if(type(T)==2){
                   12291:                if(T==getbygrs){
                   12292:                        getbygrs(0,0);
                   12293:                        return 0;
                   12294:                }
                   12295:                else if(T==m2mc){
                   12296:                        m2mc(0,0);
                   12297:                        return 0;
                   12298:                }
                   12299:                else if(T==mgen){
                   12300:                        mgen(0,0,0,0);
                   12301:                        return 0;
                   12302:                }
                   12303:                else T=rtostr(T);
                   12304:        }
                   12305:        if(type(T)==4 && typeT[0]==7){
                   12306:                if(length(T)==2 && type(T[1])==1){
                   12307:                        DVIOUTH="start "+T[0]+" -"+rtostr(T[1])+"-hyper:0x90 \"%ASIRROOT%\\help\\os_muldif.dvi\" #r:%LABEL%";
                   12308:                }else if(str_len(T[0])>2)       DVIOUTH=T[0];
                   12309:                mycat(["DVIOUTH="+DVIOUTH,"\nmyhelp(fn) is set!"]);
                   12310:                return 0;
                   12311:        }
                   12312:        if(T==0){
                   12313:                mycat([
                   12314:                        "myhelp(t) : show help\n",
                   12315: #ifdef USEMODULE
                   12316:                        " t : -1 (dvi), 1 (pdf) or os_md.getbygrs, os_md.m2mc, os_md.mgen\n",
                   12317: #else
                   12318:                        " t : -1 (dvi), 1 (pdf) or getbygrs, m2mc, mgen\n",
                   12319: #endif
                   12320:                        "    \"fn\"    : Help of the function fn\n",
                   12321:                        "    [path,n]  : path of dviout, n = # dviout\n",
                   12322:                        "    [DVIOUTH] : Way to jump to the help of a function\n",
                   12323:                        "       default: start dviout -2 \"%ASIRTOOT%\\help\\os_muldif.dvi\" #r:%LABEL%"
                   12324:                ]);
                   12325:                return 0;
                   12326:        }
                   12327:        if(type(T)==7){
                   12328:                if(str_str(T,"os_md.")==0) T=str_cut(T,6,str_len(T)-1);
                   12329:                Dr=str_subst(DVIOUTH,["%ASIRROOT%","%LABEL%"],[get_rootdir(),"r:"+str_subst(T,"_","")]);
                   12330:                shell(Dr);
                   12331:                return 0;
                   12332:        }
                   12333:        Dr=get_rootdir();
                   12334:        if(T==-1) Dr+="\\help\\os_muldif.dvi";
                   12335:        else Dr+="\\help\\os_muldif.pdf";
                   12336:        if(!isMs()) Dr=str_subst(Dr,"\\","/");
                   12337:        shell(Dr);
                   12338:        return 0;
                   12339: }
                   12340:
                   12341: def isMs()
                   12342: {
                   12343:        if(type(Tmp=getenv("TEMP"))!=7) {
                   12344:        if (type(Tmp=getenv("TMP")) != 7) Tmp=getenv("HOME");
                   12345:     }
                   12346:        if(type(Tmp)==7 && str_chr(Tmp,0,"\\")==2) return 1;
                   12347:        else return 0;
                   12348: }
                   12349:
                   12350: def tocsv(L)
                   12351: {
                   12352:        if(type(L)==6) L=m2ll(L);
                   12353:        else if(type(L)==5) L=vtol(L);
                   12354:        Null=getopt(null);
                   12355:        Tb=str_tb(0,0);
                   12356:        for(LL=L; LL!=[]; LL=cdr(LL)){
                   12357:                LT=car(LL);
                   12358:                if(type(LT)==5) LT=vtol(LT);
                   12359:                if(type(LT)<4) LT=[LT];
                   12360:                for(N=0; LT!=[]; LT=cdr(LT),N++){
1.55      takayama 12361:                        if(N) str_tb(",",Tb);
1.6       takayama 12362:                        if((T=car(LT))==Null) continue;
                   12363:                        if(type(T)==7){
                   12364:                                K=str_len(T);
                   12365:                                T=str_subst(T,["\""],["\"\""]);
                   12366:                                if(str_len(T)>K||str_char(T,0,",")>=0) T="\""+T+"\"";
                   12367:                                str_tb(T,Tb);
                   12368:                        }else str_tb(rtostr(T),Tb);
                   12369:                }
                   12370:                str_tb("\n",Tb);
                   12371:        }
1.16      takayama 12372:        S=str_tb(0,Tb);
                   12373:        if(type(EXE=getopt(exe))!=1&&EXE!=0&&type(EXE)!=7) return S;
                   12374:        if(type(F)!=7){
1.18      takayama 12375:                fcat(-1,0);
1.16      takayama 12376:                F="risaout";
                   12377:                if(EXE>=2&&EXE<=9) F+=rtostr(EXE);
                   12378:                F=DIROUTD+F+".csv";
                   12379:        }else F=S;
                   12380:        if(EXE!=0 && access(F)) remove_file(F);
                   12381:        fcat(F,S|exe=1);
                   12382:        return 1;
1.6       takayama 12383: }
                   12384:
                   12385: def readcsv(F)
                   12386: {
                   12387:        if((ID=open_file(F))<0) return -1;
                   12388:        SJIS=isMs();
                   12389:        L=[];
                   12390:        if(type(V=getopt(eval))!=4){
                   12391:                if(V=="all") V=1;
                   12392:                else if(type(V)==1) V=[V];
                   12393:                else V=[];
                   12394:        }
1.9       takayama 12395:        Eq=getopt(eq);
1.6       takayama 12396:        Sp=getopt(sp);
                   12397:        if(type(T=getopt(col))!=1) T=0;
                   12398:        Null=getopt(null);
1.9       takayama 12399:        if(type(Null)<0) Null=(Eq==1)?0:"";
1.6       takayama 12400:        while((S=get_line(ID))!=0){
                   12401:                S=strtoascii(S);
                   12402:                N=length(S);
                   12403:                for(I=J=F=0,LL=LT=[];I<N;I++){
                   12404:                        C=S[I];
                   12405:                        if(F==0){
                   12406:                                if(C<=32) continue;
                   12407:                                if(C==34){F=2;continue;}
                   12408:                                F=1;
                   12409:                        }
                   12410:                        if(F==2 && C==34){
                   12411:                                if(I<N-1&& S[I+1]==34){
                   12412:                                        LT=cons(34,LT);I++;continue;
                   12413:                                }
                   12414:                                F=-2;
                   12415:                        }
                   12416:                        if(F==1){
                   12417:                                if((C==44&&Sp!=1)||(C<=32&&Sp==1)) F=-1;
                   12418:                                else if(C<32 && C!=9) continue;
                   12419:                        }
                   12420:                        if(SJIS && I<N-1 && ((C>128 && C<160)||(C>223 && C<240))){
                   12421:                                LT=cons(C,LT);LT=cons(S[++I],LT);continue;
                   12422:                        }
                   12423:                        if(F>0){
                   12424:                                LT=cons(C,LT);continue;
                   12425:                        }
                   12426:                        LS=asciitostr(reverse(LT));
1.9       takayama 12427:                        if(V==1||findin(++J,V)>=0){
                   12428:                                if(Eq==1) LS=(LS=="")?Null:eval_str(LS);
                   12429:                                else LS=(isdecimal(LS))?eval_str(LS):((LS=="")?Null:LS);
                   12430:                        }
1.6       takayama 12431:                        if(!T || T==J) LL=cons(LS,LL);
                   12432:                        if(F==-2) while(++I<N && Sp!=1 && S[I]!=44);
                   12433:                        F=0;LT=[];
                   12434:                }
                   12435:                if(I<=N && (Sp!=1 || length(LT)>0)){ /* lastline */
                   12436:                        LS=asciitostr(reverse(LT));
1.9       takayama 12437:                        if(V==1||findin(++J,V)>=0){
                   12438:                                if(Eq==1) LS=(LS=="")?Null:eval_str(LS);
                   12439:                                else LS=(isdecimal(LS))?eval_str(LS):((LS=="")?Null:LS);
                   12440:                        }
1.6       takayama 12441:                        if(!T || T==J) LL=cons(LS,LL);
                   12442:                }
                   12443:                L=cons(reverse(LL),L);
                   12444:        }
                   12445:        close_file(ID);
                   12446:        if(T) L=m2l(L|flat=1);
1.16      takayama 12447:        L=reverse(L);
                   12448:        return L;
1.6       takayama 12449: }
                   12450:
1.55      takayama 12451: def getline(ID)
                   12452: {
                   12453:        if(isint(Maxlen=getopt(Max))>0) Maxlen=1024;
                   12454:        if(type(CR=getopt(CR))!=4) CR=[13];
                   12455:        if(type(LF=getopt(LF))!=4) LF=[10];
                   12456:        S=[];
                   12457:        for(I=0; I<1023; I++){
                   12458:                C=get_byte(ID);
                   12459:                if(C<0) return 0;
                   12460:                if(findin(C,CR)>=0) continue;
                   12461:                if(findin(C,LF)>=0) break;
                   12462:                S=cons(C,S);
                   12463:        }
                   12464:        return asciitostr(reverse(S));
                   12465: }
                   12466:
1.6       takayama 12467: def showbyshell(S)
                   12468: {
                   12469:        Id = getbyshell(S);
                   12470:        if(Id<0) return Id;
                   12471:        while((S=get_line(Id))!=0) print(S,2);
                   12472:        return close_file(Id);
                   12473: }
                   12474:
                   12475:
                   12476: def getbyshell(S)
                   12477: {
                   12478:        /* extern DIROUT;       */
                   12479:
                   12480:        Home=getenv("HOME");
                   12481:        if(type(Home)!=7) Home="";
                   12482:        if(type(Tmp=getenv("TEMP"))!=7 && type(Tmp=getenv("TMP")) != 7)
                   12483:                Tmp=str_subst(DIROUT,["%HOME%","%ASIRROOT%"],[Home,get_rootdir()]);
                   12484:        Sep=isMs()?"\\":"/";
                   12485:        F=Tmp+Sep+"muldif.tmp";
1.16      takayama 12486:        if(type(S)<=1 && S>=0)  close_file(S);
1.6       takayama 12487:        remove_file(F);
                   12488:        if(type(S)<=1) return -1;
                   12489:        shell(S+" > \""+F+"\"");
                   12490:        return open_file(F);
                   12491: }
                   12492:
1.69      takayama 12493: def isfctr(P)
                   12494: {
                   12495:        if(type(P)>3) return 0;
                   12496:        if(type(P)==3) return (!isfctr(nm(P))||!isfctr(dn(P)))?0:1;
                   12497:        V=ptol(P,vars(P)|opt=0);
                   12498:        for(;V!=[];V=cdr(V)){
                   12499:                if(type(car(V))>1||ntype(car(V))>0) return 0;
                   12500:        }
                   12501:        return 1;
                   12502: }
                   12503:
1.6       takayama 12504: def show(P)
                   12505: {
                   12506:        T=type(P);
                   12507:        S=P;
                   12508:        Var=getopt(opt);
1.69      takayama 12509:        if((Raw=getopt(raw))!=1) Raw=0;
1.6       takayama 12510:        if(Var=="verb"){
1.69      takayama 12511:                S="{\\tt"+verb_tex_form(T)+"}\n\n";
                   12512:                if(Raw) return S;
                   12513:                dviout(S);return;
1.6       takayama 12514:        }
                   12515:        if(type(Var)<0) Var=getopt(var);
                   12516:        if(T==6){
                   12517:                if((Sp=getopt(sp))==1 || Sp==2)
                   12518:                        S=mtotex(P|lim=1,small=2,sp=Sp,null=1,mat="B");
                   12519:                else if(type(Var)==4 || type(Var)==7)
                   12520:                        S=mtotex(P|lim=1,small=2,var=Var);
                   12521:                else
                   12522:                        S=mtotex(P|lim=1,small=2);
                   12523:                Size=size(P);
                   12524:                Size=(Size[0]>Size[1])?Size[0]:Size[1];
                   12525:                if(Size>10)     dviout0(Size);
                   12526:        }else if(T<=3){
                   12527:                X=0;
                   12528:                if(Var=="pfrac") X=var(P);
                   12529:                else X=getopt(pfrac);
                   12530:                if(isvar(X)){
1.69      takayama 12531:                        if(Raw) return pfrac(P,X|TeX=1);
                   12532:                        pfrac(P,X|dviout=1);return;
1.6       takayama 12533:                }
1.69      takayama 12534:                Opt=getopt();
                   12535:                if(type(Var)!=2&&type(Var)!=4&&type(Var)!=7){
1.6       takayama 12536:                        if(isdif(P)!=0) Opt=cons(["var","dif"],Opt);
                   12537:                        else Opt=cons(["br",1],Opt);
                   12538:                }
1.69      takayama 12539:                if(!isfctr(P)){
                   12540:                        if(Raw) return my_tex_form(P);
                   12541:                        else{
                   12542:                                dviout(P); return;
                   12543:                        }
                   12544:                }
                   12545:                if(Raw) return fctrtos(P|option_list=cons(["TeX",3],Opt));
1.70      takayama 12546:                fctrtos(P|option_list=cons(["pages",2],cons(["dviout",1],Opt)));return;
1.6       takayama 12547:        }else if(T==4){
1.70      takayama 12548:                F=0;N=length(getopt());
                   12549:                if(Raw) N--;
                   12550:                if(N==1){
                   12551:                        if(type(Var=getopt(var))>1){
                   12552:                                if(isvar(Var)) Var=[0,Var];
1.71      takayama 12553:                                else if(type(Var)==4&&Var[0]!=0) Var=cons(0,Var);
1.70      takayama 12554:                                else Var=0;
                   12555:                        }else if(type(Var=getopt(eqs))!=4) Var=0;
                   12556:                }else if(N==0) Var=[];
                   12557:                else Var=0;
                   12558:                if(type(Var)==4){
                   12559:                        for(F=0,L=P;L!=[];L=cdr(L)){ /* */
                   12560:                                if(type(car(L))==2) F+=nmono(car(L));
                   12561:                                else{
                   12562:                                        F=0;break;
                   12563:                                }
                   12564:                        }
                   12565:                }
                   12566:                if(F>50){
                   12567:                        S=texbegin("align*",eqs2tex(P,Var));
                   12568:                        if(Raw) return S;
                   12569:                        dviout(S);return;
                   12570:                }
1.6       takayama 12571:                if(type(Var)==4 || type(Var)==7){
                   12572:                        S=ltotex(P|option_list=getopt());
                   12573:                        if(Var=="text"){
1.69      takayama 12574:                                if(Raw) return S;
                   12575:                                dviout(S);return;
1.6       takayama 12576:                        }
                   12577:                }else{
                   12578:                        for(F=0,L=P;L!=[] && F!=-1;L=cdr(L)){
                   12579:                                LL=car(L);
                   12580:                                if(type(LL)==4){
                   12581:                                        if(F==0){
                   12582:                                                T=type(LL[0]);
                   12583:                                                if(T==4)        F=2;                    /* [[[? */
                   12584:                                                else if(T==1 || T==0)   F=1;    /* [[num,.. */
                   12585:                                        }
                   12586:                                        if(F==1){
                   12587:                                                if(length(LL)!=2 || !isint(LL[0]) || LL[0]<0 || type(LL[1])>3)
                   12588:                                                        F=-1;                                   /* [[num,rat],[num,rat],...] */
                   12589:                                        }else if(F==2){
                   12590:                                                for(LLT=LL; LLT!=[] && F!=-1; LLT=cdr(LLT)){
                   12591:                                                        LLL=car(LLT);           /* [[[num,rat],[num,rat],...],[[..],..]],....] */
                   12592:                                                        if(length(LLL)!=2 || !isint(LLL[0]) || LLL[0]<0 || type(LLL[1])>3)
                   12593:                                                                F=-1;
                   12594:                                                }
                   12595:                                        }
                   12596:                                }else if((F==0 || F==7) && type(LL)==7){
                   12597:                                        F=7;
                   12598:                                }else F=-1;
                   12599:                        }
                   12600:                        if(F==1)        S=ltotex(P|opt="spt");
                   12601:                        else if(F==2){
                   12602:                                M=mtranspose(lv2m(S));
1.69      takayama 12603:                                if(Raw) return show(M|sp=1,raw=1);      /* GRS */
                   12604:                                show(M|sp=1);return;
1.6       takayama 12605:                        }else if(F==7)  S=ltotex(P|opt="spts");
                   12606:                        else{
                   12607:                                for(F=0,L=P;L!=[] && F!=-1;L=cdr(L)){
                   12608:                                        LL=car(L);
                   12609:                                        if(type(LL)!=4){
                   12610:                                                F=-1; break;
                   12611:                                        }
                   12612:                                        for(LLT=LL; LLT!=[] && F!=-1; LLT=cdr(LLT)){
                   12613:                                                T=type(LLL=car(LLT));
                   12614:                                                if(T<7 && T!=4) F0++;
                   12615:                                                else if(T==7){
                   12616:                                                        if(str_char(LLL,0,"\\")<0) F1++;
                   12617:                                                        else F2++;
                   12618:                                                }else F=-1;
                   12619:                                        }
                   12620:                                }
                   12621:                        }
                   12622:                        if(F==0 && F0>0 && (F1+F2)>0){  /* list of list of eq and str */
                   12623:                                if(F2>0)        S=ltotex(P|opt=["cr","spts0"],str=1);
                   12624:                                else    S=ltotex(P|opt=["cr","spts"]);
                   12625:                        }else{
                   12626:                                for(S="[";;){
                   12627:                                        S+=my_tex_form(car(P));
                   12628:                                        if((P=cdr(P))==[]){
                   12629:                                                S+="]";break;
                   12630:                                        }
                   12631:                                        S+=",";
                   12632:                                }
                   12633:                        }
                   12634:                }
                   12635:        }else if(T==7){
1.71      takayama 12636:                if(Var=="raw") S=P+"\n\n";
                   12637:                else if(Var != "eq" &&str_str(P,"\\begin"|end=128)<0){
                   12638:                        if((TikZ&&str_str(P,"\\draw"|end=128)>=0)||(!TikZ&&str_str(P,"\\ar@"|end=128)>=0))
                   12639:                                S=xyproc(P);
1.72      takayama 12640:                }else if(Var !="eq"){
                   12641:                        if(str_str(P,"\\begin{align")>=0 || str_str(P,"\\[")>=0
                   12642:                                || str_str(P,"\\begin{equation")>=0
                   12643:                                || (str_char(P,0,"^")<0 && str_char(P,0,"_")<0 && str_char(P,0,"&")<0))
                   12644:                                        S=P+"\n\n";
                   12645:                }
1.71      takayama 12646:                if(P!=S){
                   12647:                        if(Raw) return S;
                   12648:                        dviout(S); return;
1.6       takayama 12649:                }
                   12650:        }
1.69      takayama 12651:        if(Raw) return "\\begin{align}\\begin{split}\n &"+S+"\\end{split}\\end{align}";
                   12652:        else dviout(S|eq=5);
1.6       takayama 12653: }
                   12654:
                   12655:
                   12656: /* options : eq = 1 - 8, clear=1, keep=1, delete=1, title=s,
                   12657:                                                 fctr=1, begin=s  */
                   12658: def dviout(L)
                   12659: {
                   12660:        /* extern AMSTeX, TeXEq, DIROUT, DVIOUTA, DVIOUTB, DVIOUTL;     */
                   12661:
                   12662:        MyEq = [
                   12663:                ["\\[\n ","\\]"],
                   12664:                ["\\begin{align}\n","\\end{align}"],
                   12665:                ["\\begin{gather}\n ","\\end{gather}"],
                   12666:                ["\\begin{multline}\n ","\\\\[-15pt]\\end{multline}"],
                   12667:                ["\\begin{align}\\begin{split}\n &","\\end{split}\\end{align}"],
                   12668:                ["\\begin{align*}\n &","\\end{align*}"],
                   12669:                ["\\begin{gather*}\n ","\\end{gather*}"],
                   12670:                ["\\begin{equation}\n ","\\end{equation}"]
                   12671:        ];
                   12672:        if(!chkfun("print_tex_form", "names.rr"))
                   12673:                return 0;
                   12674:        Home=getenv("HOME");
                   12675:        if(type(Home)!=7) Home="";
                   12676:        Dir=str_subst(DIROUT,["%HOME%","%ASIRROOT%","\\"],[Home,get_rootdir(),"/"]);
                   12677:        Dirout=Dir+(AMSTeX?"/out.tex":"/out0.tex");
                   12678:        Risaout=(AMSTeX)?"risaout":"risaout0";
                   12679:        Dirisa=Dir+"/"+Risaout+".tex";
                   12680:        Viewer="dviout";
                   12681:        SV=["c:/w32tex/dviout","c:/dviout"];
                   12682:        Risatex=str_subst(AMSTeX?DVIOUTA:DVIOUTL,
                   12683:                        ["%HOME%","%ASIRROOT%","%TikZ%"],[Home,get_rootdir(),rtostr(TikZ)]);
                   12684:        if(isMs() && !access(Risatex)){
                   12685:                for(TV=SV; TV!=[]; TV=cdr(TV)){
                   12686:                        VV=car(TV)+"/dviout.exe";
                   12687:                        if(access(VV)){
                   12688:                                Viewer=str_subst(VV,"/","\\");
                   12689:                                break;
                   12690:                        }
                   12691:                }
                   12692:                output(Risatex);
                   12693:                print("cd \""+str_subst(Dir,"/","\\")+"\"");
                   12694:                print("latex -src=cr,display,hbox,math,par "+Risaout);
                   12695:                print("start "+Viewer+" -1 \""+Dr+"\\tex\\"+Risaout+"\" 1000");
                   12696:                output();
                   12697:        }
                   12698:        if(access(Dirisa) == 0){
                   12699:                D0="\""+(isMs()?str_subst(Dir,"/","\\")+"\"":Dir);
                   12700:                shell("mkdir "+D0);
                   12701:                output(Dirisa);
                   12702:                if(AMSTeX){
                   12703:                        print("\\documentclass[a4paper]{amsart}");
                   12704:                        print("\\usepackage{amsmath,amssymb,amsfonts}");
                   12705:                }else
                   12706:                        print("\\documentclass[a4paper]{article}");
                   12707:                print("\\pagestyle{empty}\n\\begin{document}\n\\thispagestyle{empty}");
                   12708:                print(AMSTeX?"\\input{out}\n\\end{document}":"\\input{out0}\n\\end{document}");
                   12709:                output();
                   12710:        }
                   12711:        if((K = getopt(delete)) >= 1){  /* delete */
                   12712:                LC = 0;
                   12713:                if(type(K) == 1 && K > 10) K = 10;
                   12714:                if(type(K) == 4){
                   12715:                        K = qsort(K);
                   12716:                        LC = 1; /* specific lines */
                   12717:                }
                   12718:                Done = 1;
                   12719:                Id  = open_file(Dirout);
                   12720:                if(Id >= 0){
                   12721:                        Buf = Buf0 = Buf1 = Key = "";
                   12722:                        PE  = 0;
                   12723:                        if(type(K) == 1)
                   12724:                                BufE = newvect(K--);
                   12725:                        Dout = Dirout+"0";
                   12726:                        remove_file(Dout);
                   12727:                        output(Dout);
                   12728:                        while((S = get_line(Id)) != 0){
                   12729:                                if(LC){
                   12730:                                        while(K != [] && car(K) < LC)
                   12731:                                                K = cdr(K);
                   12732:                                        if(K == [] || car(K) > LC)
                   12733:                                                output(S);
                   12734:                                }
                   12735:                                if(Key == ""){
                   12736:                                         if((P0 = str_str(S,"\\begin{")) == 0){
                   12737:                                                 Key = sub_str(S,7,str_str(S,"}")-1);
                   12738:                                                 if(findin(Key,["align", "gather","multline", "equation","align*"]) < 0)
                   12739:                                                         Key = "";
                   12740:                                                 else{
                   12741:                                                         Key = "\\end{"+Key+"}";
                   12742:                                                         if(!LC){
                   12743:                                                                 if(Buf != ""){
                   12744:                                                                         if(PE < K)
                   12745:                                                                                 BufE[PE++] = Buf1+Buf;
                   12746:                                                                         else{
                   12747:                                                                                 if(K > 0){
                   12748:                                                                                         print(BufE[0]);
                   12749:                                                                                         for(I = 1; I < K; I++)
                   12750:                                                                                                 BufE[I-1]=BufE[I];
                   12751:                                                                                         BufE[K-1] = Buf1+Buf;
                   12752:                                                                                 }else
                   12753:                                                                                         print(Buf1+Buf);
                   12754:                                                                                 Done = 0;
                   12755:                                                                         }
                   12756:                                                                         Buf1 = Buf0;
                   12757:                                                                         Buf = Buf0 ="";
                   12758:                                                                 }
                   12759:                                                         }
                   12760:                                                 }
                   12761:                                         }
                   12762:                                         if(Key == "" && !LC) Buf0 += S;
                   12763:                                }
                   12764:                                if(Key != ""){
                   12765:                                        if(!LC) Buf += S;
                   12766:                                        if(str_str(S,Key) >= 0){
                   12767:                                                Key = "";
                   12768:                                                if(LC) LC++;
                   12769:                                        }
                   12770:                                }
                   12771:                        }
                   12772:                        output();
                   12773:                        close_file(Id);
                   12774:                }
                   12775:                if(Done==0){
                   12776:                         Id = open_file(Dout);
                   12777:                         if(Id >= 0){
                   12778:                                 remove_file(Dirout);
                   12779:                                 output(Dirout);
                   12780:                                 while((S = get_line(Id)) != 0)
                   12781:                                         print(S,0);
                   12782:                                 output();
                   12783:                                 close_file(Id);
                   12784:                         }
                   12785:                         remove_file(Dout);
                   12786:                }else L=" ";
                   12787:        }
                   12788:        if(getopt(clear) == 1 || Done == 1){  /* clear */
                   12789:                remove_file(Dirout);
                   12790:                if(L == "" || L == " "){
                   12791:                        output(Dirout);
                   12792:                        print("\\centerline{Risa/Asir}");
                   12793:                        output();
                   12794:                }
                   12795:        }
                   12796:        if(L != " "){
                   12797:                Eq=1;
                   12798:                Eqo = getopt(eq);
                   12799:                Fc = getopt(fctr);
                   12800:                if(Fc == 1 && (type(L) == 2 || type(L) == 3)){
                   12801:                        L = fctrtos(L|TeX=1);
                   12802:                        if(type(L) == 4)
                   12803:                                L = "\\fact{"+L[0]+"}{"+L[1]+"}";
                   12804:                        if(type(Eqo) != 0 && type(Eqo) !=7){
                   12805:                                Eqo=0;
                   12806:                        }
                   12807:                }
                   12808:                if(type(L) != 4 || getopt(mult) != 1)
                   12809:                        L = [L];
                   12810:                if(type(Eqo)!=7 && (Eqo<1 || Eqo>8))
                   12811:                        Eqo = (AMSTeX==1)?TeXEq:1;
                   12812:                Title = getopt(title);
                   12813:                if(type(Title) == 7){
                   12814:                        output(Dirout);
                   12815:                        print(Title);
                   12816:                        output();
                   12817:                }
                   12818:                Sb = getopt(subst);
                   12819:                for( ; L != []; L = cdr(L)){
                   12820:                        Eq = 1;
                   12821:                        if(type(LT=car(L)) != 7 && type(LT) != 21)
                   12822:                                LT = my_tex_form(LT);
                   12823:                        else if(type(getopt(eq)) < 0)
                   12824:                                Eq = 0;
                   12825:                        if(type(Sb) == 4)
                   12826:                                LT = str_subst(LT,Sb[0],Sb[1]);
                   12827:                        output(Dirout);
                   12828:                        if(Eq == 1){
                   12829:                                if(type(Eqo)==7)
                   12830:                                        print(texbegin(Eqo,LT));
                   12831:                                else if(Eqo >= 1 && Eqo <= 8){
                   12832:                                        mycat0([MyEq[Eqo-1][0],LT,"%"],1);
                   12833:                                        print(MyEq[Eqo-1][1]);
                   12834:                                }else print(LT);
                   12835:                        }else print(LT);
                   12836:                        output();
                   12837:                }
                   12838:        }
                   12839:        if(str_char(Risatex,0," ")>=0 && str_char(DVIOUTA,0," ")<0 && str_char(DVIOUTB,0," ")<0
                   12840:         && str_char(DVIOUTL,0," ")<0)
                   12841:                Risatex="\""+Risatex+"\"";
                   12842:        if(getopt(keep) != 1) shell(Risatex);
                   12843:        return 1;
                   12844: }
                   12845:
                   12846: def rtotex(P)
                   12847: {
                   12848:        S = my_tex_form(P);
                   12849:        return (str_len(S) == 1)?S:"{"+S+"}";
                   12850: }
                   12851:
1.79      takayama 12852: def togreek(P,T)
                   12853: {
                   12854:        R0=[a,b,c,d,e,i,k,l,m,n,o,p,r,s,t,u,x,z];
                   12855:        R1=[alpha,beta,gamma,delta,epsilon,iota,kappa,lambda,
                   12856:                mu,nu,omega,pi,rho,sigma,theta,tau,xi,zeta];
                   12857:        if(T==0||T==[]) T=[a,b,c];
                   12858:        for(S=[],TR=T;TR!=[];TR=cdr(TR)){
                   12859:                if(type(TR[0])!=4){
                   12860:                        if((I=findin(car(TR),R0))>=0) S=cons([car(TR),R1[I]],S);
                   12861:                }else if((I=findin(car(TR)[0],R0))>=0){
                   12862:                        for(U=car(TR)[1];U!=[];U=cdr(U))
                   12863:                                S=cons([makev([R0[I],car(U)]),makev([R1[I],car(U)])],S);
                   12864:                }
                   12865:        }
                   12866:        if(getopt(raw)==1) return S;
                   12867:        if(getopt(inv)==1) return mysubst(P,S|inv=1);
                   12868:        else return mysubst(P,S);
                   12869: }
                   12870:
1.6       takayama 12871: def mtotex(M)
                   12872: {
                   12873:        /* extern TexLim;       */
                   12874:
                   12875:        MB=mat(["(",")","p"],["\\{","\\}","B"],["[","]","b"],["|","|","v"],
                   12876:                ["\\|","\\|","V"], [".",".",""]);
                   12877:        if(type(MT=getopt(mat))==7){
                   12878:                MT=findin(MT,["p","B","b","v","V",""]);
                   12879:                if(MT<0)        MT=0;
                   12880:        }
                   12881:        else MT=0;
                   12882:        MT=MB[MT];
                   12883:        if((F=getopt(small))!=1 && F!=2) F=0;
                   12884:        Lim=getopt(lim);
                   12885:        if(type(Lim)==1){
                   12886:                 if(Lim<30 && Lim!=0) Lim = TexLim;
                   12887:        }else Lim=0;
                   12888:        FL=getopt(len);
                   12889:        Rw=getopt(raw);
                   12890:        Sp=getopt(sp);
                   12891:        Idx=getopt(idx);
                   12892:        if(type(Idx)==4) Idx=ltov(Idx);
                   12893:        if(type(Idx)==6 && length(Idx)==0)      Idx=-1;
                   12894:        Var=getopt(var);
                   12895:        if(Lim>0) FL=1;
                   12896:        Null=getopt(null);
                   12897:        if(Null!=1 && Null!=2) Null=0;
                   12898:        if(type(M)==5) M=lv2m([V]);
                   12899:        else if(type(M)!=6) return monototex(M);
                   12900:        S=size(M);
                   12901:        if(FL==1){
                   12902:                L=newmat(S[0],S[1]);    LL=newvect(S[1]);
                   12903:        }
                   12904:        SS=newmat(S[0],S[1]);
                   12905:        for(I=0; I<S[0]; I++){
                   12906:                for(J=0; J<S[1]; J++){
                   12907:                        if(type(P=M[I][J])<=3){
                   12908:                                if(P!=0 || Null == 0 || (Null==2 && I==J)){
                   12909:                                        SS[I][J]=(type(Var)>1)?fctrtos(P|TeX=2,lim=0,var=Var):fctrtos(P|TeX=2,lim=0);
                   12910:                                        if(type(P)==1 && str_str(SS[I][J],"\\frac{-"|end=0)==0)
                   12911:                                                SS[I][J]="-\\frac{"+str_cut(SS[I][J],7,100000);
                   12912:                                }
                   12913:                        }else if(type(P)==6){
                   12914:                                ST= mtotex(P|small=1,len=1);
                   12915:                                SS[I][J]=ST[0];
                   12916:                                L[I][J]=ST[1];
                   12917:                        }else if(type(P)==7){
                   12918:                                if(Rw==1)       SS[I][J]=P;
                   12919:                                else            SS[I][J]="\\text{"+P+"\}";
                   12920:                        }else if(type(P)==4 && length(P)==2 && P[0]>0 && (Sp==1 || Sp==2)){
                   12921:                                if(P[0]==1){
                   12922:                                        SS[I][J]=fctrtos(P[1]|TeX=2,lim=0);
                   12923:                                }else{
                   12924:                                        ST=my_tex_form(P[0]);
                   12925:                                        if(Sp==2)       ST="("+ST+")";
                   12926:                                        SS[I][J]="["+fctrtos(P[1]|TeX=2,lim=0)+"]_";
                   12927:                                        if(str_len(ST)<2)       SS[I][J]+=ST;
                   12928:                                        else    SS[I][J]+="{"+ST+"}";
                   12929:                                }
                   12930:                        }else
                   12931:                                SS[I][J]=my_tex_form(P);
                   12932:                        if(FL==1) L[I][J]=texlen(SS[I][J]);
                   12933:                }
                   12934:        }
                   12935:        if(Lim>0 || FL==1){
                   12936:                for(LLL=J=0; J<S[1];J++){
                   12937:                        for(I=K=0; I<S[0];I++){
                   12938:                                if(K<L[I][J])   K=L[I][J];
                   12939:                        }
                   12940:                        LLL+=(LL[J]=K);
                   12941:                }
                   12942:        }
                   12943:        if(Lim>0){
                   12944:                if(F==2 && LLL>Lim-2*S[1]-2)    F=1;
                   12945:                if(F==1)
                   12946:                        Lim=idiv(Lim*6,5);
                   12947:                if(LLL<=Lim-(2-F)*S[I]-2)       Lim=0;
                   12948:        }
                   12949:        Mat=(F==1)?"smallmatrix}":"matrix}";
                   12950:        if(F==1)        Out=str_tb("\\left"+MT[0]+"\\begin{",0);
                   12951:        else            Out=str_tb((Lim==0)?"\\begin{"+MT[2]:"\\left"+MT[0]+"\\begin{",0);
                   12952:        Out = str_tb(Mat,Out);
                   12953:        for(I=II=LT=0; II<=S[0]; II++){
                   12954:                if(Lim==0) II=S[0];
                   12955:                if(II<S[0]){
                   12956:                        K=LL[II]+(2-F);
                   12957:                        if(I==II){
                   12958:                                LT+=K;
                   12959:                                continue;
                   12960:                        }
                   12961:                        if(LT+K<Lim-2)  continue;
                   12962:                        LT=K;
                   12963:                }
                   12964:                for(I0=I; I<II; I++){
                   12965:                        if(I==I0){
                   12966:                                str_tb((I==0)?
                   12967:                                  "\n ":
                   12968:                                  "\\right.\\\\\n \\allowdisplaybreaks\\\\\n &\\ \\left.\\begin{"+Mat+"\n ", Out);
                   12969:                                if(Idx==1||Idx==0||type(Idx)==5){
                   12970:                                        for(J=I; J<II; J++){
                   12971:                                                if(type(Idx)!=4)
                   12972:                                                        str_tb("("+rtostr(J+Idx)+")",Out);
                   12973:                                                else{
                   12974:                                                        JJ=length(Idx)-1;
                   12975:                                                        if(J<JJ) JJ=J;
                   12976:                                                        str_tb(my_tex_form(Idx[JJ]),Out);
                   12977:                                                }
                   12978:                                                if(J<II) str_tb(" & ",Out);
                   12979:                                        }
                   12980:                                        str_tb("\\\\\n ",Out);
                   12981:                                }
                   12982:                        }
                   12983:                        else str_tb("\\\\\n ",Out);
                   12984:                        for(J=0; J<S[1]; J++){
                   12985:                                if(J!=0) str_tb(" & ",Out);
                   12986:                                if(type(SS[I][J])==7)   str_tb(SS[I][J],Out);
                   12987:                        }
                   12988:                }
                   12989:                Out=str_tb("\n\\end{", Out);
                   12990:                if(II==S[0])    Out=str_tb((Lim==0&&F!=1)?MT[2]+Mat:Mat+"\\right"+MT[1],Out);
                   12991:                else                    Out=str_tb(Mat+"\\right.",Out);
                   12992:        }
                   12993:        SS = str_tb(0,Out);
                   12994:        if(FL!=1)       return SS;
                   12995:        if(F==1)        LLL=idiv((LLL+S[1])*5+13,6);
                   12996:        else LLL+=2*(1+S[1]);
                   12997:        return [SS,LLL];
                   12998: }
                   12999:
                   13000: def sint(N,P)
                   13001: {
1.11      takayama 13002:     if( type(N)==1 || N==0 ) {
1.6       takayama 13003:                NT=ntype(N);
                   13004:                if((type(Opt=getopt(str))==1 || Opt==0) && Opt>=0 && P>=0){
                   13005:                        if(Opt==2 || Opt==4 || Opt==0){
1.11      takayama 13006:                                if(N==0) return (Opt>0)?"0":0;
1.6       takayama 13007:                                Pw=0;
                   13008:                                if(NT==4){
                   13009:                                        NN=abs(real(N));N1=abs(imag(N));
                   13010:                                        if(NN<N1) NN=N1;
                   13011:                                }else NN=abs(N);
                   13012:                                while(NN<1 && NN>-1){
                   13013:                                        Pw--;
                   13014:                                        N*=10;NN*=10;
                   13015:                                }
                   13016:                                while(N>=10 || N<=-10){
                   13017:                                        Pw++;
                   13018:                                        N/=10;NN/=10;
                   13019:                                }
                   13020:                                if(Opt==0) return sint(N*10^Pw,P-Pw-1);
                   13021:                                S=(getopt(sqrt)==1)?sint(N,P|str=(Opt==4)?3:1,sqrt=1):sint(N,P|str=(Opt==4)?3:1);
                   13022:                                if(Pw==0) return S;
                   13023:                                if(NT==4)
                   13024:                                        S="("+S+")";
                   13025:                                if(Pw==1){
                   13026:                                        if(Opt==2)
                   13027:                                                return S+"*10";
                   13028:                                        else
                   13029:                                                return S+"\\times10";
                   13030:                                }
                   13031:                                if(Opt==2)
                   13032:                                        return S+"*10^("+rtostr(Pw)+")";
                   13033:                                else
                   13034:                                        return S+"\\times10^{"+rtostr(Pw)+"}";
                   13035:                        }
                   13036:                        if(NT==4){
                   13037:                                NN=real(N);
                   13038:                                if(NN!=0){
                   13039:                                        S=sint(NN,P|str=1);
                   13040:                                        if(imag(N)>0) S=S+"+";
                   13041:                                }
                   13042:                                else S="";
                   13043:                                S=S+sint(imag(N),P|str=1)+((Opt==3)?((getopt(sqrt)==1)?"\\sqrt{-1}":"i"):"@i");
                   13044:                                return S;
                   13045:                        }
                   13046:                        if(N<0){
                   13047:                                N=-N;
                   13048:                                Neg="-";
                   13049:                        }else Neg="";
1.11      takayama 13050:                        N=rint(N*10^P)/10^P;
1.6       takayama 13051:                        NN=floor(N);
1.11      takayama 13052:                        NV=(N-NN+1)*10^P;
1.6       takayama 13053:                        NS=rtostr(NN);
                   13054:                        if(P<=0) return Neg+NS;
                   13055:                        if(NN==0 && getopt(zero)==0) NS="";
1.11      takayama 13056:                        return Neg+NS+"."+str_cut(rtostr(NV),1,P);
1.6       takayama 13057:                }
                   13058:                if(NT==4)
                   13059:                        return sint(real(N),P)+sint(imag(N),P)*@i;
                   13060:         X = rint( N*10^P );
1.11      takayama 13061:         return deval(X/10^P);
1.6       takayama 13062:        }
                   13063:     if( (type(N)==2) || (type(N)==3) ){
                   13064:                NN = eval(N);
                   13065:                if( type(NN)==1 )
                   13066:                        return sint(NN,P|option_list=getopt());
                   13067:                else return N;
                   13068:        }
1.8       takayama 13069:     if( type(N)>3 && type(N) < 7)
1.6       takayama 13070: #ifdef USEMODULE
                   13071:         return mtransbys(os_md.sint,N,[P]|option_list=getopt());
                   13072: #else
                   13073:         return mtransbys(sint,N,[P]|option_list=getopt()));
                   13074: #endif
1.8       takayama 13075:        return N;
1.6       takayama 13076: }
                   13077:
                   13078: def frac2n(N)
                   13079: {
                   13080:        if((T=type(N))<0) return N;
                   13081:        E=(getopt(big)==1)?eval(@e):0.1;
                   13082:        if(T==1){
1.15      takayama 13083:                if(ntype(N)==0) return (E*N)/E;
1.6       takayama 13084:                else if(ntype(N)!=4) return N;
1.15      takayama 13085:                else return (E*(1+@i)*N)/(E*(1+@i));
1.6       takayama 13086:        }
                   13087:        if(T==3||T==2){
                   13088:                N=red(N);
                   13089:                Nm=nm(N);Var=vars(Nm);V=car(Var);K=length(Var);
                   13090:                for(S=0,I=mydeg(Nm,V);I>=0;I--) S+=frac2n(mycoef(Nm,I,V))*V^I;
                   13091:                return S/dn(N);
                   13092:        }
1.15      takayama 13093:        if(T<4) return (E*N)/E;
1.6       takayama 13094: #ifdef USEMODULE
                   13095:         return mtransbys(os_md.frac2n,N,[]|option_list=getopt());
                   13096: #else
                   13097:         return mtransbys(frac2n,N,[]|option_list=getopt());
                   13098: #endif
                   13099: }
                   13100:
1.71      takayama 13101: /* Option : opt */
1.70      takayama 13102: def ptconvex(L)
                   13103: {
1.71      takayama 13104:        if(!(isint(Opt=getopt(opt)))) Opt=0;
                   13105:        L0=car(L);X=L0[0];Y=L0[1];
1.70      takayama 13106:        for(TL=cdr(L);TL!=[];TL=cdr(TL)){       /* find the most left pt L0 */
1.71      takayama 13107:                if(X<car(TL)[0]||(X==car(TL)[0]&&Y<car(TL)[1])) continue;
1.70      takayama 13108:                L0=car(TL);X=car(L0);
                   13109:        }
1.71      takayama 13110:        if(Opt==3) return L0;
1.70      takayama 13111:
                   13112:        R=[];   /* find a polygone through all points */
                   13113:        X0=L0[0];Y0=L0[1];
                   13114:        for(TL=L;TL!=[];TL=cdr(TL)){
1.71      takayama 13115:                L0=car(TL);
                   13116:                X=L0[0]-X0;Y=L0[1]-Y0;S=X^2+Y^2;
                   13117:                L0=(!S)? append([-8,0],L0):append([(Y>0?Y^2:-Y^2)/S,S],L0);
                   13118:                R=cons(L0,R);
1.70      takayama 13119:        }
                   13120:        L=qsort(R);
                   13121:        if(Opt==2) return L;
                   13122:
1.71      takayama 13123:        for(R=[],TL=L;TL!=[];TL=cdr(TL)){
                   13124:                if(Opt==4){
                   13125:                        L0=car(TL);
                   13126:                        V=car(L0);
                   13127:                        L0=append(cdr(cdr(L0)),[V]);
                   13128:                }else L0=cdr(cdr(car(TL)));
                   13129:                R=cons(L0,R);
                   13130:        }
                   13131:        L=reverse(R);
                   13132:        if(Opt==1) return L;
                   13133:        R=[cons(V0=-8,L0=car(L))];
1.70      takayama 13134:        for(TL=cdr(L);TL!=[];TL=cdr(TL)){
1.71      takayama 13135:                V=darg(L0,L1=car(TL));
                   13136:                if(V<-4) continue;
1.70      takayama 13137:                while(V<V0){
                   13138:                        R=cdr(R);
1.71      takayama 13139:                        V0=car(car(R));
                   13140:                        V=darg(cdr(car(R)),L1);
1.70      takayama 13141:                }
                   13142:                if(V==V0) R=cdr(R);
1.71      takayama 13143:                R=cons(cons(V0=V,L0=L1),R);
1.70      takayama 13144:        }
1.71      takayama 13145:        for(L=[],TL=R;TL!=[];TL=cdr(TL)) L=cons(cdr(car(TL)),L);
1.70      takayama 13146:        return L;
                   13147: }
                   13148:
1.71      takayama 13149: def darg(P,Q)
                   13150: {
                   13151:        if(type(car(P))==4){
                   13152:                if((V=darg(Q[0],Q[1]))<-1) return -8;
                   13153:                if((V-=darg(P[0],P[1]))>2){
                   13154:                        if((V-=4)>4) return -4;
                   13155:                }else if(V<=-2) V+=4;
                   13156:                return V;
                   13157:        }
                   13158:        X=Q[0]-P[0];Y=Q[1]-P[1];
                   13159:        if(!(S=X^2+Y^2)) return -8;
                   13160:        V=Y^2/S;
                   13161:        if(Y<0) V=-V;
                   13162:        return X<=0?2-V:V;
                   13163: }
                   13164:
                   13165: def dwinding(P,Q)
                   13166: {
                   13167:        V=V0=V1=darg(P,Q0=car(Q));
                   13168:        Q=cons(Q0,reverse(Q));
                   13169:        for(Q=cdr(Q);Q!=[];Q=cdr(Q)){
                   13170:                if((V2=darg(P,car(Q)))<-4) return 1/3;
                   13171:                V1=V2-V1;
                   13172:                if(V1==2||V1==-2) return 1/2;
                   13173:                if(V1<-2) V1+=4;
                   13174:                else if(V1>2) V1-=4;
                   13175:                V+=V1;
                   13176:                V1=V2;
                   13177:        }
                   13178:        return floor((V0-V+1/2)/4);
                   13179: }
                   13180:
1.6       takayama 13181: def xyproc(F)
                   13182: {
                   13183:        if(type(Opt=getopt(opt))!=7) Opt="";
                   13184:        if(type(Env=getopt(env))!=7)
                   13185:                Env=(!TikZ)?"xy":"tikzpicture";
                   13186:        if(F==1)
                   13187:                return(Opt=="")?"\\begin{"+Env+"}\n":"\\begin{"+Env+"}["+Opt+"]\n";
                   13188:        if(F==0) return "\\end{"+Env+"}\n";
                   13189:        if(type(F)==7){
                   13190:                F=xyproc(1|opt=Opt,env=Env)+F+xyproc(0|env=Env);
                   13191:                if(getopt(dviout)==1) dviout(F);
                   13192:                else return F;
                   13193:        }
                   13194: }
                   13195:
                   13196: def xypos(P)
                   13197: {
                   13198:        if(type(P[0])==7){
                   13199:                if(P[0]=="") S="";
                   13200:                else S=(!TikZ)?"\""+P[0]+"\"":"("+P[0]+")";
                   13201:        }
                   13202:        else{
                   13203:                if(TikZ==0 && XYcm==1){
                   13204:                        X=sint(P[0]*10,XYPrec); Y=sint(P[1]*10,XYPrec);
                   13205:                }else{
                   13206:                        X=sint(P[0],XYPrec); Y=sint(P[1],XYPrec);
                   13207:                }
                   13208:                S="("+rtostr(X)+","+rtostr(Y)+")";
                   13209:        }
                   13210:        if(!TikZ){
                   13211:                if(length(P)>2 && (PP=P[2])!=""){
                   13212:                        S=S+" *";
                   13213:                        if(type(PP)==4 && length(PP)==2 && type(PP[0])==7){
                   13214:                                S=S+PP[0];
                   13215:                                PP=PP[1];
                   13216:                        }
                   13217:                        if(type(PP)==7){
                   13218:                                L=str_len(PP);
                   13219:                                if(str_chr(PP,0,"$")==0 && str_chr(PP,L-1,"$")==L-1){
                   13220:                                        PP=str_cut(PP,1,L-2);
                   13221:                                }else S+="\\txt";
                   13222:                        }
                   13223:                        else PP=my_tex_form(PP);
                   13224:                        S=S+"{"+PP+"}";
                   13225:                }
                   13226:                if(length(P)>3){
                   13227:                        if(type(P[3])==7 && P[3]!="") S=S+"=\""+P[3]+"\"";
                   13228:                        if(length(P)>4 && type(P[4])==7) S=S+P[4];
                   13229:                }
                   13230:        }else{
                   13231:                T="";
                   13232:                if(length(P)>2 && (PP=P[2])!=""){
                   13233:                        F=1;
                   13234:                        if(type(PP)==4){
                   13235:                                if(length(PP)==2 && type(PP[0])==7){
                   13236:                                        T="["+PP[0]+"]";
                   13237:                                        PP=PP[1];
                   13238:                                }
                   13239:                        }
                   13240:                        if(type(PP)!=7) PP="$"+my_tex_form(PP)+"$";
                   13241:                        S=S+"{"+PP+"}";
                   13242:                }else F=0;
                   13243:                if(length(P)>3){
                   13244:                        if(type(P[3])==7 && P[3]!="") T=T+"("+P[3]+")";
                   13245:                        else if(P[3]==1) T=T+"(_)";
                   13246:                        if(length(P)>4 && type(P[4])==7) S=S+P[4];
                   13247:                }
                   13248:                if(length(P)>2){
                   13249:                        if(F) S="node"+T+" at"+S;
                   13250:                        else  S="coordinate"+T+" at"+S;
                   13251:                }
                   13252:        }
                   13253:        return S;
                   13254: }
                   13255:
                   13256: def xyput(P)
                   13257: {
1.81      takayama 13258:        if(type(T=car(P))==4||type(car(P)==5)){
                   13259:                P=cdr(P);P=cons(T[1],P);P=cons(T[0],P);
                   13260:        }
1.6       takayama 13261:        if((type(Sc=getopt(scale))==1 && Sc!=1) || type(Sc)==4){
                   13262:                if(type(Sc)==1) Sc=[Sc,Sc];
                   13263:                Sx=Sc[0];Sy=Sc[1];
                   13264:                if(length(P)>2)
                   13265:                        P1=cons(Sy*P[1],cdr(cdr(P)));
                   13266:                else P1=[Sy*P[1]];
                   13267:                P=cons((type(P[0])==7)?P[0]:(Sx*P[0]),P1);
                   13268:        }
                   13269:        if(!TikZ) return "{"+xypos(P)+"};\n";
                   13270:        return "\\"+xypos(P)+";\n";
                   13271: }
                   13272:
                   13273: def xyline(P,Q)
                   13274: {
                   13275:        if(!TikZ)       return "{"+xypos(P)+" \\ar@{-} "+xypos(Q)+"};\n";
                   13276:        if(type(T=getopt(opt))!=7) T="";
                   13277:        else T="["+T+"]";
                   13278:        if(length(P)<3 && length(Q)<3)
                   13279:                return "\\draw"+T+xypos(P)+"--"+xypos(Q)+";\n";
                   13280:        if(length(P)==2) P=[P[0],P[1],"","_0"];
                   13281:        else if(length(P)==3 || (length(P)==4 && P[3]==""))
                   13282:                P=[P[0],P[1],P[2],"_0"];
                   13283:        else if(length(P)>4 && P[3]=="")
                   13284:                P=[P[0],P[1],P[2],"_0",P[4]];
                   13285:        if(length(Q)==2) Q=[Q[0],Q[1],"","_1"];
                   13286:        else if(length(Q)==3 || (length(Q)==4 && Q[3]==""))
                   13287:                Q=[Q[0],Q[1],Q[2],"_1"];
                   13288:        else if(length(Q)>4 && Q[3]=="")
                   13289:                Q=[Q[0],Q[1],Q[2],"_1",Q[4]];
                   13290:        return "\\draw "+T+xypos(P)+" "+xypos(Q)+"("+P[3]+")--("+Q[3]+");\n";
                   13291: }
                   13292:
                   13293: def xylines(P)
                   13294: {
                   13295:        Lf=getopt(curve);
                   13296:        if(type(Lf)!=1) Lf=0;
                   13297:        SS=getopt(opt);
                   13298:        SF=(SS==0)?1:0;
                   13299:        if((Proc=getopt(proc))==1||Proc==2||Proc==3){
                   13300:                OL=cons(["opt",0],delopt(getopt(),["opt","proc"]));
                   13301:                R=xylines(P|option_list=OL);
                   13302:                OP=(type(SS)<0)?[]:((type(SS)==4)?[["opt",SS[0]],["cmd",SS[1]]]:[["opt",SS]]);
                   13303:                return [1,OP,R];
                   13304:        }
                   13305:        if(type(SS)!=7 && type(SS)!=4){
                   13306:                if(Lf==0 && !TikZ) SS="@{-}";
                   13307:                else SS="";
                   13308:        }
                   13309:        if(type(Sc=getopt(scale))==1 || type(Sc)==4){
                   13310:                if(type(Sc)==1) Sc=[Sc,Sc];
                   13311:                Sx=Sc[0];Sy=Sc[1];
                   13312:                if(Sx!=1 || Sy!=1){
                   13313:                        for(PP=[], P0=P; P0!=[]; P0=cdr(P0)){
                   13314:                                PT=car(P0);
                   13315:                                if((type(PT)!=4 && type(PT)!=5) || (type(PT[0])!=1 && PT[0]!=0))
                   13316:                                        PP=cons(PT,PP);
                   13317:                                else{
                   13318:                                        if(length(PT)>2 && type(PT)==4)
                   13319:                                                P1=cons(Sy*PT[1],cdr(cdr(PT)));
                   13320:                                        else P1=[Sy*PT[1]];
                   13321:                                        PP=cons(cons(Sx*PT[0],P1),PP);
                   13322:                                }
                   13323:                        }
                   13324:                        P=reverse(PP);
                   13325:                }
                   13326:        }
                   13327:        if(type(Cl=CL0=getopt(close))!=1) Cl=0;
                   13328:        if((Vb=getopt(verb))!=1&&type(Vb)!=4) Vb=0;
                   13329:        if(type(Lf)!=1 || Lf==0){       /* lines */
                   13330:                if(TikZ||SF){
                   13331:                        for(L=[],F=0,PT=P;PT!=[];PT=cdr(PT)){
                   13332:                                if(type(car(PT))<4){
                   13333:                                        L=cons(car(PT),L);
                   13334:                                        F=0;
                   13335:                                }else{
                   13336:                                        if(F++>1) L=cons(1,L);
                   13337:                                        L=cons(car(PT),L);
                   13338:                                }
                   13339:                        }
                   13340:                        if(Cl==1){
                   13341:                                L=cons(1,L);L=cons(-1,L);
                   13342:                        }
                   13343:                        if(L) L=reverse(L);
                   13344:                        if(SF) return L;
                   13345:                        if(type(SS)!=4) S=xybezier(L|opt=SS);
                   13346:                        else S=xybezier(L|opt=SS[0],cmd=SS[1]);
                   13347:
                   13348:                }else{
                   13349:                        Out = str_tb(0,0);
                   13350:                        for(PT=P; PT!=[]; ){
                   13351:                                PS1=car(PT);
                   13352:                                PT=cdr(PT);
                   13353:                                if(PT==[]){
                   13354:                                        if(Cl==1)       PS2=car(P);
                   13355:                                        else PS2=0;
                   13356:                                }else PS2=car(PT);
                   13357:                                str_tb(xyarrow(PS1,PS2|opt=SS),Out);
                   13358:                        }
                   13359:                        S=str_tb(0,Out);
                   13360:                }
                   13361:        }else if(Lf==2){        /* B-spline */
                   13362:                if(SF) return P;
                   13363:                if(!TikZ){
                   13364:                        Out = str_tb("{\\curve{",0);
                   13365:                        for(PT=P;PT!=[];PT=cdr(PT)){
                   13366:                                if(car(PT)==0){
                   13367:                                        str_tb("}};\n{\\curve{",Out);
                   13368:                                        continue;
                   13369:                                }
                   13370:                                if(PT!=P) str_tb("&",Out);
                   13371:                                str_tb(xypos([car(PT)[0],car(PT)[1]]),Out);
                   13372:                        }
                   13373:                        str_tb("}};\n",Out);
                   13374:                        S=str_tb(0,Out);
                   13375:                }else Out=str_tb(xybezier(P|opt=SS),0);
                   13376:                for(I=0;I<2;I++){
                   13377:                        Q=car(P);
                   13378:                        if(length(Q)>2)
                   13379:                                str_tb(xyput(Q),Out);
                   13380:                        P=reverse(P);
                   13381:                }
                   13382:                S=str_tb(0,Out);
                   13383:        }else{          /* extended Bezier */
                   13384:                RTo=getopt(ratio);
                   13385:                if(type(Acc=getopt(Acc))!=1) Acc=0;
                   13386:                if(type(RTo)!=1 || RTo>1.5 || RTo<0.001) RTo=0;
                   13387:                if(Cl==1){
                   13388:                        PR=reverse(P);
                   13389:                        PT=car(PR);
                   13390:                        PR=cons(P[0],PR);
                   13391:                        PR=cons(P[1],PR);
                   13392:                        P=cons(PT,reverse(PR));
                   13393:                }else if(Cl==-1) Cl=1;
                   13394:                for(L=P2=P3=0,PT=P;;){
                   13395:                        P1=P2;P2=P3;P3=P4;
                   13396:                        P4=(PT==[])?0:car(PT);
                   13397:                        if(PT==[] && (Cl==1 || P3==0)) break;
                   13398:                        PT=cdr(PT);
                   13399:                        if(P3==0)       str_tb("%\n", Out);
                   13400:                        if(P2==0 || P3==0 || (Cl==1 && P1==0)) continue;
                   13401:                        if(L!=0){
                   13402:                                if(car(L)==P2)
                   13403:                                        L=cons(1,L);
                   13404:                                else{
                   13405:                                        L=cons(0,L); L=cons(P2,L);
                   13406:                                }
                   13407:                        }else L=[P2];
                   13408:                        X=P3[0]-P2[0];Y=P3[1]-P2[1];
                   13409:                        DL1=DL2=0;DL=Acc?sqrt(X^2+Y^2):dsqrt(X^2+Y^2);
                   13410:                        if(P4!=0){
                   13411:                                XD1=P4[0]-P2[0];YD1=P4[1]-P2[1];DL1=Acc?sqrt(XD1^2+YD1^2):dsqrt(XD1^2+YD1^2);
                   13412:                        }
                   13413:                        if(P1!=0){
                   13414:                                XD2=P3[0]-P1[0];YD2=P3[1]-P1[1];DL2=Acc?sqrt(XD2^2+YD2^2):dsqrt(XD2^2+YD2^2);
                   13415:                        }
                   13416:                        if(RTo!=0)
                   13417:                                R=RTo;
                   13418:                        else if(DL1>0 && DL2>0){
                   13419:                                Cos=(XD1*XD2+YD1*YD2)/(DL1*DL2);
                   13420:                                RT=4/(3*(Acc?sqrt((1+Cos)/2):dsqrt((1+Cos)/2))+3);
                   13421:                                R=DL*RT/(DL1+DL2);
                   13422:                        }else if(DL1!=0)
                   13423:                                R=DL/(2*DL1);
                   13424:                        else if(DL2!=0)
                   13425:                                R=DL/(2*DL2);
                   13426:                        if(DL2!=0)      L=cons([P2[0]+R*XD2,P2[1]+R*YD2],L);
                   13427:                        if(DL1!=0)      L=cons([P3[0]-R*XD1,P3[1]-R*YD1],L);
                   13428:                        L=cons([P3[0],P3[1]],L);
                   13429:                }
                   13430:                if(CL0==1) L=cons(-1,cdr(L));
                   13431:                if(L!=0) L=reverse(L);
                   13432:                if(SF) return L;
                   13433:                if(type(SS)==4)
                   13434:                        S=xybezier(L|opt=SS[0],cmd=SS[1],verb=Vb);
                   13435:                else
                   13436:                        S=xybezier(L|opt=SS,verb=Vb);
                   13437:        }
                   13438:        if(getopt(dviout)!=1) return S;
                   13439:        xyproc(S|dviout=1);
                   13440: }
                   13441:
                   13442: def saveproc(S,Out)
                   13443: {
                   13444:        if(type(Out)==4){
                   13445:                Out=cons(S,Out);
                   13446:                return Out;
                   13447:        }else{
                   13448:                str_tb(S,Out);
                   13449:                return Out;
                   13450:        }
                   13451: }
                   13452:
1.18      takayama 13453: def xygrid(X,Y)
                   13454: {
                   13455:        for(RR=[],I=0,Z=X;I<2;I++){
1.19      takayama 13456:                U=Z[2];L=LL=[];M=Z[3];
                   13457:                if(Z[1]==1||Z[1]==-1){
1.18      takayama 13458:                        if(type(M)==4) L=M;
                   13459:                        else{
1.19      takayama 13460:                                if(U*(-dlog(1-1/20)/dlog(10))>=M){
1.18      takayama 13461:                                        L=cons([1,2,1/10],L);
1.19      takayama 13462:                                        LL=cons([1,2,1/2],LL);
                   13463:                                }else if(U*(-dlog(1-1/10)/dlog(10))>=M)
1.18      takayama 13464:                                        L=cons([1,2,1/5],L);
                   13465:                                else if(U*(-dlog(1-1/4)/dlog(10))>=M)
                   13466:                                        L=cons([1,2,1/2],L);
1.19      takayama 13467:                                if(U*(-dlog(1-1/50)/dlog(10))>=M){
1.18      takayama 13468:                                        L=cons([2,5,1/10],L);
1.19      takayama 13469:                                        LL=cons([2,5,1/2],LL);
                   13470:                                }else if(U*(-dlog(1-1/25)/dlog(10))>=M)
1.18      takayama 13471:                                        L=cons([2,5,1/5],L);
                   13472:                                else if(U*(-dlog(1-1/10)/dlog(10))>=M)
                   13473:                                        L=cons([2,5,1/2],L);
1.19      takayama 13474:                                if(U*(-dlog(1-1/100)/dlog(10))>=M){
1.18      takayama 13475:                                        L=cons([5,10,1/10],L);
1.19      takayama 13476:                                        LL=cons([5,10,1/2],LL);
                   13477:                                }
1.18      takayama 13478:                                else if(U*(-dlog(1-1/50)/dlog(10))>=M)
                   13479:                                        L=cons([5,10,1/5],L);
                   13480:                                else if(U*(-dlog(1-1/20)/dlog(10))>=M)
                   13481:                                        L=cons([5,10,1/2],L);
1.19      takayama 13482:                                L=cons(L,cons(LL,[[[1,10,1]]]));
1.18      takayama 13483:                        }
                   13484:                        R=scale(L|scale=U);
1.19      takayama 13485:                        if(Z[1]==-1){
                   13486:                                for(LL=[];R!=[];R=cdr(R)){
                   13487:                                        for(L=[],T=car(R);T!=[];T=cdr(T)) L=cons(U-car(T),L);
                   13488:                                        LL=cons(reverse(L),LL);
                   13489:                                }
                   13490:                                R=reverse(LL);
                   13491:                        }
1.18      takayama 13492:                }else if(Z[1]==0){
                   13493:                        if(type(M)==4){
                   13494:                                R=scale(M|f=x,scale=U);
                   13495:                        }else{
                   13496:                                V=0;
                   13497:                                if(U/10>=M) V=1/10;
                   13498:                                else if(U/5>=M) V=1/5;
                   13499:                                else if(U/2>=M) V=1/2;
                   13500:                                R=[];
                   13501:                                if(V>0){
                   13502:                                        UU=U*V;
                   13503:                                        for(R=[],J=UU;J<U;J+=UU) R=cons(J,R);
                   13504:                                }
1.19      takayama 13505:                                if(V==1/10) L=[U/2];
                   13506:                                else L=[];
                   13507:                                R=cons(R,cons(L,[[0,U]]));
1.18      takayama 13508:                        }
                   13509:                }else if(type(Z[1])==4){
                   13510:                        R=Z[1];
1.19      takayama 13511:                        if(length(R)==0||type(R[0])!=4) R=[[],[],R];
1.18      takayama 13512:                }else return 0;
1.19      takayama 13513:                K=length(R);
                   13514:                S=newvect(K);
                   13515:                for(J=0;J<K;J++){
                   13516:                        for(S[J]=[],JJ=0;JJ<=Z[0];JJ+=U){
                   13517:                                for(P=R[J];P!=[];P=cdr(P))
                   13518:                                        if(car(P)+JJ<=Z[0]) S[J]=cons(car(P)+JJ,S[J]);
                   13519:                        }
                   13520:                }
                   13521:                for(J=0;J<K;J++) S[J]=lsort(S[J],[],1);
                   13522:                for(U=[],J=K-1;J>0;J--){
                   13523:                        U=lsort(S[J],U,0);S[J-1]=lsort(S[J-1],U,1);
1.18      takayama 13524:                }
1.19      takayama 13525:                RR=cons(vtol(S),RR);
1.18      takayama 13526:                Z=Y;
                   13527:        }
                   13528:        if((Raw=getopt(raw))==1) return RR;
                   13529:        SS=[];
                   13530:        if(type(Sf=getopt(shift))==7){
                   13531:                Sx=Sf[0];Sy=Sf[1];
                   13532:        }else Sx=Sy=0;
                   13533:        for(I=0;I<2;I++){
                   13534:                for(S0=[],L=RR[I];L!=[];L=cdr(L)){
                   13535:                        for(S=[],T=car(L);T!=[];T=cdr(T)){
                   13536:                                if(S!=[]) S=cons(0,S);
                   13537:                                if(I==0){
                   13538:                                        S=cons([X[0]+Sx,car(T)+Sy],S);
                   13539:                                        S=cons([Sx,car(T)+Sy],S);
                   13540:                                }else{
                   13541:                                        S=cons([car(T)+Sx,Y[0]+Sy],S);
                   13542:                                        S=cons([car(T)+Sx,Sy],S);
                   13543:                                }
                   13544:                        }
                   13545:                        S0=cons(S,S0);
                   13546:                }
                   13547:                SS=cons(reverse(S0),SS);
                   13548:        }
                   13549:        SS=reverse(SS);
                   13550:        if(Raw==2) return SS;
                   13551:        if(length(Y)<5) T=[["",""]];
                   13552:        else if(type(Y[4])==4) T=[Y[4]];
                   13553:        else T=[Y[4],Y[4]];
                   13554:        if(length(X[4])==4) T=cons([""],T);
                   13555:        else if(type(X[4])==4) T=cons(X[4],T);
                   13556:        else T=cons([X[4]],T);
                   13557:        for(Sx=Sy=[],I=0;I<2;I++){
                   13558:                TT=T[I];
                   13559:                for(V=SS[I];V!=[];V=cdr(V)){
                   13560:                        Op=car(TT);
                   13561:                        if(length(TT)>1) TT=cdr(TT);
                   13562:                        if(car(V)==[]) continue;
                   13563:                        if(Op=="") S=xylines(car(V));
                   13564:                        else S=xylines(car(V)|opt=Op);
                   13565:                        if(I==0) Sx=cons(S,Sx);
                   13566:                        else Sy=cons(S,Sy);
                   13567:                }
                   13568:        }
                   13569:        for(S="",Sx=reverse(Sx), Sy=reverse(Sy);Sx!=[]&&Sy!=[];){
                   13570:                if(Sx!=[]){
                   13571:                        S+=car(Sx);Sx=cdr(Sx);
                   13572:                }
                   13573:                if(Sy!=[]){
                   13574:                        S+=car(Sy);Sy=cdr(Sy);
                   13575:                }
                   13576:        }
                   13577:        return S;
                   13578: }
                   13579:
                   13580:
1.22      takayama 13581: def addIL(I,L)
1.18      takayama 13582: {
1.22      takayama 13583:        if(I==0){
                   13584:                for(R=[];L!=[];L=cdr(L)) R=addIL(car(L),R);
                   13585:                return reverse(R);
1.18      takayama 13586:        }
1.22      takayama 13587:        if(type(In=getopt(in))==1){
                   13588:                if(In==-1){
                   13589:                        J=JJ=I[1];I=I[0];
                   13590:                        for(R=[];L!=[];L=cdr(L)){
                   13591:                                J=lmin([car(L)[0],JJ]);
                   13592:                                if(J>I) R=cons([I,J],R);
                   13593:                                I=lmax([car(L)[1],I]);
                   13594:                        }
                   13595:                        if(I<JJ) R=cons([I,JJ],R);
                   13596:                        return reverse(R);
                   13597:                }else{
                   13598:                        for(;L!=[];L=cdr(L)){
                   13599:                                if(car(L)[0]>I) return 0;
                   13600:                                if(car(L)[1]>=I){
                   13601:                                        if(In==3) return car(L);
                   13602:                                        if(In==1||(I!=car(L)[0]&&I!=car(L)[1])) return 1;
                   13603:                                        return 2;
                   13604:                                }
                   13605:                        }
                   13606:                        return 0;
                   13607:                }
                   13608:        }
                   13609:        I0=car(I);I1=I[1];
                   13610:        for(F=0,R=[];L!=[];L=cdr(L)){
                   13611:                if(I0>car(L)[1]){
                   13612:                        R=cons(car(L),R);
                   13613:                        continue;
                   13614:                }
                   13615:                if(I0<=car(L)[1]){
                   13616:                        I0=lmin([I0,car(L)[0]]);
                   13617:                        if(I1<car(L)[0]){
                   13618:                                R=cons([I0,I1],R);
                   13619:                                for( ;L!=[];L=cdr(L)) R=cons(car(L),R);
                   13620:                                F=1;
                   13621:                                break;
                   13622:                        }
                   13623:                        I1=lmax([I1,car(L)[1]]);
                   13624:                }
                   13625:        }
                   13626:        if(!F) R=cons([I0,I1],R);
                   13627:        return reverse(R);
1.18      takayama 13628: }
                   13629:
                   13630: def xy2curve(F,N,Lx,Ly,Lz,A,B)
                   13631: {
1.22      takayama 13632:        Raw=getopt(raw);
                   13633:        if(type(Gap=getopt(gap))==4){
                   13634:                MG=Gap[1];Gap=car(Gap);
                   13635:        }else MG=3;
                   13636:        if(type(Gap)!=1 && Gap!=0) Gap=0.7;
                   13637:        if(type(Dvi=getopt(dviout))<1) Dvi=0;
                   13638:        OL=[["dviout",Dvi]];
                   13639:        if(type(Opt=getopt(opt))<1) Opt=0;
                   13640:        else OL=cons(["opt",Opt],OL);
                   13641:        if(type(Sc=getopt(scale))!=1 && type(Sc)!=4) Sc=[1,1,1];
                   13642:        else if(type(Sc)!=4) Sc=[Sc,Sc,Sc];
                   13643:        else if(length(Sc)!=3) Sc=[Sc[0],Sc[1],Sc[1]];
                   13644:        M=diagm(3,Sc);
                   13645:        if(A!=0||B!=0){
                   13646:                if(type(A)==6) M=A;
                   13647:                else M=mrot([0,-B,-A]|deg=1)*M;
                   13648:                V=M*newvect(3,[x,y,z]);
                   13649:                Fx=compdf(V[0],[x,y,z],F);Fy=compdf(V[1],[x,y,z],F);Fz=compdf(V[2],[x,y,z],F);
                   13650:        }else{
                   13651:                for(I=0;I<3;I++){
                   13652:                        if(type(T=F[I])!=4) T=f2df(T);
                   13653:                        if(type(T)==4) T=cons(car(T)*Sc[I],cdr(T));
                   13654:                        else T*=Sc[I];
                   13655:                        if(I==0) Fx=T;
                   13656:                        else if(I==1) Fy=T;
                   13657:                        else Fz=T;
                   13658:                }
                   13659:        }
                   13660:        if(Raw==5||!Gap)
                   13661:                return (Dvi||!Gap)? xygraph([Fy,Fz],N,Lx,Ly,Lz|option_list=OL):[Fx,Fy,Fz];
1.18      takayama 13662:        R=xygraph([Fy,Fz],N,Lx,Ly,Lz|raw=2);
1.22      takayama 13663:        R0=cdr(car(R));R1=R[1];
                   13664:        for(LT=[];R0!=[];R0=cdr(R0),R1=cdr(R1))
                   13665:                if(car(R0)!=0) LT=cons([R1[0],R1[1]],LT);
                   13666:        LT=reverse(LT);
1.19      takayama 13667:        if(N<0){
                   13668:                Be=xylines(car(R)|curve=1,proc=3,close=-1);
                   13669:                LT=reverse(cdr(LT));
                   13670:                LT=reverse(cdr(LT));
                   13671:        }
                   13672:        else Be=xylines(car(R)|curve=1,proc=3);
1.18      takayama 13673:        Be=cdr(cdr(Be));
1.22      takayama 13674:        Be=lbezier(car(Be));
                   13675:        if(Raw==4) return [Be,LT,Lx];
                   13676:        X=ptcombz(Be,0,0);
                   13677:        Var=(length(Lx)==3)?car(Lx):x;
                   13678:        if(type(Eq=getopt(eq))!=1) Eq=0.01;
                   13679:        if(TikZ==1){
                   13680:                Gap/=10;Eq/=10;
1.18      takayama 13681:        }
                   13682:        for(R=[],XT=X;XT!=[];XT=cdr(XT)){
                   13683:                V=car(XT);
1.22      takayama 13684:                U=LT[V[0][0]];
                   13685:                T=U[0]*V[1][0]+U[1]*(1-V[1][0]);
                   13686:                VV=myfdeval(Fx,[Var,T]);
                   13687:                U=LT[V[0][1]];
1.18      takayama 13688:                T=U[0]*V[1][1]+U[1]*(1-V[1][1]);
1.22      takayama 13689:                VV-=myfdeval(Fx,[Var,T]);
                   13690:                if(abs(VV)<Eq) continue;
                   13691:                I=(VV<0)?0:1;
                   13692:                R=cons([V[0][I],V[1][I],V[0][1-I],V[1][1-I]],R);
1.18      takayama 13693:        }
                   13694:        R=qsort(R);
1.22      takayama 13695:        if(Raw==3) return [Be,R];
                   13696:     Db=newvect(L=length(Be));
                   13697:        for(I=0;I<L;I++) Db[I]=[];
                   13698:        for(TR=R;TR!=[];TR=cdr(TR)){
                   13699:        V1=ptbezier(Be,[I=car(TR)[0],P=car(TR)[1]])[1];
                   13700:                V2=ptbezier(Be,[car(TR)[2],car(TR)[3]])[1];
                   13701:                T=dsqrt(1-dvangle(V1,V2)^2);
                   13702:                if(T<1/MG) T=MG;
                   13703:                GP=Gap/T;
                   13704:                W=GP/dnorm(V1);
                   13705:                Db[I]=addIL([P-W,P+W],Db[I]);
                   13706:                if(P-W<0 && I>0) Db[I-1]=addIL([P-W+1,1],Db[I-1]);
                   13707:                if(P+W>1 && I+1<L) Db[I+1]=addIL([0,P+W-1],Db[I+1]);
                   13708:        }
                   13709:        Db=vtol(Db);
                   13710:        for(Bf=[];Be!=[];Be=cdr(Be),Db=cdr(Db)){
                   13711:                if(car(Db)==[]) Bf=cons(car(Be),Bf);
                   13712:                else{
                   13713:                        D=addIL([0,1],car(Db)|in=-1);
                   13714:                        for(;D!=[];D=cdr(D))
                   13715:                                Bf=cons(tobezier(car(Be)|inv=car(D)),Bf);
                   13716:                }
                   13717:        }
                   13718:        Bf=reverse(Bf);
                   13719:        if(Raw==2) return Bf;
                   13720:        OL=[];
                   13721:        if(Opt){
                   13722:                if(type(Opt)==4&&length(Opt)>1) OL=[["opt",Opt[0]],["cmd",Opt[1]]];
                   13723:                else OL=[["opt",Opt]];
                   13724:        }else OL=[];
                   13725:        S=xybezier(lbezier(Bf|inv=1)|option_list=OL);
                   13726:        if(Raw==1||!Dvi) return S;
                   13727:        return xyproc(S|dviout=Dvi);
                   13728: }
                   13729:
                   13730: def rungeKutta(F,N,Lx,Y,IY)
                   13731: {
                   13732:        if((Pr=getopt(prec))==1){
                   13733:                One=eval(exp(0));
                   13734:        }else{
1.58      takayama 13735:                One=deval(exp(0));Pr=0;
1.22      takayama 13736:        }
1.57      takayama 13737:        if(!isint(FL=getopt(mul))||!FL) FL=1;
1.22      takayama 13738:        if(length(Lx)>2){
                   13739:                V=car(Lx);Lx=cdr(Lx);
                   13740:        }else V=x;
1.58      takayama 13741:        if(Pr==1) Lx=[eval(Lx[0]),eval(Lx[1])];
                   13742:        else Lx=[deval(Lx[0]),deval(Lx[1])];
1.22      takayama 13743:        if(type(Y)==4){
                   13744:                if((Sing=getopt(single))==1||type(F)!=4)
                   13745:                        F=append(cdr(Y),[F]);
                   13746:                L=length(Y);
                   13747:                for(TF=[];F!=[];F=cdr(F))
                   13748:                        TF=cons(f2df(car(F)),TF);
                   13749:                F=reverse(TF);
                   13750:        }else{
                   13751:                L=1;
                   13752:                F=f2df(F);
                   13753:        }
                   13754:        if(getopt(val)==1) V1=1;
                   13755:        else V1=0;
1.57      takayama 13756:        if(FL>0) N*=FL;
1.58      takayama 13757:        H=(Lx[1]-Lx[0])/N*One;H2=H/2;
1.22      takayama 13758:        FV=findin(V,vars(F));
                   13759:        K=newvect(4);
                   13760:        if(L==1){
                   13761:                R=[[T=Lx[0],S=IY]];
                   13762:                if(!H) return R;
1.57      takayama 13763:                for(C=0;C<N;C++){
1.22      takayama 13764:                        for(I=0;I<4;I++){
                   13765:                                if(I==0)      W=[[V,T],[Y,S]];
                   13766:                                else if(I==3) W=[[V,T+H],[Y,S+H*K[2]]];
                   13767:                                else          W=[[V,T+H2],[Y,S+H2*K[I-1]]];
                   13768:                                if(FV<0) W=cdr(W);
                   13769:                                K[I]=Pr?myfeval(F,W)*One:myfdeval(F,W);
                   13770:                        }
                   13771:                        S+=(K[0]+2*K[1]+2*K[2]+K[3])*H/6;T+=H;
1.57      takayama 13772:                        if(FL>0&&!((C+1)%FL)) R=cons([deval(T),S],R);
1.22      takayama 13773:                }
                   13774:        }else{
                   13775:                T=Lx[0];
                   13776:                R=[cons(T,V1?[car(IY)]:IY)];
                   13777:                S=ltov(IY);
                   13778:                if(!H) return R;
1.57      takayama 13779:                for(C=0;C<N;C++){
1.22      takayama 13780:                        for(I=0;I<4;I++){
                   13781:                                if(I==0)      W=cons([V,T   ],lpair(Y,vtol(S)));
                   13782:                                else if(I==3) W=cons([V,T+H ],lpair(Y,vtol(S+H*K[2])));
                   13783:                                else          W=cons([V,T+H2],lpair(Y,vtol(S+H2*K[I-1])));
                   13784:                                if(FV<0) W=cdr(W);
                   13785:                                for(TK=[],TF=F;TF!=[];TF=cdr(TF)){
                   13786:                                        TK=cons(Pr?myfeval(car(TF),W)*One:myfdeval(car(TF),W),TK);
                   13787:                                }
                   13788:                                K[I]=ltov(reverse(TK));
                   13789:                        }
                   13790:                        S+=(K[0]+2*K[1]+2*K[2]+K[3])*H/6;T+=H;
                   13791:                        TS=vtol(S);
1.58      takayama 13792:                        if(FL<0||(C+1)%FL) continue;
1.22      takayama 13793:                        if(V1) TS=[car(TS)];
1.58      takayama 13794:                        R=cons(cons(deval(T),TS),R);
1.22      takayama 13795:                }
                   13796:        }
1.58      takayama 13797:        L=(FL<0)?(V1?S[0]:S):reverse(R);
                   13798:        return L;
1.57      takayama 13799: }
                   13800:
                   13801: def pwTaylor(F,N,Lx,Y,Ly,M)
                   13802: {
1.68      takayama 13803:        /* Pr:bigfloat, V1:last, Sf: single, Tf: autonomous,  */
1.58      takayama 13804:        if(!isint(FL=getopt(mul))||!FL) FL=1;
                   13805:        if(getopt(val)==1) V1=1;
                   13806:        else V1=0;
1.59      takayama 13807:        if(length(Lx)>2){
                   13808:                V=car(Lx);Lx=cdr(Lx);
                   13809:        }else V=t;
                   13810:        if(!isvar(T=getopt(var))) V=t;
                   13811:        if(isint(Pr=getopt(prec))&&Pr>0){
                   13812:                One=eval(exp(0));
                   13813:                if(Pr>9){
                   13814:                        setprec(Pr);
                   13815:                        ctrl("bigfloat",1);
                   13816:                }
                   13817:                Pr=1;
                   13818:        }else{
                   13819:                One=deval(exp(0));Pr=0;
                   13820:        }
                   13821:        if(Pr==1) Lx=[eval(Lx[0]),eval(Lx[1])];
                   13822:        else Lx=[deval(Lx[0]),deval(Lx[1])];
1.68      takayama 13823:        Sf=(type(F)!=4)?1:0;
1.59      takayama 13824:        if(type(Y)==4){
                   13825:                if(type(F)!=4)  F=append(cdr(Y),[F]);
                   13826:        }else Y=[Y];
                   13827:        if(type(Ly)!=4) Ly=[Ly];
1.68      takayama 13828:        if(findin(V,vars(F))>=0){
                   13829:                if(type(F)!=4) F=[F];
                   13830:                Tf=1;F=cons(1,subst(F,V,z_z));Y=cons(z_z,Y);Ly=cons(car(Lx),Ly);
                   13831:        }else Tf=0;                                                     /* Tf: autonomous */
1.60      takayama 13832:        ErF=0;
1.59      takayama 13833:        if(type(Er=getopt(err))==4){
1.61      takayama 13834:                if(length(Er)==2) ErF=Er[1];    /* ErF&1: Raw,  ErF&2: relative,  ErF&4: add Sol */
1.60      takayama 13835:                Er=car(Er);
                   13836:        };
                   13837:        if(!isint(Er)||Er<0) Er=0;      /* 基準解を返す */
1.59      takayama 13838:        if(FL>0) N*=FL;
                   13839:        S=vtol(pTaylor(F,Y,M|time=V));
                   13840:        FM=pmaj(F|var=x);
                   13841:        LS=length(S);
                   13842:
                   13843:        if(type(Vw=getopt(view))==4){   /* Dislay on Canvas */
1.61      takayama 13844:                Glib_math_coordinate=1;
1.68      takayama 13845:                glib_window(car(Vw)[0], car(Vw)[2],car(Vw)[1],car(Vw)[3]);
1.67      takayama 13846:                if(length(car(Vw))==6) Vr=[car(Vw)[4],car(Vw)[5]];
                   13847:                else Vr=0;
1.66      takayama 13848:                if(length(Vw)>1){
                   13849:                        if(type(Cl=Vw[1])==4) Cl=map(os_md.trcolor,Cl);
                   13850:                        else Cl=trcolor(Cl);
                   13851:                }else Cl=0;
1.59      takayama 13852:                if(length(Vw)>2){
                   13853:                        Mt=Vw[2];
                   13854:                        if(LS==1){
                   13855:                                if(type(Mt)>1) Mt=0;
                   13856:                        }else{
1.68      takayama 13857:                                if(type(Mt)!=6||((Ms=size(Mt)[0])!=2&&Ms!=3)) Mt=0;
                   13858:                                if(Ms!=3) Vr=0;
1.59      takayama 13859:                        }
1.68      takayama 13860:                        if(Tf&&type(Mt)==6) Mt=newbmat(2,2,[[1,0],[0,Mt]]);
1.59      takayama 13861:                }else Mt=0;
                   13862:                if(!Mt){
1.68      takayama 13863:                        if(LS>1+Tf){
1.67      takayama 13864:                                if(Vr){
1.68      takayama 13865:                                        Mt=newmat(3,LS);Mt[2+Tf][2+Tf]=1;
1.67      takayama 13866:                                }
                   13867:                                else Mt=newmat(2,LS);
1.68      takayama 13868:                                Mt[Tf][Tf]=Mt[Tf+1][Tf+1]=1;
1.59      takayama 13869:                        }else Mt=1;
1.68      takayama 13870:                        if(LS==1+Tf||Sf) glib_putpixel(Lx[0],Mt*Ly[Tf]|color=mcolor(Cl,0));
1.59      takayama 13871:                        else{
1.67      takayama 13872:                                YT=Mt*ltov(Ly);
1.66      takayama 13873:                                glib_putpixel(YT[0],YT[1]|color=mcolor(Cl,0));
1.59      takayama 13874:                        }
                   13875:                }
                   13876:        }else Vw=0;
                   13877:
1.68      takayama 13878:        T=Lx[0];
                   13879:        RE=R=(Tf)?[Ly]:[cons(T,Ly)];
1.59      takayama 13880:        H=(Lx[1]-Lx[0])/N*One;
1.65      takayama 13881:
                   13882:        Ck=N+1;CB=10;Ckm=2;MM=2;C1=1;
                   13883:        if(Ck<5) Ck=100;
                   13884:        if(type(Inf=getopt(Inf))==4&&length(Inf)>1&&Inf[0]>4){  /* explosion */
1.59      takayama 13885:                Ck=Inf[0];Ckm=Inf[1];
                   13886:                if(length(Inf)>2) MM=Inf[2];
1.67      takayama 13887:                if(!isint(MM)||MM<1) MM=2;
1.59      takayama 13888:                if(length(Inf)>3) C1=Inf[3];
1.60      takayama 13889:                if(type(C1)!=1||C1<0) C1=1;
1.65      takayama 13890:                if(length(Inf)>4) CB=Inf[4];
                   13891:        }else if(isint(Inf)&&Inf>0&&Inf<100){
                   13892:                MM=Inf+1;Ck=100;
1.59      takayama 13893:        }else Inf=0;
1.60      takayama 13894:        Ckm*=Ck;
1.65      takayama 13895:
1.66      takayama 13896:        SS=subst(S,V,H);N0=N;
1.59      takayama 13897:        if(Er>0){
1.61      takayama 13898:                HE=H/(Er+1);SSE=subst(S,V,HE);LyE=Ly;
1.59      takayama 13899:        }
1.65      takayama 13900:        for(C=CC=CF=0;C<N;C++,CC++){
1.59      takayama 13901:                if(CC>=Ck){                                     /* check explosion */
                   13902:                        CC=0;
                   13903:                        D0=dnorm(Ly|max=1);
1.65      takayama 13904:                        if(Er&&CF){
                   13905:                                DE=dnorm(ladd(LyE,Ly,-1)|max=1);
                   13906:                                if(CB*DE>D0) break;
                   13907:                        }
1.59      takayama 13908:                        for(Dy=F,TY=Y,TL=Ly;TY!=[];TY=cdr(TY),TL=cdr(TL))
                   13909:                                Dy=subst(Dy,car(TY),One*car(TL));
                   13910:                        D1=dnorm(Dy|max=1);D2=subst(FM,x,2*D0+C1);D3=D1+D2;
1.60      takayama 13911:                        HH=2*(D0+C1)/Ckm;
1.59      takayama 13912:                        if(HH<H*D3){
1.60      takayama 13913:                                HH/=D3;
                   13914:                                while(H>HH) H/=2;
                   13915:                                if(H*7/5<HH) H*=7/5;
                   13916:                                if(H*6/5<HH) H*=6/5;
1.59      takayama 13917:                                SS=subst(S,V,H);
                   13918:                                if(Er){
1.65      takayama 13919:                                        CF++;
1.59      takayama 13920:                                        HE=H/(Er+1);
                   13921:                                        SSE=subst(S,V,HE);
                   13922:                                }
                   13923:                                if(MM>1) N*=MM;
                   13924:                                MM=0;
                   13925:                        }
                   13926:                        CC=0;
                   13927:                }
                   13928:
                   13929:                T+=H;
                   13930:                for(Dy=SS,TY=Y,TL=Ly;TY!=[];TY=cdr(TY),TL=cdr(TL))
                   13931:                        Dy=subst(Dy,car(TY),One*car(TL));
                   13932:                Ly=Dy;
                   13933:
                   13934:                if(Er>0){               /* estimate error */
1.60      takayama 13935:                        for(CE=0;CE<=Er;CE++){
1.59      takayama 13936:                                for(Dy=SSE,TY=Y,TL=LyE;TY!=[];TY=cdr(TY),TL=cdr(TL))
                   13937:                                        Dy=subst(Dy,car(TY),One*car(TL));
                   13938:                                LyE=Dy;
                   13939:                        }
                   13940:                }
                   13941:                if(FL<0||(C+1)%FL) continue;
                   13942:                if(Vw){
1.68      takayama 13943:                        if(LS==1+Tf||Sf) CR=CC/N0;
1.59      takayama 13944:                        else{
1.67      takayama 13945:                                YT=Mt*ltov(Ly);
                   13946:                                CR=(!Vr)?CC/N0:(YT[2]-Vr[0])/(Vr[1]-Vr[0]);
1.59      takayama 13947:                        }
1.68      takayama 13948:                        if(LS==1+Tf||Sf) glib_putpixel(deval(T),Mt*Ly[Tf]|color=mcolor(Cl,CR));
1.67      takayama 13949:                        else glib_putpixel(YT[0],YT[1]|color=mcolor(Cl,CR));
1.59      takayama 13950:                        continue;
                   13951:                }
1.68      takayama 13952:                TR=(V1)?[car(Ly)]:Ly;
                   13953:                if(!Tf) TR=cons((Inf)?eval(T):deval(T),TR);
1.59      takayama 13954:                R=cons(TR,R);
                   13955:                if(Er){
1.68      takayama 13956:                        TRE=(V1)?[car(LyE)]:LyE;
                   13957:                        if(!Tf) TRE=cons((Inf)?eval(T):deval(T),TRE);
1.59      takayama 13958:                        RE=cons(TRE,RE);
                   13959:                }
                   13960:        }
                   13961:        if(Vw) return 1;
                   13962:        L=(FL<0)?((V1)?car(Ly):Ly):reverse(R);
                   13963:        if(Er){                                                                 /* Estimate error */
                   13964:                LE=(FL<0)?((V1)?car(LyE):LyE):reverse(RE);
                   13965:                if(FL>0){
                   13966:                        for(S=L,T=LE,D=[];S!=[];S=cdr(S),T=cdr(T)) D=cons(os_md.ladd(car(S),car(T),-1),D);
                   13967:                        F=map(os_md.dnorm,reverse(D));
1.60      takayama 13968:                        if(iand(ErF,2)){                        /* relative error */
1.61      takayama 13969:                                G=llget(LE,-1,[0]);
                   13970:                                G=map(os_md.dnorm,G);
1.60      takayama 13971:                                for(R=[];G!=[];G=cdr(G),F=cdr(F)){
                   13972:                                        if(car(G)) R=cons(car(F)/car(G),R);
                   13973:                                        else R=cons(0,R);
                   13974:                                }
                   13975:                                F=reverse(R);
                   13976:                        }
                   13977:                        if(!iand(ErF,1)) F=map(os_md.nlog,F);
                   13978:                        if(!iand(ErF,8)) F=map(deval,F);
1.59      takayama 13979:                }else if(V1){
                   13980:                        D=ladd(L,LE,-1);F=dnorm(D);
1.60      takayama 13981:                        if(iand(ErF,2)){
                   13982:                                G=dnorm(cdr(L));
                   13983:                                if(!G) D/=G;
                   13984:                                else D=1;
                   13985:                        }
                   13986:                        F=(!iand(ErF,1))?nlog(D):D;
                   13987:                        if(!iand(ErF,8)) F=deval(F);
1.59      takayama 13988:                }else{
1.60      takayama 13989:                        D=abs(L-LE);
                   13990:                        if(iand(ErF,2)){
                   13991:                                G=abs(L);
                   13992:                                if(!G) D/=G;
                   13993:                                else D=1;
1.58      takayama 13994:                        }
1.60      takayama 13995:                        F=(!iand(ErF,1))?nlog(D):D;
                   13996:                        if(!iand(ErF,8)) F=deval(F);
1.58      takayama 13997:                }
1.61      takayama 13998:                return iand(ErF,4)?[L,F,LE]:[L,F];
1.57      takayama 13999:        }
1.58      takayama 14000:        return L;
1.18      takayama 14001: }
                   14002:
1.6       takayama 14003: def xy2graph(F0,N,Lx,Ly,Lz,A,B)
                   14004: {
1.18      takayama 14005:        /* (x,y,z) -> (z sin B + x cos A cos B + y sin A cos B,
                   14006:            -x sin A + y cos A, z cos B - x cos A sin B - y sin A sin B) */
1.6       takayama 14007:        if((Proc=getopt(proc))==1||Proc==2){
                   14008:                OPT0=[["proc",3]];
                   14009:        }else{
                   14010:                Proc=0;OPT0=[];
                   14011:        }
                   14012:        if(type(DV=getopt(dviout))==4){
                   14013:                S=["ext","shift","cl","dviout"];
                   14014:                OL=delopt(getopt(),S);
                   14015:                OL=cons(["proc",1],OL);
                   14016:                R=xy2graph(F0,N,Lx,Ly,Lz,A,B|option_list=OL);
                   14017:                OL=delopt(getopt(),S|inv=1);
                   14018:                return execdraw(R,DV|optilon_list=OL);
                   14019:        }
                   14020:        if(N==0 || N>100 || N<-100) N=-16;
                   14021:        if(N<0){
                   14022:                N=-N;N1=-1;N2=NN+1;
                   14023:        }else{
                   14024:                N1=0;N2=NN=N;
                   14025:        }
                   14026:
                   14027:        Ratio=Ratio2=1;
                   14028:        if(type(Sc=Sc0=getopt(scale))!=1 && type(Sc)!=4) Sc=1;
                   14029:        if(type(Sc)==4){
                   14030:                Ratio=Sc[1]/Sc[0];
                   14031:                if(length(Sc)>2) Ratio2=Sc[2]/Sc[0];
                   14032:                Sc=Sc[0];
                   14033:        }
                   14034:        if(type(Vw=getopt(view))!=1) Vw=0;
                   14035:        if(type(Raw=getopt(raw))!=1) Raw=0;
                   14036:        if(type(M1=getopt(dev))==1) M2=M1;
                   14037:        else if(type(M1)==4){
                   14038:                M2=M1[1];M1=M1[0];
                   14039:        }else M1=0;
                   14040:        if(type(M3=getopt(acc))!=1 || (M3<0.5 && M3>100)) M3=1;
                   14041:        if(M1<=0) M1=16;
                   14042:        if(M2<=0) M2=16;
                   14043:        OL=[["para",1],["scale",Sc]];
                   14044:        if(Raw==1) OL=cons(["raw",1],OL);
                   14045:        if(type(Prec=getopt(prec))>=0) OL=cons(["prec",Prec],OL);
                   14046:        L=newvect(4,[[Lx[1],Ly[0]],[Lx[1],Ly[1]],[Lx[0],Ly[1]],[Lx[0],Ly[0]]]);
                   14047:        Lx=[deval(Lx[0]),deval(Lx[1])];
                   14048:        Ly=[deval(Ly[0]),deval(Ly[1])];
                   14049:        Lz=[deval(Lz[0]),deval(Lz[1])];
                   14050:        A=(A0=A)%360;
                   14051:        F00=F0;
                   14052:        if(type(F0)<4){
                   14053:                FC=f2df(F0);
                   14054:                if(findin(z,Vars=vars(FC))>=0 && findin(x,Vars)<0 && findin(y,Vars)<0)
                   14055:                        F0=[w,[z,0,x+y*@i],[w,os_md.abs,FC]];
                   14056:        }
                   14057:        if(type(Org=getopt(org))==4){   /* shift origin */
                   14058:                Lx=[Lx[0]-Org[0],Lx[1]-Org[0]];
                   14059:                Ly=[Ly[0]-Org[1],Ly[1]-Org[1]];
                   14060:                Lz=[Lz[0]-Org[2],Lz[1]-Org[2]];
                   14061:                F0=mysubst(F0,[[x,x+Org[0]],[y,y+Org[1]]]);
                   14062:                if(type(F0)==4){
                   14063:                        F0=cons(F0[0]-Org[2],cdr(F0));
                   14064:                }
                   14065:                else F0-=Org[2];
                   14066:        }else Org=[0,0,0];
                   14067:        Cpx=getopt(cpx);
                   14068:        if(type(Cpx)<0){
                   14069:                if(str_str(rtostr(F0),"@i")>=0) Cpx=1;
                   14070:                else Cpx=0;
                   14071:        }
                   14072:        if(A<0) A+=360;
                   14073:        if(A<90){
                   14074:                Sh=1;F1=F0;Cx=x-Org[0];Cy=y-Org[1];
                   14075:        }else if(A<180){        /* x -> y, y -> -x */
                   14076:                Sh=2;A-=90; F1=mulsubst(F0,[[x,-y],[y,x]]);
                   14077:                LL=Ly;Ly=[-Lx[1],-Lx[0]];Lx=LL;Cx=y-Org[1];Cy=-x+Org[0];
                   14078:        }else if(A<270){
                   14079:                Sh=3;A-=180; F1=subst(F0,[[x,-x],[y,-y]]);
                   14080:                Lx=[-Lx[1],-Lx[0]];Ly=[-Ly[1],-Ly[0]];Cx=-x+Org[0];Cy=-y+Org[1];
                   14081:        }else{
                   14082:                Sh=4;A-=270;F1=mulsubst(F0,[[x,y],[y,-x]]);
                   14083:                LL=Lx;Lx=[-Ly[1],-Ly[0]];Ly=LL;Cx=-y+Org[1];Cy=x-Org[0];
                   14084:        }
                   14085:        A=@pi*A/180; B=@pi*B/180;
                   14086:        if(A==0) A=@pi/3;
                   14087:        if(B==0) B=@pi/12;
                   14088:        NN=N*M2;
                   14089:        Ac=dcos(deval(A)); As=dsin(deval(A));
                   14090:        if(Ac<=0.087 || As<=0.087){
                   14091:                mycat(["Unsuitable angle",A0,"(6-th argument)!"]);
                   14092:                return -1;
                   14093:        }
                   14094:        Bc=Ratio*dcos(deval(B)); Bs=dsin(deval(B));
                   14095:        if(Bc<0){
                   14096:                mycat("Unsuitable angle (7-th argument)!");
                   14097:                return -1;
                   14098:        }
                   14099:        /*
                   14100:                z = f(x,y)  => X=-As*x+Ac*y, Y= Bc*f(x,y)-Bsc*x-Bss*y
                   14101:                Out X-coord is in [X0,X1], dvided by Dev segments
                   14102:                J-th segment of Y-coord : ZF[J]==1 =>  [Z0[0],Z1[J]]
                   14103:        */
                   14104:        Bsc=Bs*Ac;Bss=Bs*As;
                   14105:        if(Ratio2!=1){
                   14106:                if(Sh%2==1){
                   14107:                        Ac*=Ratio2;Bss*=Ratio2;
                   14108:                }else{
                   14109:                        As*=Ratio2;Bsc*=Ratio2;
                   14110:                }
                   14111:        }
                   14112:        CX=-As*Cx+Ac*Cy;CY=Bc*(z-Org[2])-Bsc*Cx-Bss*Cy;
                   14113:        if(type(Dvi=getopt(dviout))!=1 && getopt(trans)==1) return [CX*Sc,CY*Sc];
                   14114:        if(type(N1=getopt(inf))==1){
                   14115:                if(Proc) Dvi=N1;
                   14116:                else if(Dvi<=0) Dvi=-N1;
                   14117:        }
                   14118:        X0=-As*Lx[1]+Ac*Ly[0];X1=-As*Lx[0]+Ac*Ly[1];
                   14119:        F1=mysubst(F1,[@pi,deval(@pi)]);
                   14120:        Tf=type(F1=f2df(F1|opt=0));
                   14121:        if(Tf!=4)       F=Bc*F1-Bsc*x-Bss*y;
                   14122:        else    F=append([Bc*F1[0]-Bsc*x-Bss*y],cdr(F1));
                   14123:        Dx=(Lx[1]-Lx[0])/NN; Dy=(Ly[1]-Ly[0])/NN;
                   14124:        if(type(Err=getopt(err))==1)
                   14125:                F=mysubst(F,[[x,x+Err*Dx/1011.23],[y,y+Err*Dy/1101.34]]);
                   14126:        Out=(Proc)?[]:str_tb(0,0);
                   14127:        Dev=N*M1;
                   14128:        XD=(X1-X0)/Dev;
                   14129:        OLV=newvect(2,[OL,OL]);
                   14130:        if(type(Ura=getopt(opt))==4 || type(Ura)==7){
                   14131:                if(type(Ura)==7) Ura=[Ura,Ura];
                   14132:                else{
                   14133:                        OLV[0]=cons(["opt",Ura[0]],OL);
                   14134:                        OLV[1]=cons(["opt",Ura[1]],OL);
                   14135:                }
                   14136:        }
                   14137:        for(KC=0; KC<=1; KC++){         /* draw curves */
                   14138:                Z0=newvect(Dev+1); Z1=newvect(Dev+1); ZF=newvect(Dev+1);
                   14139:        for(I=0; I<=NN; I++){
                   14140:                        FV=I%M2;
                   14141:                        if(KC==0){
                   14142:                                X=x; Y=Ly[1]-I*Dy; LX=Lx; DD=Dx; G=mysubst(F,[y,Y]);
                   14143:                                if(!FV){
                   14144:                                        if(!Proc) str_tb(["%y=",rtostr(Y),"\n"],Out);
                   14145:                                        else Out=cons([-2,"y="+rtostr(Y)],Out);
                   14146:                                }
                   14147:                        }else{
                   14148:                                X=Lx[1]-I*Dx; Y=x; LX=Ly; DD=Dy; G=mysubst(F,[[x,X],[y,Y]]);
                   14149:                                if(!FV){
                   14150:                                        if(!Proc) str_tb(["%x=",rtostr(X),"\n"],Out);
                   14151:                                        else Out=cons([-2,"x="+rtostr(X)],Out);
                   14152:                                }
                   14153:                        }
                   14154:                        XX=-As*X+Ac*Y; A1=coef(XX,1,x); A0=coef(XX,0,x); /* XX = A1*x + A0, x = (XX-A0)/A1 */
                   14155:                        if(!FV && Vw==1){
                   14156:                                if(Proc) Out=cons(xygraph([XX,G],N,LX,[X0,X1],Lz|scale=Sc,para=1,proc=3),Out);
                   14157:                                else str_tb(xygraph([XX,G],N,LX,[X0,X1],Lz|scale=Sc,para=1),Out);
                   14158:                                continue;
                   14159:                        }
                   14160:                        V=VT=LX[1];
                   14161:                        J0=(subst(XX,x,LX[0])-X0)/XD; J1=(subst(XX,x,LX[1])-X0)/XD;
                   14162:                        if(J0<J1){
                   14163:                                J0=ceil(J0); J1=floor(J1); JD=1;        /* fixed x:  y: dec => (x,z):(dec,inc) */
                   14164:                        }else{
                   14165:                                J0=floor(J0); J1=ceil(J1); JD=-1;       /* fixed y:  x: dec => (x,z):(inc,inc) */
                   14166:                        }
                   14167:                        for(FF=1,J=J1;;J-=JD){
                   14168:                                V1=VT;
                   14169:                                VT=(X0+J*XD-A0)/A1;GG=mysubst(G,[x,VT]);
                   14170:                                if(Cpx>=1) VV=myeval(GG);
                   14171:                                else VV=(Tf==4)? mydeval(GG):deval(GG);         /* J -> V */
                   14172:                                if(ZF[J]==0 || VV<=Z0[J] || VV>=Z1[J]){                  /* visible */
                   14173:                                        if(FF==0){
                   14174:                                                V0=(VT+V1)/2;
                   14175:                                                if(!FV && Vw==-1 && Raw!=1){    /* draw doted line */
                   14176:                                                        K=ceil(M3*(V-V0)/(M2*DD));
                   14177:                                                        if(N1<0) K=-K;
                   14178:                                                        OPT=append(OPT0,[["opt",(TikZ)?"dotted":"~*=<3pt>{.}"],["scale",Sc],["para",1]]);
                   14179:                                                        Out=saveproc(xygraph([XX,G],K,[V0,V],[X0-1,X1+1],Lz|
                   14180:                                                                option_list=OPT),Out);
                   14181:                                                }
                   14182:                                                V=V0;
                   14183:                                        }
                   14184:                                        if(ZF[J]==0){
                   14185:                                                ZF[J]=1; Z0[J]=Z1[J]=VV;
                   14186:                                        }else if(VV<=Z0[J]) Z0[J]=VV;
                   14187:                                        else Z1[J]=VV;
                   14188:
                   14189:                                        if(VV>=Z1[J]) FF=1;
                   14190:                                        else if(VV<=Z0[J]) FF=-1;
                   14191:                                }else{
                   14192:                                        if(FF!=0){
                   14193:                                                V0=(VT+V1)/2;
                   14194:                                                K=ceil(M3*(V-V0)/(M2*DD));
                   14195:                                                if(N1<0) K=-K;
                   14196:                                                if(!FV){
                   14197:                                                        OPT=append(OPT0,OLV[(1-FF)/2]);
                   14198:                                                        Out=saveproc(xygraph([XX,G],K,[V0,V],[X0-1,X1+1],Lz|option_list=OPT),Out);
                   14199:                                                }
                   14200:                                                V=V0;
                   14201:                                        }
                   14202:                                        FF=0;
                   14203:                                }
                   14204:                                if(J==J0) break;
                   14205:                        }
                   14206:                        if(FV) continue;
                   14207:                        V0=LX[0];K=ceil(M3*(V-V0)/(M2*DD));
                   14208:                        if(N1<0) K=-K;
                   14209:                        if(FF!=0){
                   14210:                                if(Raw!=1){
                   14211:                                        OPT=append(OPT0,OLV[(1-FF)/2]);
                   14212:                                        Out=saveproc(xygraph([XX,G],K,[V0,V],[X0-1,X1+1],Lz|option_list=OPT),Out);
                   14213:                        }else if(Vw==-1 && Raw!=1){
                   14214:                                OPT=append(OPT0,[["opt",(TikZ)?"dotted":"~*=<3pt>{.}"]]);
                   14215:                                Out=saveproc(xygraph([XX,G],K,[V0,V],[X0-1,X1+1],Lz|option_list=OPT),Out);
                   14216:                                }
                   14217:                        }
                   14218:                }
                   14219:        }
                   14220:        OptSc=(Sc==1)?[]:[["scale",Sc]];
                   14221:        if(type(LZ=getopt(ax))==4){             /* draw box */
                   14222:                FC=0;
                   14223:                if(length(LZ)==3) FC=LZ[2];
                   14224:                P0=newvect(2,[-As*Lx[1]+Ac*Ly[1],Bc*(LZ[0]-Org[0])-Bsc*Lx[1]-Bss*Ly[1]]);
                   14225:                Vx=newvect(2,[As*(Lx[1]-Lx[0]),Bsc*(Lx[1]-Lx[0])]);
                   14226:                Vy=newvect(2,[Ac*(Ly[0]-Ly[1]),Bss*(Ly[1]-Ly[0])]);
                   14227:                Vz=newvect(2,[0,Bc*(LZ[1]-LZ[0])]);
                   14228:                OL=OL0=append(OPT0,OL);
                   14229:                if(TikZ && type(Ura)==4 && length(Ura)>2) OL0=cons(["opt",Ura[2]],OL);
                   14230:                LL=[[P0+Vz,P0+Vx+Vz],[P0,P0+Vx]];
                   14231:                if(Bs>0){
                   14232:                        LL=cons([P0+Vy+Vz,Pz=P0+Vx+Vy+Vz],LL);
                   14233:                        LL=cons([P0+Vx+Vz,Pz],LL);
                   14234:                        PP=Pz-Vz;
                   14235:                }
                   14236:                else{
                   14237:                        LL=cons([P0+Vy,Pz=P0+Vx+Vy+Vz],LL);
                   14238:                        LL=cons([P0+Vx,Pz],LL);
                   14239:                        PP=Pz+Vz;
                   14240:                }
                   14241:                J=ceil((PP[0]-X0)/XD+0.5);
                   14242:                LL=append([[P0+Vy,P0+Vy+Vz],[P0+Vy,P0+Vy+Vz],[P0+Vx,P0+Vx+Vz],[P0,P0+Vz],
                   14243:                        [P0+Vz,P0+Vy+Vz],[P0,P0+Vy]],LL);
                   14244:                for(LL=reverse(LL);LL!=[];LL=cdr(LL)) Out=saveproc(xylines(car(LL)|option_list=OL0),Out);
                   14245:                if(Dev>4) Dev2=ceil(Dev/2);
                   14246:                if(FC<0 && Raw!=1){
                   14247:                        if(TikZ){
                   14248:                                if(type(Ura)==4 && length(Ura)>2)
                   14249:                                        OL1=cons(["opt",Ura[2]+",dotted"],OL);
                   14250:                                else OL1=cons(["opt","dotted"],OL);
                   14251:                        }else OL1=cons(["opt","@{.}"],OL);
                   14252:                        if(FC==-8) FC=0;
                   14253:                }
                   14254:                for(I=0;I<3;I++){               /* box with hidden part */
                   14255:                        if(I==1) Pz=PP-Vx;
                   14256:                        else if(I==2) Pz=PP-Vy;
                   14257:                        LP=Pz-PP;
                   14258:                        for(FV=-1,K=0;K<=Dev2; K++){
                   14259:                                PPx=PP[0]+(K/Dev2)*LP[0]; PPy=PP[1]+(K/Dev2)*LP[1];
                   14260:                                J=ceil((PPx-X0)/XD);
                   14261:                                if(K!=Dev2 && (J<0||J>Dev)) continue;
                   14262:                                if(K!=Dev2 && (ZF[J]==0 || PPy<Z0[J] || PPy>Z1[J])){    /* visible */
                   14263:                                        if(FV!=1){
                   14264:                                                FV=1;
                   14265:                                                PPP=[PPx,PPy];
                   14266:                                        }
                   14267:                                }else{
                   14268:                                        if(FV!=0){
                   14269:                                                if(FV==1) Out=saveproc(xylines([PPP,[PPx,PPy]]|option_list=OL1),Out);
                   14270:                                                FV=0;
                   14271:                                        }
                   14272:                                }
                   14273:                        }
                   14274:                }
                   14275:                if(FC!=0 && Raw!=1){    /* show coordinate*/
                   14276:                        if(iand(FC,4)){
                   14277:                                Sub=1;
                   14278:                                if(TikZ){
                   14279:                                         S0="\\scriptsize";S1="";
                   14280:                                }else{
                   14281:                                         S0="{}_{"; S1="}";
                   14282:                                }
                   14283:                        }else Sub=0;
                   14284:                        if(iand(FC,2))
                   14285:                                LLL=[[1,0,P0+Vx,(TikZ)?"right":"+!L"],[3,0,P0+Vy,(TikZ)?"left":"+!R"]];
                   14286:                        else LL=[];
                   14287:                        if(Bs>0){
                   14288:                                LLL=cons([0,0,P0,(TikZ)?"below":"+!U"],LLL);
                   14289:                                LLL=cons([2,1,P0+Vx+Vy+Vz,(TikZ)?"above":"+!D"],LLL);
                   14290:                        }else{
                   14291:                                LLL=cons([2,0,P0+Vx+Vy,(TikZ)?"below":"+!U"],LLL);
                   14292:                                LLL=cons([0,1,P0+Vz,(TikZ)?"above":"+!D"],LLL);
                   14293:                        }
                   14294:                        for(TLL=LLL;TLL!=[];TLL=cdr(TLL)){
                   14295:                                TL=car(TLL);LL=L[(Sh+TL[0])%4];
                   14296:                                if(Cpx==0 || Cpx==3){
                   14297:                                        S=ltotex([LL[0],LL[1],LZ[TL[1]]]|opt="coord");
                   14298:                                        SS="("+rtostr(LL[0]) +","+rtostr(LL[1])+","+rtostr(LZ[TL[1]])+")";
                   14299:                                }else{
                   14300:                                        S=ltotex([LL[0]+LL[1]*@i,LZ[TL[1]]]|opt="coord",cpx=Cpx);
                   14301:                                        SS="("+rtostr(LL[0])+"+"+rtostr(LL[1])+"i,"+ rtostr(LZ[TL[1]])+")";
                   14302:                                }
                   14303:                                if(TikZ) S="$"+S+"$";
                   14304:                                if(Sub) S=S0+S+S1;
                   14305:                                if(!TikZ) S="$"+S+"$";
                   14306:                                if(Proc) Out=cons([2,OptSc,[TL[2][0],TL[2][1]],[[TL[3],S]],SS],Out);
                   14307:                                else str_tb(xyput([TL[2][0],TL[2][1],[TL[3],S]]|option_list=OptSc),Out);
                   14308:                        }
                   14309:                }
                   14310:        }
                   14311:        if(type(Pt=getopt(pt))==4){             /* option pt=[] */
                   14312:                if(type(Pt[0])<4) Pt=[[Pt]];
                   14313:                if(length(Pt)>1&&type(Pt[1])!=4) Pt=[Pt];
                   14314:                for(PT=Pt;PT!=[];PT=cdr(PT)){
                   14315:                        PP=car(PT);
                   14316:                        if(type(PP)==4 && length(PP)==3 && type(PP[0])<2 && type(PP[2])<2) PP=[PP];
                   14317:                        P=car(PP);
                   14318:                        if(type(P)==7) Q=[P,0];
                   14319:                        else if(P==1) Q=["_",0];
                   14320:                        else Q=mysubst([CX,CY],[[x,deval(P[0])],[y,deval(P[1])],[z,deval(P[2])]]);
                   14321:                        if(length(PP)>1 && type(PP[1])==4 && length(PP[1])==3){         /* draw line */
                   14322:                                PP=cdr(PP);P=car(PP);
                   14323:                                if(type(P)==7) Q1=P;
                   14324:                                else if(P==1) Q="_";
                   14325:                                else Q1=mysubst([CX,CY],[[x,deval(P[0])],[y,deval(P[1])],[z,deval(P[2])]]);
                   14326:                                if(length(PP)<2 || PP[1]==0 || iand(PP[1],1)) OL2="";
                   14327:                                else OL2=(TikZ)?"dotted":"@{.}";
                   14328:                                if(length(PP)>2 && type(PP[2])==7){
                   14329:                                        if(OL2=="") OL2=PP[2];
                   14330:                                        else{
                   14331:                                                if(TikZ)  OL2=OL2+",";
                   14332:                                                OL2=OL2+PP[2];
                   14333:                                        }
                   14334:                                }
                   14335:                                OL1=OL;
                   14336:                                if(OL2!="") OL1=cons(["opt",OL2],OL1);
                   14337:                                if(length(PP)<2 || PP[1]>=0)
                   14338:                                        Out=saveproc(xylines([Q,Q1]|option_list=OL1),Out);
                   14339:                                else{
                   14340:                                        LP0=Q1[0]-Q[0];LP1=Q1[1]-Q[1];
                   14341:                                        for(FV=-1,K=0;K<=Dev2; K++){
                   14342:                                                PPx=Q[0]+(K/Dev2)*LP0; PPy=Q[1]+(K/Dev2)*LP1;
                   14343:                                                J=ceil((PPx-X0)/XD);
                   14344:                                                if(K!=Dev2 && (J<0 || J>Dev || ZF[J]==0 || PPy<Z0[J] || PPy>Z1[J])){
                   14345:                                                        /* visible */
                   14346:                                                        if(FV!=1){
                   14347:                                                                FV=1;
                   14348:                                                                PPP=[PPx,PPy];
                   14349:                                                        }
                   14350:                                                }else{
                   14351:                                                        if(FV!=0){
                   14352:                                                                if(FV==1) Out=saveproc(xylines([PPP,[PPx,PPy]]|option_list=OL1),Out);
                   14353:                                                                FV=0;
                   14354:                                                        }
                   14355:                                                }
                   14356:                                        }
                   14357:                                }
                   14358:                                continue;
                   14359:                        }
                   14360:                        if(length(PP)==1) S="$\\bullet$";
                   14361:                        else if(type(PP[1])==7) S=PP[1];
                   14362:                        else if(type(PP[1])==4){
                   14363:                                if(length(PP[1])>1 && type(PP[1][1])!=7)
                   14364:                                         S=cons(car(PP),cons("$\\bullet$",cdr(cdr(PP))));
                   14365:                                else S=PP[1];
                   14366:                        }else S="$\\bullet$";
                   14367:                        if(length(PP)<=2){
                   14368:                                if(Proc) Out=cons([2,OptSc,[Q[0],Q[1]],[S]],Out);
                   14369:                                else str_tb(xyput([Q[0],Q[1],S]|option_list=OptSc),Out);
                   14370:                        }else if(!TikZ){
                   14371:                                if(Proc) Out=cons([2,OptSc,[Q[0],Q[1]],[S,"",PP[2]]],Out);
                   14372:                                else str_tb(xyput([Q[0],Q[1],S,"",PP[2]]|option_list=OptSc),Out);
                   14373:                        }else{
                   14374:                                if(Proc) Out=cons([2,OptSc,[Q[0],Q[1]],cons(S,cdr(cdr(PP)))],Out);
                   14375:                                else str_tb(xyput(append([Q[0],Q[1],S],cdr(cdr(PP)))|option_list=OptSc),Out);
                   14376:                        }
                   14377:                }
                   14378:        }
                   14379:        if(Proc){
                   14380:                S=reverse(Out);
                   14381:                if(Proc==1||Proc==3){
                   14382:                        for(W=[],I=0;I<2;I++) for(J=0;J<2;J++) for(K=0;K<2;K++)
                   14383:                                W=cons(mysubst([CX*Sc,CY*Sc],[[x,Lx[I]],[y,Ly[J]],[z,Lz[K]]]),W);
                   14384:                        W=ptbbox(W);
                   14385:                        S=cons([0,W[0],W[1],(TikZ)?1:1/10],S);
                   14386:                }
                   14387:        }else S=str_tb(0,Out);
                   14388:        if(type(Dvi)!=1||(Proc&&abs(Dvi)<2)) return S;
                   14389:        Lout=[];
                   14390:        if(abs(Dvi)>=2){
                   14391:                /* show title */
                   14392:                L0=[];
                   14393:                Title=getopt(title);
                   14394:                if(type(Title)!=7)
                   14395:                                 Title=(type(F00)==4)?("\\texttt{"+verb_tex_form(F00)+"}"):my_tex_form(F00);
                   14396:                if(type(Title)==7){
                   14397:                        T=my_tex_form(L[3][0])+"\\le x\\le "+my_tex_form(L[1][0])+",\\,"+
                   14398:                                my_tex_form(L[3][1])+"\\le y\\le "+my_tex_form(L[1][1])+")";
                   14399:                        if(Proc){
                   14400:                                if(Cpx>=1) L0=[[5,[["eq",1]],"|"+Title+"|\\quad(z=x+yi,\\ "+T]];
                   14401:                                else L0=[[5,[["eq",1]],"z="+Title+"\\ \\ ("+T]];
                   14402:                        }else{
                   14403:                                if(Cpx>=1) dviout("|"+Title+"|\\quad(z=x+yi,\\ "+T|eq=1,keep=1);
                   14404:                                else dviout("z="+Title+"\\ \\ ("+T|eq=1,keep=1);
                   14405:                        }
                   14406:                }
                   14407:                A=rint(deval(180*A/@pi))+90*(Sh-1);
                   14408:                if(A>=180) A-=180;
                   14409:                B=rint(deval(180*B/@pi));
                   14410:                if(abs(Dvi)>=3){
                   14411:                        T="\\text{angle } ("+my_tex_form(A)+"^\\circ,"+my_tex_form(B)+"^\\circ)";
                   14412:                        if(Ratio!=1 || Ratio2!=1) T=T+"\\quad\\text{ratio }1:"
                   14413:                                +my_tex_form(sint(Ratio2,2))+":"+my_tex_form(sint(Ratio,2));
                   14414:                        if(Proc) L0=cons([5,[["eq",1]],T],L0);
                   14415:                        else  dviout(T|eq=1,keep=1);
                   14416:                }
                   14417:                SS="% range "+rtostr([L[3][0],L[1][0]])+"x"+rtostr([L[3][1],L[1][1]])+
                   14418:                        "  angle ("+ rtostr(A) +","+ rtostr(B)+")  dev=";
                   14419:                if(M1==M2) SS=SS+rtostr(M1);
                   14420:                else SS=SS+rtostr([M1,M2]);
                   14421:                if(M3!=1) SS=SS+"  acc="+rtostr(M3);
                   14422:                if(type(Sc0)>=0) SS=SS+"  scale="+rtostr(Sc0);
                   14423:                if(Proc){
                   14424:                        S=cons([5,[],SS],S);
                   14425:                        for(;L0!=[];L0=cdr(L0)) S=cons(car(L0),S);
                   14426:                        return S;
                   14427:                }
                   14428:                if(Dvi>0){
                   14429:                        dviout(SS|keep=1);
                   14430:                        dviout(xyproc(S)|eq=8);
                   14431:                }else Lout=[SS,S];
                   14432:        }else{
                   14433:                if(Dvi>0) dviout(xyproc(S));
                   14434:                else Lout=[S];
                   14435:        }
                   14436:        if(getopt(trans)==1) return cons([CX*Sc,CY*Sc],Lout);
                   14437:        if(Dvi<0) return Lout;
                   14438: }
                   14439:
1.20      takayama 14440: def orthpoly(N)
                   14441: {
                   14442:        F=0;
                   14443:        if(type(P=getopt(pol))==7){
                   14444:                for(L=["Le","Ge","Tc","2T","Ja","He","La","Se"];L!=[];L=cdr(L),F++)
                   14445:                        if(str_str(P,car(L)|end=2)==0) break;
                   14446:        }else P=0;
                   14447:        if(type(D=N)==4) D=N[0];
                   14448:        if(!isint(D)||D<0) return 0;
                   14449:        if(F==0) return seriesHG([-D,D+1],[1],(1-x)/2,D);
                   14450:        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));
                   14451:        if(F==2) return seriesHG([-D,D],[1/2],(1-x)/2,D);
                   14452:        if(F==3){
                   14453:                if(D==0) return 0;
                   14454:                return orthpoly([D-1,1]|pol="Ge");
                   14455:        }
                   14456:        if(F==4) return red(seriesHG([-D,D+N[1]],[N[2]],x,D));
                   14457:        if(F==5){
                   14458:                for(S=I=1;I<=D;I+=2) S*=I;
                   14459:                if(iand(D,1)) return seriesHG([-(D-1)/2],[3/2],x^2/2,D-1)*x*S*(-1)^((D-1)/2);
                   14460:                else return seriesHG([-D/2],[1/2],x^2/2,D)*S*(-1)^(D/2);
                   14461:        }
                   14462:        if(F==6){
                   14463:                NN=(type(N)==4)?N[1]:0;
                   14464:                return red(seriesHG([-D],[NN+1],x,D)*binom(D+NN,D));
                   14465:        }
                   14466:        if(F==7){
                   14467:                NN=N[1];
                   14468:                for(S=1,I=1;I<=D;I++) S+=(-1)^I*binom(D,I)*binom(D+I,I)*sftpow(x,I)/sftpow(NN,I);
                   14469:                return S;
                   14470:        }
                   14471:        return 0;
                   14472: }
                   14473:
                   14474: def schurpoly(L)
                   14475: {
                   14476:        N=length(L);
                   14477:        for(R=[],I=1;L!=[];L=cdr(L),I++) R=cons(car(L)+N-I,R);
                   14478:        L=reverse(R);
                   14479:        if(type(X=getopt(var))!=4){
                   14480:                V=(type(X)>1)?X:"x";
                   14481:                for(X=[],I=0;I<N;I++) X=cons(makev([V,N-I]),X);
                   14482:        }
                   14483:        M=newmat(N,N);
                   14484:        for(I=0;I<N;I++)
                   14485:                for(J=0;J<N;J++) M[I][J]=X[I]^L[J];
                   14486:        P=det(M);
                   14487:        for(I=0;I<N;I++)
                   14488:                for(J=I+1;J<N;J++) P=sdiv(P,X[I]-X[J]);
                   14489:        return P;
                   14490: }
                   14491:
1.6       takayama 14492: def fouriers(A,B,X)
                   14493: {
1.20      takayama 14494:        if((Y=getopt(y))==0||type(Y)>0) Y=deval(Y);
                   14495:        else Y=0;
                   14496:        if((V=getopt(const))==0||type(V)>0){
                   14497:                V=myfeval(V,Y);
                   14498:                K=1;
                   14499:        }else K=0;
1.6       takayama 14500:        if(A!=[]&&type(car(A))>1){
1.20      takayama 14501:                for(C=[],I=A[1];I>=K;I--) C=cons(myf2eval(car(A),I,Y),C);
                   14502:                if(K) C=cons(0,C);
1.6       takayama 14503:                A=C;
                   14504:        }
1.20      takayama 14505:        if(K){
                   14506:                if(A!=[]) A=cdr(A);
                   14507:                A=cons(V,A);
                   14508:        }
1.6       takayama 14509:        if(B!=[]&&type(car(B))>1){
1.20      takayama 14510:                for(C=[],I=B[1];I>0;I--) C=cons(myf2eval(car(B),I,Y),C);
1.6       takayama 14511:                B=C;
                   14512:        }
1.20      takayama 14513:        L=length(B)+1;
                   14514:        if(length(A)>=L) L=length(A)+1;
                   14515:        if(type(Sum=getopt(sum))>0){
                   14516:                if(Sum==1) Sum=1-x;
                   14517:                else if(Sum==2) Sum=[(z__)/(3.1416*x),[z__,os_md.mysin,3.1416*x]];
                   14518:                else Sum=f2df(Sum);
                   14519:                C=[];
                   14520:                if(A!=[]){
                   14521:                        C=cons(car(A),C);
                   14522:                        A=cdr(A);
                   14523:                }
                   14524:                for(I=1;A!=[];A=cdr(A),I++) C=cons(car(A)*myf2eval(Sum,I/L,L),C);
                   14525:                A=reverse(C);
                   14526:                for(C=[],I=1;B!=[];B=cdr(B),I++) C=cons(car(B)*myf2eval(Sum,I/L,L),C);
                   14527:                B=reverse(C);
                   14528:        }
1.6       takayama 14529:        if(getopt(cpx)==1){
1.20      takayama 14530:                if(type(X=eval(X))>1) return todf([os_md.fouriers,[["cpx",1]]],[[A],[B],[X]]);
1.6       takayama 14531:                V=dexp(@i*X);
                   14532:                for(C=A,P=1,I=0;C!=[];C=cdr(C),I++){
1.20      takayama 14533:                        R+=S*car(C)*P;
1.6       takayama 14534:                        P*=V;
                   14535:                }
                   14536:                V=dexp(-@i*X);
                   14537:                for(C=B,P=1,I=0;C!=[];C=cdr(C),I++){
                   14538:                        P*=V;
                   14539:                        R+=car(C)*P;
                   14540:                }
                   14541:                return R;
                   14542:        }
                   14543:        if(type(X=eval(X))>1) return todf(os_md.fouriers,[[A],[B],[X]]);
                   14544:        for(C=A,I=0;C!=[];C=cdr(C),I++)
                   14545:                R+=car(C)*mycos(I*X);
                   14546:        for(C=B,I=1;C!=[];C=cdr(C),I++)
                   14547:                R+=car(C)*mysin(I*X);
                   14548:        return R;
                   14549: }
                   14550:
                   14551:
                   14552: def myexp(Z)
                   14553: {
                   14554:        if(type(Z=eval(Z))>1) return todf(os_md.myexp,[Z]);
                   14555:        if((Im=imag(Z))==0) return dexp(Z);
                   14556:        return dexp(real(Z))*(dcos(Im)+@i*dsin(Im));
                   14557: }
                   14558:
                   14559: def mycos(Z)
                   14560: {
                   14561:        if(type(Z=eval(Z))>1) return todf(os_md.mycos,[Z]);
                   14562:        if((Im=imag(Z))==0) return dcos(Z);
                   14563:        V=myexp(Z*@i);
                   14564:        return (V+1/V)/2;
                   14565: }
                   14566:
                   14567: def mysin(Z)
                   14568: {
                   14569:        if(type(Z=eval(Z))>1) return todf(os_md.mysin,[Z]);
                   14570:        if((Im=imag(Z))==0) return dsin(Z);
                   14571:        V=myexp(Z*@i);
                   14572:        return (1/V-V)*@i/2;
                   14573: }
                   14574:
                   14575: def mytan(Z)
                   14576: {
                   14577:        if(type(Z=eval(Z))>1) return todf(os_md.mytan,[Z]);
1.17      takayama 14578:        if((Im=imag(Z))==0) return dtan(Z);
1.6       takayama 14579:        V=myexp(2*Z*@i);
                   14580:        return @i*(1-V)/(1+V);
                   14581: }
                   14582:
                   14583: def mylog(Z)
                   14584: {
                   14585:        if(type(Z=eval(Z))>1) return todf(os_md.mylog,[Z]);
1.58      takayama 14586:        if(imag(Z)==0&&Z>=0) return dlog(Z);
1.6       takayama 14587:        return dlog(dabs(Z))+@i*myarg(Z);
                   14588: }
                   14589:
1.57      takayama 14590: def nlog(X)
                   14591: {
                   14592:        return mylog(X)/dlog(10);
                   14593: }
                   14594:
1.6       takayama 14595: def mypow(Z,R)
                   14596: {
                   14597:        if(type(Z=eval(Z))>1||type(R=eval(R))>1) return todf(os_md.mypow,[Z,R]);
                   14598:        if(Z==0) return 0;
                   14599:        if(isint(2*R)){
                   14600:                if(R==0) return 1;
                   14601:                if(isint(R)) return Z^R;
                   14602:                V=dsqrt(Z);
                   14603:                if(R==1/2) return V;
                   14604:                return Z^(R-1/2)*V;
                   14605:        }
                   14606:        return myexp(R*mylog(Z));
                   14607: }
                   14608:
                   14609: def myarg(Z)
                   14610: {
1.83    ! takayama 14611:        if(type(Z=map(eval,Z))==4||type(Z)==5){
1.6       takayama 14612:                if(length(Z)!=2) return todf(os_md.myarg,[Z]);
                   14613:                Re=Z[0];Im=Z[1];
                   14614:        }else if(type(Z)>1){
                   14615:                return todf(os_md.myarg,[Z]);
                   14616:        }else {
                   14617:                Im=imag(Z);Re=real(Z);
                   14618:        }
                   14619:        if(Re==0) return (Im<0)?-deval(@pi)/2:deval(@pi)/2;
                   14620:        V=datan(Im/Re);
                   14621:        if(Re>0) return V;
                   14622:        return (V>0)?(V-deval(@pi)):(V+deval(@pi));
                   14623: }
                   14624:
                   14625: def myatan(Z)
                   14626: {
                   14627:        if(type(Z=eval(Z))>1) return todf(os_md.myatan,[Z]);
                   14628:        if((Im=imag(Z))==0) return datan(Z);
                   14629:        mylog((1-Z*@i)/(1+Z*@i))*@i/2;
                   14630: }
                   14631:
                   14632: def myasin(Z)
                   14633: {
                   14634:        if(type(Z=eval(Z))>1) return todf(os_md.myasin,[Z]);
                   14635:        return deval(@pi/2)-myacos(Z);
                   14636: }
                   14637:
                   14638: def frac(X)
                   14639: {
                   14640:        if(type(X=eval(X))>1) return todf(os_md.frac,[X]);
                   14641:        return (ntype(X)==3)? pari(frac,X):(X-floor(X));
                   14642: }
                   14643:
                   14644: def myacos(Z)
                   14645: {
                   14646:        if(type(Z=eval(Z))>1) return todf(os_md.myacos,[Z]);
                   14647:        if(imag(Z)==0 && Z<=1 && Z>=-1) return dacos(Z);
                   14648:        return mylog(Z-dsqrt(Z^2-1))*@i;
                   14649: }
                   14650:
                   14651: def arg(Z)
                   14652: {
                   14653:        if(vars(Z=map(eval,Z))!=[]) return todf(os_md.arg,[Z]);
                   14654:     return (type(Z)==4)?pari(arg,Z[0],Z[1]):arg(sqrt,Z);
                   14655: }
                   14656:
                   14657: def sqrt(Z){
                   14658:        if(vars(Z=map(eval,Z))!=[]) return todf(os_md.sqrt,[Z]);
                   14659:        R=(type(Z)==4)?Z[1]:Z;
                   14660:        if(ntype(R)==0){
                   14661:                if(R==0) return 0;
                   14662:                if(R>0){
                   14663:                        if(pari(issquare,R)) return pari(isqrt,nm(R))/pari(isqrt,dn(R));
                   14664:                }else{
                   14665:                        R=-R;
                   14666:                        if(pari(issquare,R)) return pari(isqrt,nm(R))/pari(isqrt,dn(R))*@i;
                   14667:                }
                   14668:     }
                   14669:        return (type(Z)==4)?pari(sqrt,Z[0],Z[1]):pari(sqrt,Z);
                   14670: }
                   14671:
                   14672: def gamma(Z)
                   14673: {
                   14674:        if(vars(Z=map(eval,Z))!=[]) return todf(os_md.gamma,[Z]);
                   14675:     return (type(Z)==4)?pari(gamma,Z[0],Z[1]):pari(gamma,Z);
                   14676: }
                   14677:
                   14678: def lngamma(Z)
                   14679: {
                   14680:        if(vars(Z=map(eval,Z))!=[]) return todf(os_md.lngamma,[Z]);
                   14681:     return (type(Z)==4)?pari(lngamma,Z[0],Z[1]):pari(lngamma,Z);
                   14682: }
                   14683:
                   14684: def digamma(Z)
                   14685: {
                   14686:        if(vars(Z=map(eval,Z))!=[]) return todf(os_md.digamma,[Z]);
                   14687:     return (type(Z)==4)?pari(digamma,Z[0],Z[1]):pari(digamma,Z);
                   14688: }
                   14689:
                   14690: def dilog(Z)
                   14691: {
                   14692:        if(vars(Z=map(eval,Z))!=[]) return todf(os_md.dilog,[Z]);
                   14693:     return (type(Z)==4)?pari(dilog,Z[0],Z[1]):pari(dilog,Z);
                   14694: }
                   14695:
                   14696: def erfc(Z)
                   14697: {
                   14698:        if(vars(Z=map(eval,Z))!=[]) return todf(os_md.erfc,[Z]);
                   14699:        return (type(Z)==4)?pari(erfc,Z[0],Z[1]):pari(erfc,Z);
                   14700: }
                   14701:
                   14702: def zeta(Z)
                   14703: {
                   14704:        if(vars(Z=map(eval,Z))!=[]) return todf(os_md.zeta,[Z]);
                   14705:     return (type(Z)==4)?pari(zeta,Z[0],Z[1]):pari(zeta,Z);
                   14706: }
                   14707:
                   14708: def eta(Z)
                   14709: {
                   14710:        if(vars(Z=map(eval,Z))!=[]) return todf(os_md.eta,[Z]);
                   14711:     return (type(Z)==4)?pari(eta,Z[0],Z[1]):pari(eta,Z);
                   14712: }
                   14713:
                   14714: def jell(Z)
                   14715: {
                   14716:        if(vars(Z=map(eval,V))>1) return todf(os_md.jell,[Z]);
                   14717:     return (type(Z)==4)?pari(jell,Z[0],Z[1]):jell(jell,Z);
                   14718: }
                   14719:
                   14720: def evals(F)
                   14721: {
                   14722:        if(type(F)==7){
                   14723:                if(type(Del=getopt(del))!= 7) return eval_str(F);
                   14724:                S=strtoascii(Del);K=length(S);
                   14725:                if(K==0) return [eval_str(F)];
                   14726:                Raw=getopt(raw);
                   14727:                F=strtoascii(F);L=[];T1=0;
                   14728:                do{
                   14729:                        T2=str_str(F,S|top=T1);
                   14730:                        if(T2<0) T2=10000;
                   14731:                        FT=str_cut(F,T1,T2-1);
                   14732:                        L=cons((Raw==1)?FT:evals(FT),L);
                   14733:                        T1=T2+K;
                   14734:                }while(T2!=10000);
                   14735:                return reverse(L);
                   14736:        }
                   14737:        if(type(F)==4){
                   14738:                if(type(S=car(F))==7){
                   14739:                        S+="(";
                   14740:                        for(I=0,FT=cdr(F); FT!=[]; I++,FT=cdr(FT)){
                   14741:                                if(type(ST=car(FT))!=7) ST=rtostr(ST);
                   14742:                                if(I>0) S=S+","+ST;
                   14743:                                else S=S+ST;
                   14744:                        }
                   14745:                        S=S+")";
                   14746:                        return eval_str(S);
                   14747:                }else return call(S,cdr(F));
                   14748:        }
                   14749:        return F;
                   14750: }
                   14751:
                   14752: def myval(F)
                   14753: {
                   14754:        if(type(F)!=4){
                   14755:                F=f2df(sqrt2rat(F));
                   14756:                if(type(F)!=4) return F;
                   14757:        };
                   14758:        if(length(F)==1) V=car(F);
                   14759:        else for(V=car(F),F=cdr(F); F!=[];){
                   14760:                FT=car(F);
                   14761:                if(type(G=FT[1])==2){
                   14762:                        if(length(FT)>2){
                   14763:                                FT2=myval(FT[2]);
                   14764:                                if(length(FT)>3) FT3=myval(FT[3]);
                   14765:                        };
                   14766:                        X=red(FT2/@pi);Vi=-red(FT2*@i/@pi);W=red(FT2/@e);
                   14767:                        if(G==os_md.mypow && FT3==1/2){
                   14768:                                G=os_md.sqrt;
                   14769:                                FT=[FT[0],G,FT[2]];
                   14770:                        }
                   14771:                        if((T=findin(G,
                   14772:                                  [sin,os_md.mysin,cos,os_md.mycos,tan,os_md.mytan]))>=0
                   14773:                                  &&(isint(6*X)||isint(4*X))){
                   14774:                                if(T==2||T==3){
                   14775:                                        T=0;X=1/2-X;
                   14776:                                }
                   14777:                                X=X-floor(X/2)*2;
                   14778:                                if(T==0||T==1){
                   14779:                                        if(X>1){
                   14780:                                                S=-1;X-=1;
                   14781:                                        }else S=1;
                   14782:                                        if(X>1/2) X=1-X;
                   14783:                                        if(X==0) R=0;
                   14784:                                        else if(X==1/6) R=1/2;
                   14785:                                        else if(X==1/4) R=2^(1/2)/2;
                   14786:                                        else if(X==1/3) R=3^(1/2)/2;
                   14787:                                        else R=1;
                   14788:                                        R*=S;
                   14789:                                }else{
                   14790:                                        if(X>1) X-=1;
                   14791:                                        if(X>1/2){
                   14792:                                                S=-1;V=1-X;
                   14793:                                        }else S=1;
                   14794:                                        if(X==0) R=0;
                   14795:                                        else if(X==1/6) R=3^(1/2)/3;
                   14796:                                        else if(X==1/4) R=1;
                   14797:                                        else if(X==1/3) R=3^(1/2);
                   14798:                                        else R=2^512;
                   14799:                                        R*=S;
                   14800:                                }
                   14801:                        }else if((G==exp||G==os_md.myexp)&&(isint(FT2)||isint(6*Vi)||isint(4*Vi))){
                   14802:                                if(isint(FT2)) R=@e^FT2;
                   14803:                                else R=myval([z+w*@i,[z,cos,Vi*@pi],[w,sin,Vi*@pi]]);
                   14804:                        }else if((G==pow||G==os_md.mypow) && (isint(FT3)||FT2==1||FT2==0)){
                   14805:                                if(FT2==0) R=0;
                   14806:                                else if(FT2==1) R=1;
                   14807:                                else R=FT2^FT3;
                   14808:                        }else if(G==os_md.abs&&ntype(P=eval(FT2))<4){
                   14809:                                R=FT2;
                   14810:                                if(P<0) R=-R;
                   14811:                        }else if((G==os_md.sqrt||G==dsqrt)&&type(FT2)<2&&ntype(FT2)==0)
                   14812:                                R=sqrtrat(FT2);
                   14813:                        else if((G==os_md.mylog||G==dlog)&&(FT2==@e||FT2==1))
                   14814:                                R=(FT2==1)?0:1;
                   14815:                        else if(length(FT)==3) R=eval((*G)(myeval(FT2)));
                   14816: #ifdef USEMODULE
                   14817:                        else R=call(G,map(os_md.myeval,cdr(cdr(FT))));
                   14818: #else
                   14819:                        else R=call(G,map(myeval,cdr(cdr(FT))));
                   14820: #endif
                   14821:                }
                   14822:                else if(G==0) R=FT[2];
                   14823: #ifdef USEMODULE
                   14824:                        else R=eval(call(G[0],map(os_md.myeval,cdr(cdr(FT)))|option_list=G[1]));
                   14825: #else
                   14826:                        else R=eval(call(G[0],map(myeval,cdr(cdr(FT)))|option_list=G[1]));
                   14827: #endif
                   14828:                V=mysubst(V,[FT[0],R]);
                   14829:                F=mysubst(cdr(F),[FT[0],R]);
                   14830:        }
                   14831:        if(type(V)<4 && !iscoef(V,os_md.iscrat)) V=eval(V);
                   14832: #if 0
                   14833:        return (type(V)<4)?myeval(V):mtransbys(os_md.myeval,V,[]);
                   14834: #else
                   14835:        return V;
                   14836: #endif
                   14837: }
                   14838:
                   14839: /* -1:空  0:整数 1:有理数 2:Gauss整数 3:Gauss有理数 4:それ以外の複素数 */
                   14840: /* def vntype(F)
                   14841: {
                   14842:        if((T=type(F))<2){
                   14843:                if(T<0) return -1;
                   14844:                if((Tn=ntype(F))==0){
                   14845:                        return (isint(F))?0:1;
                   14846:                }
                   14847:                if(Tn==4){
                   14848:                        if(ntype(real(F))==0&&ntype(real(F))==0)
                   14849:                                return (isint(F)&&isint(F))?2:3;
                   14850:                        return 4;
                   14851:                }
                   14852:        }
                   14853:        if(T==2){
                   14854:                V=vars(F);
                   14855:                if((VV=lsort(V,[@e,@pi],1))==[]){
                   14856:                        FT=mycoef(
                   14857:                }else{
                   14858:                        if(length(VV)==1){
                   14859:                        }else
                   14860:                }
                   14861:        }else if(T==3){
                   14862:
                   14863:        }
                   14864: }
                   14865: */
                   14866:
                   14867:
                   14868: def myeval(F)
                   14869: {
                   14870:        if(type(F)!=4)  V=F;
                   14871:        else if(length(F)==1) V=car(F);
                   14872:        else for(V=car(F),F=cdr(F); F!=[];){
                   14873:                FT=car(F);
                   14874:                if(type(G=FT[1])==2){
                   14875:                        if(length(FT)==3) R=(*G)(myeval(FT[2]));
                   14876: #ifdef USEMODULE
                   14877:                        else R=call(G,map(os_md.myeval,cdr(cdr(FT))));
                   14878: #else
                   14879:                        else R=call(G,map(myeval,cdr(cdr(FT))));
                   14880: #endif
                   14881:                }
                   14882:                else if(G==0) R=myeval(FT[2]);
                   14883: #ifdef USEMODULE
                   14884:                        else R=call(G[0],map(os_md.myeval,cdr(cdr(FT)))|option_list=G[1]);
                   14885: #else
                   14886:                        else R=call(G[0],map(myeval,cdr(cdr(FT)))|option_list=G[1]);
                   14887: #endif
                   14888:                V=mysubst(V,[FT[0],R]);
                   14889:                F=mysubst(cdr(F),[FT[0],R]);
                   14890:        }
                   14891:        return (type(V)<4)?eval(V):mtransbys(eval,V,[]);
                   14892: }
                   14893:
                   14894: def mydeval(F)
                   14895: {
                   14896:        if(type(F)!=4) V=F;
                   14897:        else if(length(F)==1) V=car(F);
                   14898:        else for(V=car(F),F=cdr(F); F!=[]; ){
                   14899:                FT=car(F);
                   14900:                if(type(G=FT[1])==2){
                   14901:                        if(length(FT)==3) R=(*G)(myeval(FT[2]));
                   14902: #ifdef USEMODULE
                   14903:                        else R=call(G,map(os_md.mydeval,cdr(cdr(FT))));
                   14904: #else
                   14905:                        else R=call(G,map(mydeval,cdr(cdr(FT))));
                   14906: #endif
                   14907:                }
                   14908:                else if(G==0) R=mydeval(FT[2]);
                   14909: #ifdef USEMODULE
                   14910:                        else R=call(G[0],map(os_md.mydeval,cdr(cdr(FT)))|option_list=G[1]);
                   14911: #else
                   14912:                        else R=call(G[0],map(mydeval,cdr(cdr(FT)))|option_list=G[1]);
                   14913: #endif
                   14914:                V=mysubst(V,[FT[0],R]);
                   14915:                F=mysubst(cdr(F),[FT[0],R]);
                   14916:        }
                   14917:        return (type(V)<4)?deval(V):mtransbys(deval,V,[]);
                   14918: }
                   14919:
                   14920: def myfeval(F,X)
                   14921: {
                   14922:        if(type(X)==4){
                   14923:                if(isvar(X[0])&&length(X)==2)
                   14924:                        return mydeval(mysubst(F,[X[0],X[1]]));
                   14925:                if(type(X[0])==4&&isvar(X[0][0])&&length(X[0])==2){
                   14926:                        for(Y=X;Y!=[];Y=cdr(Y))
                   14927:                                F=mysubst(F,[car(Y)[0],car(Y)[1]]);
                   14928:                        return myeval(F);
                   14929:                }
                   14930:        }
                   14931:        return myeval(mysubst(F,[x,X]));
                   14932: }
                   14933:
                   14934: def myf2eval(F,X,Y)
                   14935: {
                   14936:        return myeval(mysubst(F,[[x,X],[y,Y]]));
                   14937: }
                   14938:
                   14939: def myf3eval(F,X,Y,Z)
                   14940: {
                   14941:        return myeval(mysubst(F,[[x,X],[y,Y],[z,Z]]));
                   14942: }
                   14943:
                   14944: def myfdeval(F,X)
                   14945: {
                   14946:        if(type(X)==4){
                   14947:                if(isvar(X[0])&&length(X)==2)
                   14948:                        return mydeval(mysubst(F,[X[0],X[1]]));
                   14949:                if(type(X[0])==4&&isvar(X[0][0])&&length(X[0])==2){
                   14950:                        for(Y=X;Y!=[];Y=cdr(Y))
                   14951:                                F=mysubst(F,[car(Y)[0],car(Y)[1]]);
                   14952:                        return mydeval(F);
                   14953:                }
                   14954:        }
                   14955:        return mydeval(mysubst(F,[x,X]));
                   14956: }
                   14957:
                   14958: def myf2deval(F,X,Y)
                   14959: {
                   14960:        return mydeval(mysubst(F,[[x,X],[y,Y]]));
                   14961: }
                   14962:
                   14963: def myf3deval(F,X,Y,Z)
                   14964: {
                   14965:        return mydeval(mysubst(F,[[x,X],[y,Y],[z,Z]]));
                   14966: }
                   14967:
                   14968: def df2big(F)
                   14969: {
                   14970:        AG=[[os_md.mysin,sin],[os_md.mycos,cos],[os_md.mytan,tan],[os_md.myasin,asin],
                   14971:                [os_md.acos,acos],[os_md,atan,atan],[os_md.myexp,exp],[os_md.mylog,log],[os_md.mypow,pow]];
                   14972:        if(getopt(inv)!=1) return mysubst(F,AG);
                   14973:        else return mysubst(F,AG|inv=1);
                   14974:
                   14975: }
                   14976:
                   14977: def f2df(F)
                   14978: {
                   14979:        if(type(Opt=getopt(opt))!=1) Opt=0;
                   14980:        if(iand(Opt,1)){
                   14981:                if(Opt>0) F=map(eval,F);
                   14982:                else F=map(deval,F);
                   14983:        }
                   14984:        Cpx=getopt(cpx);
                   14985:        if(type(F)==4 && iand(Opt,2)==0) return F;
                   14986:        K=getopt(level);
                   14987:        if(type(K)!=1) K=0;
                   14988:        AG=[sin,cos,tan,asin,acos,atan,exp,sinh,cosh,tanh,log,pow];
                   14989:        AGd=[os_md.mysin,os_md.mycos,os_md.mytan,os_md.myasin,os_md.myacos,
                   14990:                os_md.myatan,os_md.myexp,os_md.myexp,os_md.myexp,os_md.myexp,
                   14991:                os_md.mylog,os_md.sqrt,os_md.myexp];
                   14992:        for(R=[],I=0,Arg=vars(F);Arg!=[];Arg=cdr(Arg)){
                   14993:                Fn=functor(car(Arg));
                   14994:                if(vtype(Fn)!=3) continue;
                   14995:                V=args(car(Arg));
                   14996:                for(PAG=AG,PAGd=AGd;PAG!=[];PAG=cdr(PAG),PAGd=cdr(PAGd)){
                   14997:                        if(Fn==car(PAG)){
                   14998:                                if(K==0) L="z__";
                   14999:                                else L="z"+rtostr(K)+"__";
                   15000:                                if(I==0) VC=makev([L]);
                   15001:                                else VC=makev([L,I]);
                   15002:                                I++;
                   15003:                                VC0=VC;
                   15004:                                if(Fn==sinh || Fn==cosh || Fn==tanh){
                   15005:                                        VC=makev([L,I++]);
                   15006:                                        if(Fn==sinh)
                   15007:                                                R=cons([VC0,0,(VC^2-1)/(2*VC)],R);
                   15008:                                        else if(Fn==cosh)
                   15009:                                                R=cons([VC0,0,(VC^2+1)/(2*VC)],R);
                   15010:                                        else
                   15011:                                                R=cons([VC0,0,(VC^2-1)/(VC^2+1)],R);
                   15012:                                }
                   15013:                                if(Fn==pow && (V[1]!=1/2||Cpx==1)){
                   15014: #if 0
                   15015:                                        R0=f2df(V[1]*((type(V[0])==1)?dlog(V[0]):log(V[0]))|level=K+1);
                   15016:                                        PAGd=cdr(PAGd);
                   15017: #else
                   15018:                                        R=cons([VC,os_md.mypow,V[0],V[1]],R);
                   15019:                                        F=mysubst(F,[car(Arg),VC0]);
                   15020:                                        Arg=cons(0,vars(F));
                   15021:                                        break;
                   15022: #endif
                   15023:                                }else R0=f2df(V[0]|level=K+1);
                   15024:                                R=cons([VC,car(PAGd),R0],R);
                   15025:                                F=mysubst(F,[car(Arg),VC0]);
                   15026:                                Arg=cons(0,vars(F));
                   15027:                                break;
                   15028:                        }
                   15029:                }
                   15030:        }
                   15031:        if(R==[])       return F;
                   15032:        if(Cpx==1){
                   15033:                for(PAG=P,PAGd=AGd;PAG!=[];PAG=cdr(PAG),PAGd=cdr(PAGd))
                   15034:                        R=mysubst(R,[car(PADd),car(PAG)]);
                   15035:        }
                   15036:        return cons(F,reverse(R));
                   15037: }
                   15038:
                   15039: def todf(F,V)
                   15040: {
                   15041:        if(type(V)!=4) V=[V];
                   15042:        for(R=[];V!=[];V=cdr(V)){
                   15043:                R=cons(f2df(car(V)),R);
                   15044:        }
                   15045:        V=reverse(R);
                   15046:        Z=makenewv([F,V]);
                   15047:        return [Z,cons(Z,cons(F,V))];
                   15048: }
                   15049:
                   15050: def compdf(F,V,G)
                   15051: {
                   15052:        FL=["abs","floor","rint","zeta","gamma","arg","real","imag","conj"];
                   15053:        FS=[os_md.abs,floor,rint,os_md.zeta,os_md.gamma,os_md.myarg,real,imag,conj];
                   15054:        if(type(F)==7){
                   15055:                if(str_str(F,"|")==0){
                   15056:                        F="abs("+str_cut(F,1,str_len(F)-2)+")";
                   15057:                }else if(str_str(F,"[")==0){
                   15058:                        F="floor("+str_cut(F,1,str_len(F)-2)+")";
                   15059:                }
                   15060:                I=str_str(F,"(");
                   15061:                Var=x;
                   15062:                if(I>0){
                   15063:                        J=str_pair(F,I+1,"(",")");
                   15064:                        if(J<0) return 0;
                   15065:                        Var=eval_str(str_cut(F,I+1,J-1));
                   15066:                        Var=f2df(Var);
                   15067:                        F0=str_cut(F,0,I-1);
                   15068:                }
                   15069:                if((I=findin(F0,FL))<0&&(I=findin(F,FL))<0) F=f2df(eval_str(F));
                   15070:                else F=[z__,[z__,FS[I],Var]];
                   15071:        }
                   15072:        if(type(F)!=4) F=f2df(F);
                   15073:        if(type(G)!=4) G=f2df(G);
1.20      takayama 15074:        if(V==G) return F;      /* subst(F(V),V,G) */
1.6       takayama 15075:        VF=vars(F);VG=vars(G);
1.20      takayama 15076:        if(type(V)==4){
                   15077:                for(VT=[],VV=V;VV!=[];VV=cdr(VV)){
                   15078:                        if(findin(car(VV),VF)>=0){
                   15079:                                X=makenewv(append(VF,VG));
                   15080:                                VF=cons(X,VF);
                   15081:                                F=mysubst(F,[car(VV),X]);
                   15082:                                VT=cons(X,VT);
                   15083:                        }else VT=cons(car(VV),VT);
                   15084:                }
                   15085:                for(V=reverse(VT);V!=[];V=cdr(V),G=cdr(G)) F=compdf(F,car(V),car(G));
                   15086:                return F;
                   15087:        }
1.6       takayama 15088:        for(E=I=0;I<30;I++){
                   15089:                for(J=0;J<30;J++){
                   15090:                        X=makev(["z__",I,J]);
                   15091:                        if(findin(X,VF)<0 && findin(X,VG)<0){
                   15092:                                E=1;break;
                   15093:                        }
                   15094:                }
                   15095:                if(E) break;
                   15096:        }
                   15097:        if(!E) return 0;
                   15098:        if(type(G)<4) return mysubst(F,[V,G]);
                   15099:        if(type(F)<4) F=[F]; /* return compdf([X,[X,0,F]],V,G); */
                   15100:        F=mysubst(F,[V,X]);
                   15101:        if(isvar(G[0])){
                   15102:                G=mysubst(G,[G[0],X]);
                   15103:                if(length(G)==2&&type(G[1])==4&&G[1][0]==X) G=G[1];
                   15104:                G=cons(G,cdr(F));
                   15105:        }
                   15106:        else G=cons([X,0,G],cdr(F));
                   15107:        return cons(car(F),G);
                   15108: }
                   15109:
                   15110: def fzero(F,LX)
                   15111: {
                   15112:        if(length(LX)==3){
                   15113:                V=LX[0];LX=cdr(LX);
                   15114:        }else V=x;
                   15115:        LX1=eval(LX[0]);LX2=eval(LX[1]);
                   15116:        if(getopt(zero)==1){
                   15117:                if(getopt(cont)==1) CT=1;
                   15118:                else CT=0;
                   15119:                if(getopt(trans)!=1 && type(F)<4) F=f2df(F);
                   15120:                F=mysubst(F,[[@pi,deval(@pi)],[@e,deval(@e)]]);
                   15121:                if(type(Dev=getopt(dev))!=1 || Dev<2) Dev=16;
                   15122:                V1=myeval(mysubst(F,[V,X1=LX1]));
                   15123:                V2=myeval(mysubst(F,[V,X2=LX2]));
                   15124:                if(V1>0){
                   15125:                        V0=V1;V1=V2;V2=V0;
                   15126:                        X0=X1;X1=X2;X2=X0;
                   15127:                }
                   15128:                if(V1<0 && V2>0){
                   15129:                        D=(V2-V1)*1024;
                   15130:                        for(I=0; I<Dev; I++){
                   15131: /*     mycat([D,X1,V1,X2,V2]) ; */
                   15132:                                if(iand(I,1)) X0=(X1+X2)/2;
                   15133:                                else X0=(V2*X1-V1*X2)/(V2-V1);
                   15134:                                V0=myeval(mysubst(F,[V,X0]));
                   15135:                                if(V0==0||V0==V1||V0==V2) return [X0,V0];
                   15136:                                if(V0<0){
                   15137:                                        if(!CT && V0+D<0) return [];
                   15138:                                        V1=V0;X1=X0;
                   15139:                                }else{
                   15140:                                        if(!CT && V0>D) return [];
                   15141:                                        V2=V0;X2=X0;
                   15142:                                }
                   15143:                        }
                   15144:                        X0=(V2*X1-V1*X2)/(V2-V1);
                   15145:                        return [X0,myeval(mysubst(F,[V,X0]))];
                   15146:                }
                   15147:                if(V0==0) return [X0,V0];
                   15148:                if(V1==0) return [X1,V1];
                   15149:                return [];
                   15150:        }
                   15151:        if(type(F)<4) F=f2df(F);
                   15152:        F=mysubst(F,[[@pi,deval(@pi)],[@e,deval(@e)]]);
                   15153:        L=[];
                   15154:        if(type(F)<4){
                   15155:                if(type(F)==3) F=nm(red(F));
                   15156:                if((Deg=deg(F,V))<=2){
                   15157:                        if(Deg==2){
                   15158:                                D=(C1=coef(F,1,V))^2-4*(C2=coef(F,2,V))*coef(F,0,V);
                   15159:                                if(D>=0){
                   15160:                                        R=dsqrt(D);
                   15161:                                        if((S=(-C1+R)/(2*C2))>=LX1&&S<=LX2) L=[[S,mysubst(F,[V,S])]];
                   15162:                                        if(D!=0 && (S=(-C1-R)/(2*C2))>=LX1&&S<=LX2) L=cons([S,mysubst(F,[V,S])],L);
                   15163:                                }
                   15164:                                L=qsort(L);
                   15165:                        }else if(Deg==1&&(S=-coef(F,0,V)/coef(F,1,V))>=LX1&&S<=LX2)
                   15166:                                L=[[S,mysubst(F,[V,S])]];
                   15167:                        return L;
                   15168:                }
                   15169:                for(L=[];S!=[];S=cdr(S))
                   15170:                        if(car(S)>=LX1&&car(S)<=LX2) L=cons([car(S),mysubst(F,[V,car(S)])],L);
                   15171:                return qsort(L);
                   15172:        }
                   15173:        if(type(Div=getopt(mesh))!=1 || Div<=0)
                   15174:                Div = 2^(10);
                   15175:        W=(LX2-LX1)/Div;
                   15176:        for(I=V2=0;I<=Div;I++){
                   15177:                X1=X2;X2=LX1+I*W;V1=V2;
                   15178:                if((V2=myeval(mysubst(F,[V,X2])))==0)
                   15179:                        L=cons([X2,V2],L);
                   15180:                if(V1*V2<0){
                   15181:                        L0=fzero(F,[V,X1,X2]|zero=1,trans=1);
                   15182:                        if(L0!=[]) L=cons(L0,L);
                   15183:                }
                   15184:        }
                   15185:        return reverse(L);
                   15186: }
                   15187:
                   15188: def fmmx(F,LX)
                   15189: {
                   15190:        if(length(LX)==3){
                   15191:                V=LX[0];LX=cdr(LX);
                   15192:        }else V=x;
                   15193:        LX1=eval(LX[0]);LX2=eval(LX[1]);
                   15194:        FT=F;
                   15195:        if(getopt(trans)!=1 && type(F)<4) FT=f2df(FT);
                   15196:        FT=mysubst(FT,[[@pi,eval(@pi)],[@e,eval(@e)]]);
                   15197:        if(type(G=getopt(dif))>=1){
                   15198:                if(G==1) G=os_md.mydiff(F,V);
                   15199:                L=fzero(G,[V,LX1,LX2]|option_list=getopt());
                   15200:                R=[[LX1,myeval(mysubst(FT,[V,LX1]))]];
                   15201:                for(I=0;L!=[];L=cdr(L),I++){
                   15202:                        X=car(L)[0];
                   15203:                        if(X==LX1) continue;
                   15204:                        R=cons([X,myeval(mysubst(FT,[V,X]))],R);
                   15205:                }
                   15206:                if(X!=LX2)      R=cons([LX2,myeval(mysubst(FT,[V,LX2]))],R);
                   15207:                if(getopt(mmx)!=1) return reverse(R);
                   15208:                for(Mi=Ma=car(R);R!=[];R=cdr(R)){
                   15209:                        if(car(R)[1]>Ma[1]) Ma=car(R);
                   15210:                        else if(car(R)[1]<Mi[1]) Mi=car(R);
                   15211:                }
                   15212:                return [Mi,Ma];
                   15213:        }
                   15214:        if(type(Div=getopt(mesh))!=1 || Div<=0)
                   15215:                Div = 2^(10);
                   15216:        if(type(Dev=getopt(dev))!=1 || Dev<2) Dev=16;
                   15217:        W=(LX2-LX1)/Div;
                   15218:        for(I=V2=V3=0;I<=Div;I++){
                   15219:                X1=X2;X2=X3;X3=LX1+I*W;V1=V2;V2=V3;
                   15220:                V3=myeval(mysubst(FT,[V,X3]));
                   15221:                if(I==0) L=[[X3,V3]];
                   15222:                if(I<2) continue;
                   15223:                if((V1-V2)*(V2-V3)<0){
                   15224:                        X02=X2;V02=V2;X03=X3;V03=V3;
                   15225:                        for(J=0; J<Dev && X1!=X3; J++){
                   15226:                                X12=(X1+X2)/2;V12=myeval(mysubst(FT,[V,X12]));
                   15227:                                if((V1-V12)*(V12-V2)<=0){
                   15228:                                        X3=X2;V3=V2;X2=X12;V2=V12;continue;
                   15229:                                }
                   15230:                                X23=(X2+X3)/2;V23=myeval(mysubst(FT,[V,X23]));
                   15231:                                if((V12-V2)*(V2-V23)<=0){
                   15232:                                        X1=X12;V1=V12;X3=X23;V3=V23;continue;
                   15233:                                }
                   15234:                                if((V2-V23)*(V23-V3)<=0){
                   15235:                                        X1=X2;V1=V2;X2=X23;V2=V23;continue;
                   15236:                                }
                   15237:                        }
                   15238:                        L=cons([X2,V2],L);
                   15239:                        X2=X02;V2=V02;X3=X03;V3=V03;
                   15240:                }
                   15241:        }
                   15242:        L=cons([LX2,myeval(mysubst(FT,[V,LX2]))],L);
                   15243:        if(getopt(mmx)!=1) return L;
                   15244:        for(Mi=Ma=car(L);L!=[];L=cdr(L)){
                   15245:                if(car(L)[1]>Ma[1]) Ma=car(L);
                   15246:                else if(car(L)[1]<Mi[1]) Mi=car(L);
                   15247:        }
                   15248:        return [Mi,Ma];
                   15249: }
                   15250:
                   15251: def flim(F,L)
                   15252: {
                   15253:        FD=f2df(F);
                   15254:        Lim0=4;Lim=12;FS=1;
                   15255:        if(type(Pc=getopt(prec))==1){
                   15256:                if((Pc>1&&Pc<31)||Pc>-5) Lim+=Pc;
                   15257:        }
                   15258:        if(type(Pc=getopt(init))==1 && Pc>0) FS*=Pc;
                   15259:        if(type(L)==7) L=[L];
                   15260:        else if(type(L)<2){
                   15261:                K=flim(F,["+",L]|option_list=getopt());
                   15262:                if(K=="") return K;
                   15263:                K1=flim(F,["-",L]|option_list=getopt());
                   15264:                if(K1=="") return K1;
                   15265:                if(type(K)==7||type(K1)==7){
                   15266:                        if(K!=K1) return "";
                   15267:                        return K;
                   15268:                }
                   15269:                if(abs(K)<10^(-5)){
                   15270:                        if(abs(K1)<10^(-5)) return (K1+K)/2;
                   15271:                        else return "";
                   15272:                }
                   15273:                if(abs((K1-K)/K)<10^(-4)) return (K1+K)/2;
                   15274:                return "";
                   15275:        }
                   15276:        if(type(L)!=4||type(L[0])!=7) return "";
                   15277:        if(L[0]=="-"||L[0]=="-infty"){
                   15278:                FS=-FS;
                   15279:        }else if(L[0]!="+"&&L[0]!="infty") return "";
                   15280:        FI=(length(L)==1)?1:0;
                   15281:        for(Inf=0,I=Lim0;I<Lim;I++){
                   15282:                D1=FS*8^I;D2=8*D1;
                   15283:                if(FI==0){
                   15284:                        D1=1/D1;D2=1/D2;
                   15285:                }
                   15286:                if(D1>D2){
                   15287:                        D=D1;D1=D2;D1=D;
                   15288:                        X1=D1;X2=D2;
                   15289:                }
                   15290:                if(FI==0){
                   15291:                        D1+=L[1];D2+=L[1];
                   15292:                }
                   15293:                K=fmmx(FD,[D1,D2]|mmx=1,mesh=16,dev=4);
                   15294:                if(I>Lim0){
                   15295:                        if(DF<K[1][1]-K[0][1]&&DF>10^(-8)&&DF<10^7){
                   15296:                                if(I>Lim0+1){
                   15297:                                        if(Inf==0) return "";
                   15298:                                }else Inf=1;
                   15299:                        }else if(Inf==1) return "";
                   15300:                }
                   15301:                DF=K[1][1]-K[0][1];
                   15302:        }
                   15303:        if(Inf==1){
                   15304:                if(K[0][1]>10^8) return "+";
                   15305:                else if(K[1][1]<-10^8) return "-";
                   15306:                return "";
                   15307:        }
                   15308:        V=(myfeval(FD,D1)+1.0)-1.0;
                   15309:        if(V!=0 && abs(V)<10^(-9)) return 0;
                   15310:        return V;
                   15311: }
                   15312:
                   15313: def fcont(F,LX)
                   15314: {
                   15315:        if(length(LX)==3){
                   15316:                V=LX[0];LX=cdr(LX);
                   15317:        }else V=x;
                   15318:        LX1=eval(LX[0]);LX2=eval(LX[1]);
                   15319:        if(getopt(trans)!=1 && type(F)<4) FT=f2df(F);
                   15320:        if(type(Div=getopt(mesh))!=1 || Div<=0)
                   15321:                Div = 2^(10);
                   15322:        if(type(Dev=getopt(dev))!=1 || Dev<2) Dev=16;
                   15323:        W=(LX2-LX1)/Div;
                   15324:        if((Df=getopt(dif))!=1){
                   15325:                Df=0;
                   15326:        }else{
                   15327:                if(Dev==16) Dev=6;
                   15328:                WD=W/2^(Dev+1);
                   15329:        }
                   15330:        F=FT;
                   15331:        C=2;
                   15332:        for(I=V2=V3=0;I<=Div;I++){
                   15333:                X1=X2;X2=X3;X3=LX1+I*W;V1=V2;V2=V3;
                   15334:                V3=myeval(mysubst(F,[V,X3]));
                   15335:                if(Df){
                   15336:                        if(I==Div) break;
                   15337:                        V3=(myeval(mysubst(F,[V,X3+WD]))-V3)/WD;
                   15338:                }
                   15339:                if(I==0) L=[[X3,V3]];
                   15340:                if(I<2) continue;
                   15341:                if(C*dabs(2*V2-V1-V3) > dabs(V1-V3)){
                   15342:                        X01=X1;V01=V1;X02=X2;V02=V2;X03=X3;V03=V3;
                   15343:                        for(J=0; X01!=X03; J++){
                   15344:                                if(dabs(V01-V02)>dabs(V02-V03)){
                   15345:                                        X03=X02;V03=V02;
                   15346:                                }else{
                   15347:                                        X01=X02;V01=V02;
                   15348:                                }
                   15349:                                if(J==Dev) break;
                   15350:                                X02=(X01+X02)/2;
                   15351:                                V02=myeval(mysubst(F,[V,X02]));
                   15352:                                if(Df) V02=(myeval(mysubst(F,[V,WD]))-V02)/WD;
                   15353:                                if(C*dabs(2*V02-V01-V03) < dabs(V01-V03)) break;
                   15354:                        }
                   15355:                        if(J==Dev||X01==X03) L=cons([X01,X03,V03-V01],L);
                   15356:                }
                   15357:        }
                   15358:        return reverse(L);
                   15359: }
                   15360:
1.57      takayama 15361: def xyplot(L,LX,LY)
                   15362: {
1.63      takayama 15363:        Vw=getopt(view);
                   15364:        if(type(Vw)!=1 && type(Vw)!=7 && Vw!=0) Vw=-1;
                   15365:        if(!LX){
                   15366:                L0=llget(L,1,[0]|flat=1);
1.71      takayama 15367:                LX=[lmin(L0),LXm=lmax(L0)];
                   15368:                S=SX=LX[1]-LX[0];
1.63      takayama 15369:                if(S>0){
                   15370:                        if(Vw) LX=[LX[0]-S/32,LX[1]+S/32];
                   15371:                }else LX=[LX[0]-1,LX[0]+1];
1.64      takayama 15372:        }
                   15373:        LX=map(deval,LX);
1.63      takayama 15374:        if(!LY){
                   15375:                L0=llget(L,1,[1]|flat=1);
1.71      takayama 15376:                LY=[lmin(L0),LYm=lmax(L0)];
                   15377:                S=SY=LY[1]-LY[0];
1.63      takayama 15378:                if(S>0){
                   15379:                        if(Vw) LY=[LY[0]-S/32,LY[1]+S/32];
                   15380:                }else LY=[LY[0]-1,LY[0]+1];
1.64      takayama 15381:        }
                   15382:        LY=map(deval,LY);
1.63      takayama 15383:        if(getopt(raw)==1) mycat([LX,LY]);
                   15384:        if(Vw!=-1){
                   15385:                if(Vw!=1){
                   15386:                        if(type(Vw)==7) Vw=trcolor(Vw);
                   15387:                        Opt=[["color",Vw]];
                   15388:                }else Opt=[];
                   15389:                Glib_math_coordinate=1;
                   15390:                glib_window(LX[0],LY[0],LX[1],LY[1]);
                   15391:                for(; L!=[];L=cdr(L))
                   15392:                        glib_putpixel(car(L)[0],car(L)[1]|option_list=Opt);
1.71      takayama 15393:                if((AX=getopt(ax))==1||AX==2){
                   15394:                        if(LY[0]<0&&LY[1]>0){
                   15395:                                glib_line(LX[0],0,LX[1],0);
                   15396:                                if(AX==2&&LXm>0){
                   15397:                                        E=floor(dlog(LXm)/dlog(10));
                   15398:                                        V=floor(LXm*10^(-E)+1/128)*10^E;
                   15399:                                        glib_line(V,0,V,SY/64);
                   15400:                                        glib_print(V,-SY/128,rtostr(V));
                   15401:                                }
                   15402:                        }
                   15403:                        if(LX[0]<0&&LX[1]>0){
                   15404:                                glib_line(0,LY[0],0,LY[1]);
                   15405:                                        if(AX==2&&LYm>0){
                   15406:                                                E=floor(dlog(LYm)/dlog(10)+1/64);
                   15407:                                                V=floor(LYm*10^(-E)+1/128)*10^E;
                   15408:                                                glib_line(0,V,SX/64,V);
                   15409:                                        glib_print(SX/96,V,rtostr(V));
                   15410:                                }
                   15411:
                   15412:                        }
                   15413:                }
1.63      takayama 15414:                return [LX,LY];
                   15415:        }
1.57      takayama 15416:        Opt=getopt();Opt0=delopt(Opt,["dviout","proc"]);
1.64      takayama 15417:        if(type(R=getopt(to))!=4) To=[12,8];
                   15418:        R=[To[0]/(LX[1]-LX[0]),RY=To[1]/(LY[1]-LY[0])];
                   15419:        R=[sint(R[0],4|str=0),sint(R[1],4|str=0)];
                   15420:        S="% ";
                   15421:        if(type(C=getopt(scale))!=1&&type(C)!=4){
                   15422:                Opt0=cons(["scale",R],Opt0);
                   15423:                S+="scale="+rtostr(R)+", ";
                   15424:        }
1.65      takayama 15425:        S+=rtostr(LX)+", "+rtostr(LY)+"\n";
1.64      takayama 15426:        for(L0=[],TL=L;TL!=[];TL=cdr(TL)){
1.57      takayama 15427:                TTL=map(deval,car(TL));
                   15428:                if(TTL[0]<LX[0]||TTL[0]>LX[1]||TTL[1]<LY[0]||TTL[1]>LY[1]){
                   15429:                        S+=xylines(reverse(L0)|option_list=Opt0);
                   15430:                        L0=[];
                   15431:                }else{
                   15432:                        L0=cons(TTL,L0);
                   15433:                }
                   15434:        }
                   15435:        if(length(L0)>1) S+=xylines(reverse(L0)|option_list=Opt0);
1.64      takayama 15436:        AX=getopt(ax);Opt=delopt(Opt0,"opt");
1.65      takayama 15437:        if(type(AX)==4) S+="% axis\n"+xygraph([0,0],0,LX,LX,LY|option_list=Opt);
1.64      takayama 15438:        else if((LX[0]<=0&&LX[1]>=0)||(LY[0]<=0&&LY[1]>=0))
1.65      takayama 15439:                S+="% axis\n"+xygraph([0,0],0,LX,LX,LY|option_list=cons(["ax",[0,0]],Opt));
1.57      takayama 15440:        if(getopt(dviout)!=1) return S;
                   15441:        xyproc(S|dviout=1);
1.64      takayama 15442:        return [LX,LY];
1.57      takayama 15443: }
                   15444:
1.63      takayama 15445: def xyaxis(A,X,Y)
                   15446: {
                   15447:        if(isint(Vw=getopt(view))&&Vw!=0){
                   15448:                CL=getopt(opt);
                   15449:                if(type(CL)==7) CL=trcolor(CL);
                   15450:                if(type(CL)!=0) CL=0;
                   15451:                if(CL) Opt=[[color,CL]];
                   15452:                else Opt=[];
                   15453:                Glib_math_coordinate=1;
                   15454:                UX=(X[1]-X[0])/50;UY=(Y[1]-Y[0])/50;
                   15455:                glib_window(X[0],Y[0],X[1],Y[1]);
                   15456:                glib_line(A[0],Y[0],A[0],Y[1]|option_list=Opt);
                   15457:                glib_line(X[0],A[1],X[1],A[1]|otpion_list=Opt);
                   15458:                if(length(A)>2&&A[2]){
                   15459:                        I0=-floor((A[0]-X[0])/A[2]);I1=floor((X[1]-A[0])/A[2]);
                   15460:                        for(I=I0;I<=I1;I++){
                   15461:                                IX=A[0]+A[2]*I;
                   15462:                                if(iand(Vw,2)) glib_print(IX-UX,A[1]-UY/2,rtostr(IX));
                   15463:                                glib_line(IX,A[1],IX,A[1]+UY);
                   15464:                        }
                   15465:                }
                   15466:                if(length(A)>3&&A[3]){
                   15467:                        I0=-floor((A[1]-Y[0])/A[3]);I1=floor((Y[1]-A[1])/A[3]);
                   15468:                        for(I=I0;I<=I1;I++){
                   15469:                                IY=A[1]+A[3]*I;
                   15470:                                if(iand(Vw,4)) glib_print(A[0]-UX*2,IY+UY,rtostr(IY));
                   15471:                                glib_line(A[0],IY,A[0]+UX,IY);
                   15472:                        }
                   15473:                }
                   15474:                return;
                   15475:        }
                   15476:        Opt=getopt();
                   15477:        Opt=cons(["ax",A],Opt);
                   15478:        return xygraph([0,0],0,[0,1],X,Y|option_list=Opt);
                   15479: }
                   15480:
1.6       takayama 15481: def xygraph(F,N,LT,LX,LY)
                   15482: {
                   15483:        if((Proc=getopt(proc))!=1&&Proc!=2&&Proc!=3) Proc=0;
                   15484:        if(type(DV=getopt(dviout))==4){
                   15485:                OL=delopt(getopt(),["dviout","shift","ext","cl"]);
                   15486:                OL=cons(["proc",1],OL);
                   15487:                R=xygraph(F,N,LT,LX,LY|option_list=OL);
                   15488:                OL=delopt(getopt(),["shift","ext","cl"]|inv=1);
                   15489:                return execdraw(R,DV|optilon_list=OL);
                   15490:        }
                   15491:        if(N==0) N=32;
                   15492:        if(N<0){
                   15493:                N=-N;
                   15494:                N1=-1; N2=N+1;
                   15495:        }else{
                   15496:                N1=0; N2=N;
                   15497:        }
                   15498:        if(length(LT)==3 && isvar(LT[0])==1){
                   15499:                TT=LT[0]; LT=cdr(LT);
                   15500:                F=mysubst(F,[TT,x]);
                   15501:        }
                   15502:        if(LX==0) LX=LT;
                   15503:        if((Acc=getopt(Acc))!=1) Acc=0;
                   15504:        if(Acc){
                   15505:                LX=[eval(LX[0]),eval(LX[1])];
                   15506:                LY=[eval(LY[0]),eval(LY[1])];
                   15507:                LT=[eval(LT[0]),eval(LT[1])];
                   15508:        }else{
                   15509:                LX=[deval(LX[0]),deval(LX[1])];
                   15510:                LY=[deval(LY[0]),deval(LY[1])];
                   15511:                LT=[deval(LT[0]),deval(LT[1])];
                   15512:        }
                   15513:        TD=(LT[1]-LT[0])/N;
                   15514:        if(type(Mul=getopt(scale))!=1){
                   15515:                if(type(Mul)==4){
                   15516:                        MulX=Mul[0]; MulY=Mul[1];
                   15517:                }else MulX=MulY=1;
                   15518:        }else MulX=MulY=Mul;
                   15519:        if(type(Org=getopt(org))==4){
                   15520:                Orgx=Org[0];Orgy=Org[1];
                   15521:        }else Orgx=Orgy=0;
                   15522:        if(type(F)!=4 || (getopt(para)!=1 && length(F)>1 && type(F[0])<4 && type(F[1])==4)) {
                   15523:                if(getopt(rev)!=1){
                   15524:                        F1=x; /* LX[0]+(LX[1]-LX[0])*(x-LT[0])/(TD*N); */
                   15525:                        F2=F;
                   15526:                }else{
                   15527:                        F1=F;
                   15528:                        F2=x; /* LY[0]+(LY[1]-LY[0])*(x-LT[0])/(TD*N); */
                   15529:                }
                   15530:        }else{
                   15531:                F1=F[0]; F2=F[1];
                   15532:        }
                   15533:        if(F1==0 || F2==0) LT=[];
                   15534:        if(length(LT)==2){
                   15535:                if(Acc){
                   15536:                        for(LTT=[],I=N2;I>=N1;I--)
                   15537:                                LTT=cons(eval(LT[0]+I*(LT[1]-LT[0])/N),LTT);
                   15538:                }else{
                   15539:                        for(LTT=[],I=N2;I>=N1;I--)
                   15540:                                LTT=cons(deval(LT[0]+I*(LT[1]-LT[0])/N),LTT);
                   15541:                }
                   15542:                LT=LTT;
                   15543:        }
                   15544:        Cpx=getopt(cpx);
                   15545:        if(Cpx!=1 && (str_str(rtostr(F1),"@i")>=0 || str_str(rtostr(F2),"@i")>=0))
                   15546:                Cpx=1;
                   15547:        if(type(Cpx)<0) Cpx=0;
                   15548:        if(!Acc){
                   15549:                if(type(F1)<4) F1=f2df(F1);
                   15550:                if(type(F2)<4) F2=f2df(F2);
                   15551:        }
                   15552:        if(type(Err=getopt(err))==1){
                   15553:                F1=mysubst(F1,[x,x+Err*TD/1001.23]);
                   15554:                F2=mysubst(F2,[x,x+Err*TD/1001.23]);
                   15555:        }
                   15556:        if(type(F1)==4 || type(F2)==4){
                   15557:                Dn=1;
                   15558:        }else Dn=dn(F1)*dn(F2);
                   15559:        for(V=[],PT=LT;PT!=[]; PT=cdr(PT)){
                   15560:                T=car(PT);
                   15561:                if(myfeval(Dn,T)==0){
                   15562:                        V=cons(0,V); continue;
                   15563:                }
                   15564:                if(Cpx>0||Acc){
                   15565:                        X=myfeval(F1,T);Y=myfeval(F2,T);
                   15566:                }else{
                   15567:                        X=myfdeval(F1,T);Y=myfdeval(F2,T);
                   15568:                }
                   15569:                if((N1==0||(PT!=LT&&length(PT)!=1)) && (X<LX[0]||X>LX[1]||Y<LY[0]||Y>LY[1]))
                   15570:                        V=cons(0,V);
                   15571:                else
                   15572:                        V=cons([MulX*(X-Orgx),MulY*(Y-Orgy)],V);
                   15573:        }
                   15574:        V=reverse(V);
                   15575:        Gap0=Gap=Arg=0;
                   15576:        if(type(Prec=getopt(prec))<0)
                   15577:                Level=0;
                   15578:        else if(Prec==0) Level=4;
                   15579:        else if(type(Prec)==1){
                   15580:                Level=Prec;
                   15581:                if(Level<0){
                   15582:                        Level=-Level;
                   15583:                        Gap0=1;
                   15584:                }
                   15585:        }else if(type(Prec)==4){
                   15586:                Level=Prec[0];
                   15587:                if(length(Prec)>1) Arg=Prec[1];
                   15588:                if(length(Prec)>2) Gap0=Prec[2];
                   15589:        }
                   15590:        if(Level>0){
                   15591:                if(Level>16) Level=16;
                   15592:                if(Arg<=0) Arg=30;
                   15593:                else if(Arg>120) Arg=120;
                   15594:                Arg=Acc?eval(@pi*Arg/180):deval(@pi*Arg/180);
                   15595:                SL=dcos(Arg);
                   15596:        }
                   15597:        if(Gap0>0){
                   15598:                if(Gap0<2) Gap0=16;
                   15599:                else if(Gap0>512) Gap0=512;
                   15600:                Gap=((MulX*(LX[1]-LX[0]))^2+(MulY*(LY[1]-LY[0]))^2)/(Gap0^2);
                   15601:        }
                   15602:        for(I=0;I<Level;I++){
                   15603:                for(F=K=G=0,NV=NLT=[],PLT=LT,PV=V;PLT!=[];K++,PLT=cdr(PLT),PV=cdr(PV)){
                   15604:                        TG=0;D0=D1;CLT0=CLT;CV0=CV;CV=car(PV);CLT=car(PLT);
                   15605:                        if(length(PV)>1){
                   15606:                                if((CV1=car(cdr(PV)))!=0 && CV!=0)
                   15607:                                        D1=[CV[0]-CV1[0],CV[1]-CV1[1]];
                   15608:                                else D1=0;
                   15609:                        }else K=-1; /* ? */
                   15610:                        if(K>0 &&(((D1==0||D0==0)&&(CV0!=0||CV!=0||CV1!=0)) || dvangle(D0,D1)<SL ||
                   15611:                          (Gap>0 && type(D0)==4 && (TG=(D0[0]^2+D0[1]^2-Gap)>0)))){
                   15612:                                G++;T1=(CLT0+CLT)/2;
                   15613:                                if(F==0 && (CV0!=0 || CV!=0)){
                   15614:                                        if(myfdeval(Dn,T1)==0){
                   15615:                                                NV=cons(0,NV); NLT=cons(T1,NLT);
                   15616:                                        }
                   15617:                                        if(Cpx>0||Acc){
                   15618:                                                X=myfeval(F1,T1);Y=myfeval(F2,T1);
                   15619:                                        }else{
                   15620:                                                X=myfdeval(F1,T1);Y=myfdeval(F2,T1);
                   15621:                                        }
                   15622:                                        if(K==1 && N1<0){
                   15623:                                                NV=[];NLT=[];
                   15624:                                        }
                   15625:                                        if((K>1||N1==0)&&(X<LX[0]||X>LX[1]||Y<LY[0]||Y>LY[1])){
                   15626:                                                NV=cons(0,NV);NLT=cons(T1,NLT);F=0;
                   15627:                                        }else{
                   15628:                                                NV=cons([MulX*(X-Orgx),MulY*(Y-Orgy)],NV);NLT=cons(T1,NLT);
                   15629:                                        }
                   15630:                                }
                   15631:                                NV=cons(CV,NV);NLT=cons(CLT,NLT);
                   15632:                                if(!TG&&(CV0!=0||CV1!=0)){
                   15633:                                        T2=(car(cdr(PLT))+CLT)/2;
                   15634:                                        if(myfdeval(Dn,T2)==0){
                   15635:                                                NV=cons(0,NV); NLT=cons(CLT,NLT);
                   15636:                                        }
                   15637:                                        if(Cpx>0||Acc){
                   15638:                                                X=myfeval(F1,T2);Y=myfeval(F2,T2);
                   15639:                                        }else{
                   15640:                                                X=myfdeval(F1,T2);Y=myfdeval(F2,T2);
                   15641:                                        }
                   15642:                                        if((N1==0||length(PV)!=2)&&(X<LX[0]||X>LX[1]||Y<LY[0]||Y>LY[1])){
                   15643:                                                NV=cons(0,NV);NLT=cons(T1,NLT);
                   15644:                                        }else{
                   15645:                                                NV=cons([MulX*(X-Orgx),MulY*(Y-Orgy)],NV);NLT=cons(T2,NLT);
                   15646:                                        }
                   15647:                                }
                   15648:                                if(length(PV)==2 && N1==-1)     break;
                   15649:                                F=1;
                   15650:                        }else{
                   15651:                                F=0;NV=cons(CV,NV);NLT=cons(CLT,NLT);
                   15652:                        }
                   15653:                }
                   15654:                V=reverse(NV);LT=reverse(NLT);
                   15655:                if(G==0) break;
                   15656:        }
                   15657:        if(Gap>0){
                   15658:                for(NV=[],PV=V;PV!=[];PV=cdr(PV)){
                   15659:                        NV=cons(P0=car(PV),NV);
                   15660:                        if(length(PV)>1 && P0!=0 && PV[1]!=0
                   15661:                          && (P0[0]-PV[1][0])^2+(P0[1]-PV[1][1])^2>Gap) NV=cons(0,NV);
                   15662:                }
                   15663:                V=reverse(NV);
                   15664:        }
1.18      takayama 15665:        if((Raw=getopt(raw))==1) return V;
                   15666:        if(Raw==2) return [V,LT];
1.6       takayama 15667:        OL=[["curve",1]];OLP=[];
                   15668:        if(type(C=getopt(ratio))==1){
                   15669:                OL=cons(["ratio",C],OL);OLP=cons(["ratio",C],OLP);
                   15670:        }
                   15671:        if(Acc==1) OL=cons(["Acc",1],OL);
                   15672:        if(N1<0) OL=cons(["close",-1],OL);
                   15673:        if(type(Opt=getopt(opt))!=7 && type(Opt)!=4){
                   15674:                if(Opt==0) return xylines(V|option_list=cons(["opt",0],OL));
                   15675:        }
                   15676:        OL=cons(["opt",(Proc)?0:Opt],OL);
                   15677:        if(type(Opt)>=0) OLP=cons(["opt",Opt],OLP);
                   15678:        if(type(Vb=getopt(verb))==1||type(Vb)==4){
                   15679:                OL=cons(["verb",Vb],OL);OLP=cons(["verb",Vb],OL);
                   15680:        }
                   15681:        if(Proc){
                   15682:                S=(Proc==1)?
                   15683:                        [[0,[MulX*(LX[0]-Orgx),MulX*(LX[1]-Orgx)],[MulY*(LY[0]-Orgy),MulY*(LY[1]-Orgy)],
                   15684:                        (TikZ)?1:1/10]]:[];
                   15685:                S=cons([1,OLP,xylines(V|option_list=OL)],S);
                   15686:                if(Proc==3) return car(S);
                   15687:        }else S=xylines(V|option_list=OL);
                   15688:        if(type(Pt=getopt(pt))==4){
                   15689:                if(type(Pt[0])!=4) Pt=[Pt];
                   15690:                if(length(Pt)>1 && type(Pt[1])!=4) Pt=[Pt];
                   15691:                for(PT=Pt;PT!=[];PT=cdr(PT)){
                   15692:                        PP=car(PT);
                   15693:                        if(type(PP[0])!=4) PP=[PP];
                   15694:                        P=car(PP);PP=cdr(PP);
                   15695:                        Qx=MulX*(P[0]-Orgx);Qy=MulY*(P[1]-Orgy);
                   15696:                        if(length(PP)>0 && type(PP[0])==4){             /* draw line */
                   15697:                                P=car(PP);
                   15698:                                Q1x=MulX*(P[0]-Orgx);Q1y=MulY*(P[1]-Orgy);
                   15699:                                if(length(PP)<1 || car(PP)==0 || iand(car(PP),1))
                   15700:                                         OL=["opt",(TikZ)?"-":"@{-}"];
                   15701:                                else OL=["opt",(TikZ)?".":"@{.}"];
                   15702:                                if(Proc) S=cons([1,OL,[[Qx,Qy],[Q1x,Q1y]]],S);
                   15703:                                else S=S+xylines([[Qx,Qy],[Q1x,Q1y]]|optilon_list=OL);
                   15704:                                continue;
                   15705:                        }
                   15706:                        if(length(PP)==0 || type(car(PP))!=7)  SS="$\\bullet$";
                   15707:                        else SS=car(PP);
                   15708:                        if(length(PP)<=1){
                   15709:                                if(Proc) S=cons([2,[],[Qx,Qy],[SS]],S);
                   15710:                                else S=S+xyput([Qx,Qy,SS]);
                   15711:                        }else{
                   15712:                                if(Proc) S=cons([2,[],[Qx,Qy],[[SS],"",PP[1]]],S);
                   15713:                                S=S+xyput([Qx,Qy,SS,"",PP[1]]);
                   15714:                        }
                   15715:                }
                   15716:        }
                   15717:        if(type(Ax=getopt(ax))==4){  /* draw axis */
                   15718:                Adx0=Ady0=0; Adx1=Ady1=0.1;
                   15719:                if(!TikZ){
                   15720:                        if(!XYcm) Adx1=Ady1=1;
                   15721:                        LOp="@{-}"; LxOp="+!U"; LyOp="+!R";
                   15722:                }else{
                   15723:                        LOp="-"; LxOp="below"; LyOp="left";
                   15724:                }
                   15725:                LOp0=LOp1=LOp;
                   15726:                LxOO=(Ax[1]==LY[0])?LxOp:(TikZ)?"below left":"+!UR";
                   15727:                if(type(AxOp=getopt(axopt))>0){
                   15728:                        if(type(AxOp)==1){
                   15729:                                if(AxOp>0)      Adx1=Ady1=AxOp;
                   15730:                                else if(AxOp<0){
                   15731:                                        Adx1=Ady1=0; Adx0=Ady0=AxOp;
                   15732:                                }
                   15733:                        }else if(type(AxOp)==4){
                   15734:                                if(type(T=car(AxOp))==4 && length(AxOp)>1){
                   15735:                                        if(type(T)==7){
                   15736:                                                LxOp=T; LyOp=AxOp[1];
                   15737:                                        }else if(type(T)==4){
                   15738:                                                Ay0=T[0]; Ay1=T[1]; Ax0=AxOp[1][0]; Ax1=AxOp[1][1];
                   15739:                                                if(length(T)>2) LxOp=T[2];
                   15740:                                                if(length(AxOp[1])>2) LyOp=AxOp[1][2];
                   15741:                                        }
                   15742:                                }
                   15743:                                if(length(AxOp)>2 && type(AxOp[2])==7) LxOO=AxOp[2];
                   15744:                                if(length(AxOp)>3 && type(AxOp[3])==7) LOp0=AxOp[3];
                   15745:                                if(length(AxOp)>4 && type(AxOp[4])==7) LOp1=AxOp[4];
                   15746:                        }
                   15747:                        if(type(AxOp)==7) LOp0=AxOp;
                   15748:                }
                   15749:                if(Ax[0]>=LX[0] && Ax[0]<=LX[1]){       /* draw marks on x-axis */
                   15750:                        if(Proc) S=cons([3,(type(LOp0)>=0)?[["opt",LOp0]]:[],
                   15751:                                [MulX*(Ax[0]-Orgx),MulY*(LY[0]-Orgy)],[MulX*(Ax[0]-Orgx),MulY*(LY[1]-Orgy)]],S);
                   15752:                        else S=S+xyarrow([MulX*(Ax[0]-Orgx),MulY*(LY[0]-Orgy)],
                   15753:                                [MulX*(Ax[0]-Orgx),MulY*(LY[1]-Orgy)]|opt=LOp0);
                   15754:                        if(length(Ax)>2){
                   15755:                                D=Ax[2];
                   15756:                                if(type(D)==1 && D>0){
                   15757:                                        I0=ceil((LX[0]-Ax[0])/D); I1=floor((LX[1]-Ax[0])/D);
                   15758:                                        for(DD=[],I=I0; I<=I1; I++){
                   15759:                                                if(length(Ax)<5) DD=cons(I*D,DD);
                   15760:                                                else if(Ax[4]==0) DD=cons([I*D,I*D+Ax[0]],DD);
                   15761:                                                else if(Ax[4]==1) DD=cons([I*D,I*D],DD);
                   15762:                                                else if(Ax[4]==2) DD=cons([I*D,I],DD);
                   15763:                                        }
                   15764:                                        D=DD;
                   15765:                                }
                   15766:                                if(type(D)==4){
                   15767:                                        for(;D!=[]; D=cdr(D)){
                   15768:                                                T=car(D);
                   15769:                                                if(type(T)==4) T=car(T);
                   15770:                                                X=MulX*(T+Ax[0]-Orgx); Y=MulY*(Ax[1]-Orgy);
                   15771:                                                if(T!=0){
                   15772:                                                        if(Proc) S=cons([3,(type(LOp1)>=0)?[["opt",LOp1]]:[],[X,Y+Ady0],[X,Y+Ady1]],S);
                   15773:                                                        else S=S+xyarrow([X,Y+Ady0],[X,Y+Ady1]|opt=LOp1);
                   15774:                                                }
                   15775:                                                if(type(car(D))==4){
                   15776:                                                        Arg=[(T==0)?LxOO:LxOp,D[0][1]];
                   15777:                                                        if(Proc) S=cons([2,[],[X,Y+Ady0],[Arg]],S);
                   15778:                                                        else S=S+xyput([X,Y+Ady0,Arg]);
                   15779:                                                }
                   15780:                                        }
                   15781:                                }
                   15782:                        }
                   15783:                }
                   15784:                if(Ax[1]>=LY[0] && Ax[1]<=LY[1]){       /* draw marks on y-axis */
                   15785:                        if(Proc) S=cons([3,[["opt",LOp0]],
                   15786:                                        [MulX*(LX[0]-Orgx),MulY*(Ax[1]-Orgy)],
                   15787:                                        [MulX*(LX[1]-Orgx),MulY*(Ax[1]-Orgy)]],S);
                   15788:                        else S=S+xyarrow([MulX*(LX[0]-Orgx),MulY*(Ax[1]-Orgy)],
                   15789:                                [MulX*(LX[1]-Orgx),MulY*(Ax[1]-Orgy)]|opt=LOp0);
                   15790:                        if(length(Ax)>3){
                   15791:                                D=Ax[3];
                   15792:                                if(type(D)==1 && D>0){
1.57      takayama 15793:                                        I0=ceil((LY[0]-Ax[1])/D); I1=floor((LY[1]-Ax[1])/D);
1.6       takayama 15794:                                        for(DD=[],I=I0; I<=I1; I++){
                   15795:                                                if(length(Ax)<5) DD=cons(I*D,DD);
                   15796:                                                else if(I!=0){
                   15797:                                                        if(Ax[4]==0) DD=cons([I*D,I*D+Ax[1]],DD);
                   15798:                                                        if(Ax[4]==1) DD=cons([I*D,I*D],DD);
                   15799:                                                        if(Ax[4]==2) DD=cons([I*D,I],DD);
                   15800:                                                }
                   15801:                                        }
                   15802:                                        D=DD;
                   15803:                                }
                   15804:                                if(type(D)==4){
                   15805:                                        for(;type(D)==4&&D!=[]; D=cdr(D)){
                   15806:                                                T=car(D);
                   15807:                                                if(type(T)==4) T=car(T);
                   15808:                                                X=MulX*(Ax[0]-Orgx); Y=MulY*(T+Ax[1]-Orgy);
                   15809:                                                if(T!=0){
                   15810:                                                        if(Proc) S=cons([3,(type(LOp0)>=0)?[["opt",LOp1]]:[],
                   15811:                                                                [X+Adx0,Y],[X+Adx1,Y]],S);
                   15812:                                                        else S=S+xyarrow([X+Adx0,Y],[X+Adx1,Y]|opt=LOp1);
                   15813:                                                }
                   15814:                                                if(type(car(D))==4){
                   15815:                                                        if(Proc) S=cons([2,[],[X,Y+Ady0],[[LyOp,D[0][1]]]],S);
                   15816:                                                        else S=S+xyput([X,Y+Ady0,[LyOp,D[0][1]]]);
                   15817:                                                }
                   15818:                                        }
                   15819:                                }
                   15820:                        }
                   15821:                }
                   15822:        }
                   15823:        if(Proc) return reverse(S);
                   15824:        if(getopt(dviout)!=1) return S;
                   15825:        xyproc(S|dviout=1);
                   15826: }
                   15827:
                   15828: def xyarrow(P,Q)
                   15829: {
                   15830:        Cmd = ["fill","filldaw","shade","shadedraw","clip ","pattern","path ","node","coordinate"];
                   15831:        if(type(P)<4) return "%\n";
                   15832:        SS=getopt(opt);
                   15833:        if(!TikZ){
                   15834:                if(type(Q)<4) return "";
                   15835:                S="{"+xypos(P)+" \\ar";
                   15836:                if(type(SS)==7) S=S+SS;
                   15837:                return S+" "+xypos(Q)+"};\n";
                   15838:        }
                   15839:        if(type(SS)==4 && length(SS)>1){
                   15840:                if(length(SS)>2) SU=SS[2];
                   15841:                ST=SS[1];
                   15842:                SS=SS[0];
                   15843:        }
                   15844:        if(type(SS)!=7) SS="->";
                   15845:        if(type(ST)!=7) ST=" -- ";
                   15846:        if(type(SU)!=7) SU="";
                   15847:        if(type(S=getopt(cmd))==7) S="\\"+S;
                   15848:        else S="\\draw";
                   15849:        if(type(Q)!=4){
                   15850:                if(Q>0 && Q<=length(Cmd)) S="\\"+Cmd[Q-1]+"";
                   15851:                if(SS!="-") S=S+"["+SS+"]";
                   15852:                if(SU!="") SU="["+SU+"]";
                   15853:                return S+xypos(P)+ST+SU+";\n";
                   15854:        }
1.8       takayama 15855:        if(SS!="-"&&SS!="") S=S+"["+SS+"]";
1.6       takayama 15856:        if(length(P)<3 && length(Q)<3)
                   15857:                return S+xypos(P)+ST+xypos(Q)+SU+";\n";
                   15858:        if(length(P)==2) P=[P[0],P[1],"","_0"];
                   15859:        else if(length(P)==3 || (length(P)==4 && P[3]==""))
                   15860:                P=[P[0],P[1],P[2],"_0"];
                   15861:        else if(P[3]=="")
                   15862:                P=[P[0],P[1],P[2],"_0",P[4]];
                   15863:        if(length(Q)==2) Q=[Q[0],Q[1],"","_1"];
                   15864:        else if(length(Q)==3 || (length(Q)==4 && Q[3]==""))
                   15865:                Q=[Q[0],Q[1],Q[2],"_1"];
                   15866:        else if(Q[3]=="")
                   15867:                Q=[Q[0],Q[1],Q[2],"_1",Q[4]];
                   15868:        return S+xypos(P)+" "+xypos(Q)+"("+P[3]+")"+ST+"("+Q[3]+")"+SU+";\n";
                   15869: }
                   15870:
                   15871: def xyarrows(P,Q,R)
                   15872: {
                   15873:        PQ=newvect(4);
                   15874:        PQ[0]=(type(P[0])!=4)?f2df(P[0]):P[0];
                   15875:        PQ[1]=(type(P[1])!=4)?f2df(P[1]):P[1];
                   15876:        PQ[2]=(type(Q[0])!=4)?f2df(Q[0]):Q[0];
                   15877:        PQ[3]=(type(Q[1])!=4)?f2df(Q[1]):Q[1];
                   15878:        if(type(R[0])!=4) R=[R];
                   15879:        TR=R[0];NX=TR[2];X=X0=TR[0];DX=(TR[1]-TR[0])/NX;
                   15880:        if(length(R)==2){
                   15881:                TR=R[1];NY=TR[2];Y=TR[0];DY=(TR[1]-TR[0])/NY;
                   15882:        }else{
                   15883:                NY=1;Y=DY=0;
                   15884:        }
                   15885:        if(type(L=getopt(abs))!=1) L=0;
                   15886:        if(type(Sc=getopt(scale))!=1) Sc=0;
                   15887:        OL=[];
                   15888:        if(type(Opt=getopt(opt))==7) OL=cons(["opt",Opt],OL);
                   15889:        Tb=str_tb(0,0);
                   15890:        for(J=0;J<NY;Y+=DY,J++){
                   15891:                for(I=0,X=X0;I<NX;I++,X+=DX){
                   15892:                        PX=myf2eval(PQ[0],X,Y);PY=myf2eval(PQ[1],X,Y);
                   15893:                        VX=myf2eval(PQ[2],X,Y);VY=myf2eval(PQ[3],X,Y);
                   15894:                        if(L>0){
                   15895:                                C=dnorm([VX,VY]);
                   15896:                                if(C!=0){
                   15897:                                        VX*=L/C;VY*=L/C;
                   15898:                                }
                   15899:                        }
                   15900:                        if(Sc){
                   15901:                                VX*=Sc;VY*=Sc;
                   15902:                        }
                   15903:                        if(VX||VY) str_tb(xyarrow([PX,PY],[PX+VX,PY+VY]|optilon_list=OL),Tb);
                   15904:                }
                   15905:        }
                   15906:        return str_tb(0,Tb);
                   15907: }
                   15908:
                   15909: def polroots(L,V)
                   15910: {
                   15911:        INIT=1;
                   15912:        if(type(CF=getopt(comp))!=1) CF=0;
                   15913:        OL=getopt();
                   15914:        if(CF>32){
                   15915:                CF-=64;
                   15916:                INIT=0;
                   15917:        }else OL=cons(["comp",CF+64],delopt(OL,"comp"));
                   15918:        if(type(V)==4&&length(V)==1){
                   15919:                L=L[0];V=V[0];
                   15920:        }
                   15921:        Lim=Lim2=[];
                   15922:        if(type(L)<4){
                   15923:                if(type(Lim=getopt(lim))==4){
1.17      takayama 15924:                        if(type(Lim[0])!=4){
                   15925:                                if(!isvar(Lim[0])) Lim=cons(V,[Lim]);
                   15926:                                Lim=[Lim];
                   15927:                        }
                   15928:                        if(!isvar(Lim[0][0])) Lim=[cons(V,Lim)];
1.6       takayama 15929:                        Lim=delopt(Lim,V|inv=1);
                   15930:                        if(Lim!=[]){
                   15931:                                Lim=Lim[0];
                   15932:                                if(length(Lim)==3) Lim2=Lim[2];
                   15933:                                Lim=Lim[1];
                   15934:                        }
                   15935:                }else{
                   15936:                        Lim=Lim2=[];
                   15937:                }
                   15938:                if((CF==-2||CF==-1||CF==2)&&iscoef(L,os_md.israt)){     /* Rat+Comp, Rat+Real or Rat */
                   15939:                        S=(CF==-1)?getroot(L,V|cpx=1):getroot(L,V);
                   15940:                        for(RR=[],F=x;S!=[];S=cdr(S)){
                   15941:                                if(findin(V,vars(C=car(S)))<0){         /* Rational solution */
                   15942:                                        if(type(C)<2){
                   15943:                                                if(Lim!=[]&&(real(C)<Lim[0]||real(C)>Lim[1])) continue;
                   15944:                                                if(Lim2!=[]&&(imag(C)<Lim2[0]||imag(C)>Lim2[1])) continue;
                   15945:                                        }
                   15946:                                        if(F!=C) RR=cons(F=C,RR);
                   15947:                                }else if(CF<0){                                         /* Irrational solution */
                   15948:                                        if((R=pari(roots,mysubst(C,[V,x])))!=0){
                   15949:                                                for(R=vtol(R);R!=[];R=cdr(R))
                   15950:                                                        if((C=car(R))!=F && ntype(C)<CF+6){
                   15951:                                                                if(Lim!=[]&&(real(C)<Lim[0]||real(C)>Lim[1])) continue;
                   15952:                                                                if(Lim2!=[]&&(imag(C)<Lim2[0]||imag(C)>Lim2[1])) continue;
                   15953:                                                                RR=cons(F=C,RR);
                   15954:                                                        }
                   15955:                                        }
                   15956:                                }
                   15957:                        }
                   15958:                        return qsort(RR);
                   15959:                }
                   15960:                R=pari(roots,subst(L,V,x));
                   15961:                if(R==0){
                   15962:                        R=[0];
                   15963:                        if(CF==1){
                   15964:                                for(R=[0],I=mydeg(L,V);I>1; I--)
                   15965:                                        R=cons(0,R);
                   15966:                        }
                   15967:                        return R;
                   15968:                }
                   15969:                if(CF==1){              /* Complex */
                   15970:                        if(Lim==[]&&Lim2==[]) return vtol(R);
                   15971:                        for(L=[],I=length(R)-1;I>=0;I--){
                   15972:                                C=R[I];
                   15973:                                if(Lim!=[]&&(real(C)<Lim[0]||real(C)>Lim[1])) continue;
                   15974:                                if(Lim2!=[]&&(imag(C)<Lim2[0]||imag(C)>Lim2[1])) continue;
                   15975:                                L=cons(C,L);
                   15976:                        }
                   15977:                        return L;
                   15978:                }
                   15979:                for(L=[],F=x,I=length(R)-1;I>=0;I--){   /* Real */
                   15980:                        if(ntype(R[I])<4 && F!=R[I]){
                   15981:                                if(Lim!=[] && (R[I]<Lim[0]||R[I]>Lim[1])) continue;
                   15982:                                L=cons(F=R[I],L);
                   15983:                        }
                   15984:                }
                   15985:                return qsort(L);
                   15986:        }
                   15987:        if(SS==0&&INIT==1){
                   15988:                SS=polroots(L,V|option_list=OL);
                   15989:                if(SS!=0) return SS;
1.18      takayama 15990:                for(C=0;SS==0&&C<5;C++){
1.6       takayama 15991:                        I=(C==0)?1:(iand(random(),0xff)-0x80);
                   15992:                        for(LL=[],K=length(L)-1;K>=0;K--){
                   15993:                                for(Q=0,J=length(L)-1;J>=0;J--)
                   15994:                                        Q+=L[J]*(I+K)^J;
                   15995:                                LL=cons(Q,LL);
                   15996:                        }
                   15997:                        SS=polroots(LL,V|option_list=OL);
                   15998:                        if(SS!=0) return SS;
                   15999:                }
                   16000:                return SS;
                   16001:        }
                   16002:        C=2^(-32);
                   16003:        if(type(getopt(err))==1) C=err;
                   16004:        if((N=length(V))!=length(L)) return [];
                   16005:        if(N==1) return polroots(L[0],V[0]|option_list=OL);
                   16006:        for(L1=[],I=1;I<N;I++){
                   16007:                Res=res(V[0],L[I-1],L[I]);
                   16008:                if(type(Res)<2) return Res;
                   16009:                L1=cons(res(V[0],L[I-1],L[I]),L1);
                   16010:        }
                   16011:        R=polroots(L1,V1=cdr(V)|option_list=OL);
                   16012:        if(type(R)<2) return R;
                   16013:        for(SS=[];R!=[];R=cdr(R)){
                   16014:                RS=(N==2)?[car(R)]:car(R);
                   16015:                for(I=0,L0=L[0];I<N-1;I++) L0=mysubst(L0,[V1[I],RS[I]]);
1.17      takayama 16016:                if(L0==0) return 0;
1.6       takayama 16017:                S0=polroots(L0,V[0]|option_list=OL);
                   16018:                if(type(S0)<2) return S0;
                   16019:                for(S=S0;S!=[];S=cdr(S)){
                   16020:                        S0=cons(car(S),RS);
                   16021:                        for(LT=cdr(L);LT!=[];LT=cdr(LT)){
                   16022:                                for(I=0,TV=car(LT);I<N;I++) TV=mysubst(TV,[V[I],S0[I]]);
                   16023:                                if(abs(TV)>C) break;
                   16024:                        }
                   16025:                        if(LT==[]) SS=cons(S0,SS);
                   16026:                }
                   16027:        }
                   16028:        return reverse(SS);
                   16029: }
                   16030:
1.71      takayama 16031: def lsub(P)
                   16032: {
                   16033:        if((T=type(P[0]))==4){
                   16034:                Q=reverse(P[1]);P=reverse(P[0]);
                   16035:                for(R=[];P!=[];P=cdr(P),Q=cdr(Q)) R=cons(car(Q)-car(P),R);
                   16036:                return R;
                   16037:        }else if(T==5){
                   16038:                L=length(P[0]);Q=P[1];P=P[0];
                   16039:                R=newvect(L);
                   16040:                for(V=[],L--;L>=0;L--) R[L]=Q[L]-P[L];
                   16041:                return R;
                   16042:        }
                   16043:        return P;
                   16044: }
                   16045:
                   16046: def dext(P,Q)
                   16047: {
                   16048:        P=lsub(P);Q=lsub(Q);
                   16049:        return P[0]*Q[1]-P[1]*Q[0];
                   16050: }
                   16051:
1.83    ! takayama 16052: def ptinversion(P)
        !          16053: {
        !          16054:        if(type(P)==4&&type(P[1])==4){
        !          16055:                for(R=[];P!=[];P=cdr(P))
        !          16056:                        R=cons(ptinversion(car(P)|option_list=getopt()),R);
        !          16057:                return reverse(R);
        !          16058:        }
        !          16059:        if(type(V=getopt(org))!=0) V=[0,0];
        !          16060:        if(P==[0,0]) return 0;
        !          16061:        if(type(P[0])==4){
        !          16062:                R=P[1];P=P[0];
        !          16063:        }
        !          16064:        X=P[0]-V[0];Y=P[1]-V[1];N=X^2+Y^2;
        !          16065:        if(getopt(bar)==1) S=1;
        !          16066:        else S=-1;
        !          16067:        if(!R){
        !          16068:                if(!N) return 0;
        !          16069:                return [X/N+V[0],S*Y/N+V[1]];
        !          16070:        }
        !          16071:        N-=R^2;
        !          16072:        if(!N){
        !          16073:                if(X+R!=0) X0=X+R;
        !          16074:                else X0=X-R;
        !          16075:                S=[];
        !          16076:                S=cons(ptinversion([X0,Y]|option_list=getopt()),S);
        !          16077:                if(Y+R!=0) Y0=Y+R;
        !          16078:                else Y0=Y-R;
        !          16079:                return cons(ptinversion([X,Y0]|option_list=getopt()),S);
        !          16080:        }
        !          16081:        return [[X/N+V[0],S*Y/N+V[1]],R/N];
        !          16082: }
        !          16083:
1.6       takayama 16084: def ptcommon(X,Y)
                   16085: {
                   16086:        if(length(X)!=2 || length(Y)!=2) return 0;
                   16087:        if(type(X[1])==4){ /* X is a line */
                   16088:                if((In=getopt(in))==-1||In==-2||In==-3){
                   16089:                        X0=(X[0][0]+X[1][0])/2;X1=(X[0][1]+X[1][1])/2;
                   16090:                        X=[[X0,X1],[X0+X[1][1]-X[0][1],X1-X[1][0]+X[0][0]]];
                   16091:                        if(In==-1&&type(Y[1])==4) return ptcommon(Y,X|in=-2);
                   16092:                        /* for the second line */
                   16093:                        if(In==-3) In=1;
                   16094:                        else In=0;
                   16095:                }else if(In==2||In==3){
                   16096:                        X=(X[1][0]-X[0][0])+(X[1][1]-X[0][1])*@i;
                   16097:                        if(X==0) return 0;
                   16098:                        Y=(Y[1][0]-Y[0][0])+(Y[1][1]-Y[0][1])*@i;
                   16099:                        X=myarg(Y/X);
                   16100:                        return (In==2)?X:(X*180/deval(@pi));
                   16101:                }else if(In!=1) In=0;
                   16102:                if(type(Y[0])<=3){
                   16103:                        if(In==1){
                   16104:                                return [(Y[1]*X[0][0]+Y[0]*X[1][0])/(Y[0]+Y[1]),
                   16105:                                (Y[1]*X[0][1]+Y[0]*X[1][1])/(Y[0]+Y[1])];
                   16106:                        }
                   16107:                        XX=X[1][0]-X[0][0];YY=X[1][1]-X[0][1];
                   16108:                        Arg=(length(Y)<2)?0:Y[1];
                   16109:                        Arg=deval(Arg);
                   16110:                        if(Arg!=0){
                   16111:                                S=dcos(Arg)*XX-dsin(Arg)*YY;
                   16112:                                YY=dsin(Arg)*XX+dcos(Arg)*YY;
                   16113:                                XX=S;
                   16114:                        }
                   16115:                        S=dnorm([XX,YY]);
                   16116:                        if(S!=0){
                   16117:                                XX*=Y[0]/S;YY*=Y[0]/S;
                   16118:                        }
                   16119:                        return [X[1][0]+XX,X[1][1]+YY];
                   16120:                }
                   16121:                S=[X[0][0]+(X[1][0]-X[0][0])*x_,X[0][1]+(X[1][1]-X[0][1])*x_];
                   16122:                if(type(Y[1])==4){ /* Y is a line */
                   16123:                        T=[Y[0][0]+(Y[1][0]-Y[0][0])*y_-S[0],
                   16124:                                Y[0][1]+(Y[1][1]-Y[0][1])*y_-S[1]];
                   16125:                        R=lsol(T,[x_,y_]);
1.71      takayama 16126:                        if(type(R[0])==4&&type(R[1])==4&&R[0][0]==x_&&R[1][0]==y_){
                   16127:                                        /* unique sol of parameters */
                   16128:                                if(In && (R[0][1]<0||R[0][1]>1||R[1][1]<0||R[1][1]>1) ) return 0;
                   16129:                                return subst(S,x_,R[0][1],y_,R[1][1]);
1.6       takayama 16130:                        }
1.71      takayama 16131:                        if((type(R[0])>0&&type(R[0])<4)||(type(R[1])>0&&type(R[1])<4)) return 0;  /* no solution */
                   16132:                        F=0;
                   16133:                        if(X[0]==X[1]) F=1;
                   16134:                        else if(Y[0]==Y[1]) F=2;
                   16135:                        if(!In){
                   16136:                                if(!F) return 1;
                   16137:                                else if(F==1) return X[0];
                   16138:                                else if(F==2) return Y[0];
                   16139:                        }
                   16140:                        X0=X[0];X1=X[1];
                   16141:                        if(X0>X1){R=X0;X0=X1;X1=R;}
                   16142:                        Y0=Y[0];Y1=Y[1];
                   16143:                        if(Y0>Y1){R=Y0;Y0=Y1;Y1=R;}
                   16144:                        if(X0<Y0) X0=Y0;
                   16145:                        if(Y0>Y1) X1=Y1;
                   16146:                        if(X0>X1) return 0;
                   16147:                        if(X0<X1) return [X0,X1];
                   16148:                        return X0;
1.6       takayama 16149:                }else if(Y[1]==0){ /* orth */
                   16150:                        T=[Y[0][0]+(X[1][1]-X[0][1])*y_-S[0],
                   16151:                                Y[0][1]-(X[1][0]-X[0][0])*y_-S[1]];
                   16152:                        R=lsol(T,[x_,y_]);
                   16153:                        if(type(R[0])==4&&type(R[1])==4&&R[0][0]==x_&&R[1][0]==y_){
                   16154:                                if(!In||(R[0][1]>=0&&R[0][1]<=1))
                   16155:                                        return subst(S,x_,R[0][1],y_,R[1][1]);
                   16156:                        }
                   16157:                        return (X[0]==X[1])?0:1;
                   16158:                }else if(type(Y[1])==1 && Y[1]>0){ /* circle */
                   16159:                        T=(S[0]-Y[0][0])^2+(S[1]-Y[0][1])^2-Y[1]^2;
                   16160:                        D=mycoef(T,1,x_)^2-4*mycoef(T,0,x_)*mycoef(T,2,x_);
                   16161:                        if(D==0){
                   16162:                                V=mycoef(T,1,x_)/(2*mycoef(T,2,x_));
                   16163:                                if(!in||(V>=0&&V<=1)) return [subst(S,x_,V)];
                   16164:                        }
                   16165:                        else if((type(D)==1&&D>0)){
                   16166:                                D=dsqrt(D);
                   16167:                                V=-(mycoef(T,1,x_)+D)/(2*mycoef(T,2,x_));
                   16168:                                if(!In||(V>=0&&V<=1)) L=[subst(S,x_,V)];
                   16169:                                else L=[];
                   16170:                                V=(D-mycoef(T,1,x_))/(2*mycoef(T,2,x_));
                   16171:                                if(!In||(V>=0&&V<=1)) L=cons(subst(S,x_,V),L);
                   16172:                                if(length(L)>0) return L;
                   16173:                        }
                   16174:                }
                   16175:                return 0;
                   16176:        }
                   16177:        if(type(Y[1])==4 || X[1]==0) return ptcommon(Y,X);
                   16178:        /* X is a circle */
                   16179:        if(Y[1]==0){    /* tangent line */
                   16180:                if(Y[0][0]==X[0][0]+X[1] || Y[0][0]==X[0][0]-X[1]) L=[[Y[0][0],X[0][1]]];
                   16181:                else L=[];
                   16182:                P=(Y[0][0]+x_-X[0][0])^2+(Y[0][1]+x_*y_-X[0][1])^2-X[1]^2;
                   16183:                Q=mycoef(P,1,x_)^2-4*mycoef(P,2,x_)*mycoef(P,0,x_);
                   16184:                for(R=polroots(Q,y_);R!=[];R=cdr(R)){
                   16185:                        X0=-subst(mycoef(P,1,x_)/(2*mycoef(P,2,x_)),y_,car(R));
                   16186:                        L=cons([Y[0][0]+X0,Y[0][1]+car(R)*X0],L);
                   16187:                }
                   16188:        }else{ /* Y is a circle */
                   16189:                P=(x_-X[0][0])^2+(y_-X[0][1])^2-X[1]^2;
                   16190:                Q=(x_-Y[0][0])^2+(y_-Y[0][1])^2-Y[1]^2;
                   16191:                V=(X[0][0]!=Y[0][0])?[x_,y_]:[y_,x_];
                   16192:                R=subst(P,V[0],T=lsol(P-Q,V[0]));
                   16193:                if(type(T[0])<4) return (T[0]==0)?1:0;
                   16194:                S=polroots(R,V[1]);
                   16195:                for(L=[];S!=[];S=cdr(S)){
                   16196:                        R=subst(T,V[1],car(S));
                   16197:                        if(V[0]==x_) L=cons([R,car(S)],L);
                   16198:                        else L=cons([S,R],L);
                   16199:                }
                   16200:        }
                   16201:        if(length(L)!=0) return L;
                   16202:        return 0;
                   16203: }
                   16204:
1.71      takayama 16205:
                   16206: def ptcontain(P,L)
                   16207: {
                   16208:        if(type(car(P))==4){
                   16209:                if((C=getopt(common))!=1) C=0;
                   16210:                if((F0=ptcontain(P[0])&&!C)) return F0;
                   16211:                if((F1=ptcontain(P[1])&&!C)) return F1;
                   16212:                if(F0&&F1) return P;    /* include */
                   16213:                L=cons(L[2],L);         /* outside part exists */
                   16214:                for(I=1,R=[];I<4;I++,L=cdr(L)){
                   16215:                        if(!(F[I]=ptcotain(P,[L[0],L[1]]))){
                   16216:                                if(C) continue;
                   16217:                                return -1;
                   16218:                        }
                   16219:                        if(type(F[I])==4&&length(F[I])==2)      /* infinite points */
                   16220:                                return F[I];
                   16221:                        else R=cons(F[I],R);
                   16222:                }
                   16223:                if(R==[]) return 0;             /* no intersection */
                   16224:                if(F1==1) return [P[0],car(R)];
                   16225:                if(F2==1) return [P[1],car(R)];
                   16226:                if(length(R)>1 && R[0]==R[1]) R=cdr(R);
                   16227:                return R;
                   16228:        }
                   16229:        if(dext([L[0],L[1]],[L[0],L[2]])<0) L=[L[0],L[2],L[1]];
                   16230:        L=cons(L[2],L);
                   16231:        for(I=F=1;I<4;I++,L=cdr(L)){
                   16232:                if((V=dext([L[0],L[1]],[L[0],P])) < 0) return 0;
                   16233:                if(!V) F++;
                   16234:        }
                   16235:        return F;
                   16236: }
                   16237:
1.6       takayama 16238: def tobezier(L)
                   16239: {
                   16240:        if((Div=getopt(div))==1||Div==2){
                   16241:                if(length(L)!=4) return [tobezier(L|inv=[0,1/2]),tobezier(L|inv=[1/2,1])];
                   16242:                if(type(L)==4) L=ltov(L);
                   16243:                if(type(L[0])==4)
                   16244:                        L=[ltov(L[0]),ltov(L[1]),ltov(L[2]),ltov(L[3])];
                   16245:                S=[(L[0]+3*L[1]+3*L[2]+L[3])/8];
                   16246:                T=[L[3]];
                   16247:                S=cons((L[0]+2*L[1]+L[2])/4,S);
                   16248:                T=cons((L[2]+L[3])/2,T);
                   16249:                S=cons((L[0]+L[1])/2,S);
                   16250:                T=cons((L[1]+2*L[2]+L[3])/4,T);
                   16251:                S=cons(L[0],S);
                   16252:                T=cons((L[0]+3*L[1]+3*L[2]+L[3])/8,T);
                   16253:                return [S,T];
                   16254:        }
                   16255:        if(Div>2&&Div<257){
                   16256:                L=tobezier(L);
                   16257:                for(R=[],I=Div-1;I>=0;I--)
                   16258:                        R=cons(tobezier(L|inv=[I/Div,(I+1)/Div]),R);
                   16259:                return R;
                   16260:        }
                   16261:        if((V=getopt(inv))==1 || type(V)>3){
                   16262:                if(type(L[0])>3 && type(V)>3) L=tobezier(L);
                   16263:                if(type(V)>3 && length(V)>2) V2=V[2];
                   16264:                if(type(V2)!=2) V2=t;
                   16265:                if(type(V)>3) L=subst(L,V2,(V[1]-V[0])*V2+V[0]);
                   16266:                N=mydeg(L,V2);
                   16267:                for(R=[],I=0;I<=N;I++){
                   16268:                        RT=mycoef(L,I,V2);
                   16269:                        R=cons(RT/binom(N,I),R);
                   16270:                        L-=RT*V2^I*(1-V2)^(N-I);
                   16271:                }
                   16272:                return reverse(R);
                   16273:        };
                   16274:        N=length(L)-1;
                   16275:        V=newvect(2);
                   16276:        for(I=0;I<=N;I++,L=cdr(L)){
                   16277:                if(type(X=car(L))==4) X=ltov(X);
                   16278:                V+=X*binom(N,I)*t^I*(1-t)^(N-I);
                   16279:        }
                   16280:        return V;
                   16281: }
                   16282:
                   16283: def cutf(F,X,VV)
                   16284: {
                   16285:        if(type(car(V=VV))==2){
                   16286:                Y=[car(V),X];
                   16287:                V=cdr(V);
                   16288:        }else Y=X;
                   16289:        if(type(X)>1){
                   16290:                Y=(type(Y)==4)?Y[0]:x;
                   16291:                V1=makenewv(F);
                   16292:                if(X==Y||Y==x){
                   16293:                        V2=makenewv([F,V1]);
                   16294:                        F=mysubst(F,[Y,V2]);
                   16295:                        V=cons(V2,V);
                   16296:                }
                   16297:                return [V1,[V1,os_md.cutf,[F],X,[V]]];
                   16298:        }
                   16299:        if(car(V)!=[] && X<car(V)[0]) return myfeval(car(V)[1],Y);
                   16300:        for(V=cdr(V); ;V=R){
                   16301:                if((R=cdr(V))==[]){
                   16302:                        if(car(V)!=[] && car(V)[0]<X) return myfeval(car(V)[1],Y);
                   16303:                        return myfeval(F,Y);
                   16304:                }
1.20      takayama 16305:                if(car(V)==[]||X>car(V)[0]) continue;
1.6       takayama 16306:                if(X==car(V)[0]) return car(V)[1];
                   16307:                return myfeval(F,Y);
                   16308:        }
                   16309: }
                   16310:
1.12      takayama 16311: def fsum(F,L)
1.6       takayama 16312: {
1.12      takayama 16313:        if(getopt(df)==1){
                   16314:                F=f2df(F);
                   16315:        }else Sub=getopt(subst);
1.6       takayama 16316:        if(type(L[0])==2){
                   16317:                X=L[0];
                   16318:                L=cdr(L);
                   16319:        }else X=0;
                   16320:        V=(length(L)>2)?L[2]:1;
                   16321:        for(R=0,I=L[0];;I+=V){
                   16322:                if(V==0||(I-L[1])*V>0) return R;
1.12      takayama 16323:                R+=(Sub==1)?subst(F,X?X:x,I):os_md.myfeval(F,X?[X,I]:I);
1.6       takayama 16324:        }
                   16325: }
                   16326:
                   16327: def periodicf(F,L,X)
                   16328: {
                   16329:        if(type(L)==4) L=[eval(L[0]),eval(L[1])];
                   16330:        else L=eval(L);
                   16331:        if(isvar(X)){
1.20      takayama 16332:                Y=makenewv([X,F]);
                   16333:                Z=makenewv([X,Y,F]);
1.16      takayama 16334:                return [Z,[Z,os_md.periodicf,[mysubst(F,[x,Y])],(type(L)==4)?[L]:L,[[Y,X]]]];
                   16335:        }
                   16336:        if(type(X)==4){
                   16337:                V=X[0];
                   16338:                X=X[1];
                   16339:        }else V=x;
                   16340:        if(type(F)==5){
                   16341:                X=eval(X);
                   16342:                return myfeval(F[floor(X/L)%length(F)],[V,X-floor(X/L)*L]);
1.6       takayama 16343:        }
                   16344:        if(type(L)==4){
                   16345:                X-=floor((X-L[0])/(L[1]-L[0]))*(L[1]-L[0]);
                   16346:                return myfeval(F,[V,X]);
                   16347:        }
                   16348: }
                   16349:
                   16350: def cmpf(X)
                   16351: {
                   16352:        if(type(X)>3){
                   16353:                if(type(L)==7) return [S_Fc,Dx,S_Ic,S_Ec,S_EC,S_Lc];
                   16354:                S_Lc=0;
                   16355:                if(type(S_Fc=X[0])!=4) S_Fc=f2df(S_Fc);
                   16356:                S_Ic=X[1];
                   16357:                if(length(S_Ic)>2){
                   16358:                        S_Fc=mysubst(S_Fc,[S_Ic[0],x]);
                   16359:                        S_Ic=cdr(S_Ic);
                   16360:                }
                   16361:                S_Dc=(type(S_Ic[0])==7)?1:0;
                   16362:                if(type(S_Ic[1])==7) S_Dc=ior(S_Dc,2);
                   16363:                if(type(S_Ec=getopt(exp))!=1) S_Ec=0;
                   16364:                if(S_Ec<=0){
                   16365:                        S_EC=-S_Ec;
                   16366:                        if(S_EC==0) S_EC=1;
                   16367:                        if(S_Dc==3) S_EC*=2;
                   16368:                        else S_EC/=4;
                   16369:                        if(type(F=X[0])==3&&vars(F)==[x]&&(D=deg(nm(F),x))==deg(dn(F),x)-2){
                   16370:                                S_Lc=S_EC*coef(nm(F),D,x)/coef(dn(F),D+2,x);
                   16371:                        }
                   16372:                }else{
                   16373:                        S_EC=S_Ec;
                   16374:                        if(S_Dc==3) S_EC*=12;
                   16375:                        else S_EC/=6;
                   16376:                }
                   16377:                if(type(S_Fc)==3) S_Fc=red(S_Fc);
                   16378:                S_EC=1/S_EC;
                   16379:                return [z_,[z_,os_md.cmpf,x]];
                   16380:        }
                   16381:        if(X<=0 && iand(S_Dc,1)) return S_Lc;
                   16382:        if(X>=1 && iand(S_Dc,2)) return S_Lc;
                   16383:        if(S_Dc==3){
                   16384:                if(S_Ec>0){
                   16385:                        Y0=dexp(1/X)*S_EC;
                   16386:                        Y1=dexp(1/(1-X))*S_EC;
                   16387:                        return myfeval(S_Fc,Y1-Y0)*(Y0/X^2+Y1/(1-X)^2);
                   16388:                }
                   16389:                return myfeval(S_Fc,S_EC/(1-X)-S_EC/X)*(S_EC/(1-X)^2+S_EC/X^2);
                   16390:        }
                   16391:        if(S_Dc==1){
                   16392:                if(S_Ec>0){
                   16393:                        Y=dexp(1-1/X);
                   16394:                        R=myfeval(S_Fc,S_EC*(Y-1)+I[1])*Y;
                   16395:                }
                   16396:                else R=myfeval(S_Fc,I[1]+(1-1/X)*S_EC);
                   16397:                return R*S_EC/X^2;
                   16398:        }
                   16399:        if(S_Dc==2){
                   16400:                if(S_Ec>0){
                   16401:                        Y=dexp(X/(1-X));
                   16402:                        R=myfeval(S_Fc,S_EC*(Y-1)+S_Ic[0])*Y;
                   16403:                }else R=myfeval(S_Fc,S_EC*X/(1-X)+S_Ic[0]);
                   16404:                return R*S_EC/(1-X)^2;
                   16405:        }
                   16406:        X=S_Ic[0]+(S_Ic[1]-S_Ic[0])*X;
                   16407:        return myfeval(S_Fc,X)/(S_Ic[1]-Ic[0]);
                   16408: }
                   16409:
                   16410: def fresidue(P,Q)
                   16411: {
                   16412:        if(iscoef(Q,os_md.israt)) S=fctr(Q);
                   16413:        else S=[[Q,1]];
                   16414:        for(R=[];S!=[];S=cdr(S)){
                   16415:                T=car(S);
                   16416:                if((D=mydeg(T[0],z))==0) continue;
                   16417:                L=[];
                   16418:                if(iscoef(T[0],os_md.iscrat)) L=getroot(T[0],z|cpx=2);
                   16419:                if(findin(z,vars(L))>=0) L=[];
                   16420:                if(L==[]) L=polroots(T[0],z|comp=-1);
                   16421:                for(;L!=[];L=cdr(L)){
                   16422:                        QQ=Q;
                   16423:                        for(I=T[1]; I>1;I--) QQ=mydiff(QQ,z);
                   16424:                        for(U=0,W=I=T[1];I>0;I--,W++){
                   16425:                                QQ=diff(QQ,z);
                   16426:                                U+=subst(QQ,z,L[0])*(z-L[0])^(W-T[1])/fac(W);
                   16427:                        }
                   16428:                        UD=mydiff(U,z);
                   16429:                        for(I=T[1],K=1,PP=P; I>1;I--,K++)
                   16430:                                PP=diff(PP,z)*U-K*PP*UD;
                   16431:                        QQ=subst(PP,z,L[0])/subst(U,z,L[0])^K;
                   16432: /*                     if(D==2) QQ=sqrt2rat(QQ); */
                   16433:                        R=cons([L[0],sqrt2rat(QQ)],R);
                   16434:                }
                   16435:        }
                   16436:        if(type(L=getopt(cond))==4){
                   16437:                for(S=[];R!=[];R=cdr(R)){
                   16438:                        Z=car(R);
                   16439:                        for(LL=L;LL!=[];LL=cdr(LL)){
                   16440:                                X=real(car(Z));Y=imag(car(Z));
                   16441:                                if(myf3eval(car(LL),X,Y,car(Z))<=0) break;
                   16442:                        }
                   16443:                        if(LL==[]) S=cons(Z,S);
                   16444:                }
                   16445:                R=reverse(S);
                   16446:        }
                   16447:        if((Sum=getopt(sum))==1||Sum==2){
                   16448:                for(S=0;R!=[];R=cdr(R)) S+=car(R)[1];
                   16449:                if(Sum==2) S*=2*@pi*@i;
                   16450:                return sqrt2rat(S);
                   16451:        }
                   16452:        return R;
                   16453: }
                   16454:
                   16455: def fint(F,D,V)
                   16456: {
                   16457:        if(((L=length(V))==2 || (L==3&&isvar(V[0])<3))
                   16458:          && (type(V[L-1])==7||(type(V[L-1])<3&&type(eval(V[L-1]))<2)))
                   16459:   /* real integral */
                   16460:                return areabezier([F,D,V]|option_list=getopt());
                   16461:   /* complex integral */
                   16462:        if(L>1&&type(V[1])==4&&type(V[1][1])<4){
                   16463:                if(type(V[0])==4&&type(V[0][0])<2){
                   16464:                        for(R=[],VT=car(V),VV=cdr(V);VV!=[];VV=cdr(VV),VT=VU){
                   16465:                                if((VU=car(VV))==-1) VU=car(V);
                   16466:                                R=cons([ptcommon([VT,VU],[t,1-t]|in=1),[0,1]],R);
                   16467:                        }
                   16468:                        V=reverse(R);
                   16469:                }
                   16470:                else if(L==2) V=[V];
                   16471:        }
                   16472:        Opt=cons(["cpx",1],getopt());
                   16473:        for(R=0;V!=[];V=cdr(V)){
                   16474:                VT=car(V);
                   16475:                X=car(VT)[0];XD=red(diff(X,t));
                   16476:                Y=car(VT)[1];YD=red(diff(Y,t));
                   16477:                F=mysubst(F,[[x,X],[y,Y],[z,X+@i*Y]]);
                   16478:                if(type(F)==4)
                   16479:                        FF=cons(F[0]*(XD+@i*YD),cdr(F));
                   16480:                else FF=red(F*(XD+@i*YD));
                   16481:                R+=areabezier([FF,D,cons(t,VT[1])]|option_list=Opt);
                   16482:        }
                   16483:        return R;
                   16484: }
                   16485:
                   16486: def areabezier(V)
                   16487: {
                   16488:        if(getopt(cpx)==1){
                   16489:                Opt=delopt(getopt(),"cpx");
                   16490:                F=V[0];
                   16491:                if(!isvar(Var=V[2][0])) Var=x;
                   16492:                if(type(F)==3 && vars(F)==[Var] && imag(dn(F))!=0){
                   16493:                        F=(nm(F)*conj(dn(F)))/(dn(F)*conj(dn(F)));
                   16494:                        V0=red(real(nm(F))/dn(F));
                   16495:                        R=areabezier([V0,V[1],V[2]]|option_list=Opt);
                   16496:                        V0=red(imag(nm(F))/dn(F));
                   16497:                        return R+@i*areabezier([V0,V[1],V[2]]|option_list=Opt);
                   16498:                }
                   16499:                if(getopt(Acc)!=1) F=f2df(F);
                   16500:                V0=compdf([o,[o,real,o_]],o_,F);
                   16501:                R=areabezier([V0,V[1],V[2]]|option_list=Opt);
                   16502:                V0=compdf([o,[o,imag,o_]],o_,F);
                   16503:                return R+@i*areabezier([V0,V[1],V[2]]|option_list=Opt);
                   16504:        }
                   16505:        if(type(V[0])!=4 || vars(V[0][0])!=0){
                   16506:                Mx=[-2.0^(512),2.0^(512)];
                   16507:                I=length(V[2]);
                   16508:                if(type(V[2][I-1])==7||type(V[2][I-2])==7){     /* infinite interval */
                   16509:                        if(type(Ec=getopt(exp))==1) R=cmpf([V[0],V[2]]|exp=Ec);
                   16510:                        else R=cmpf([V[0],V[2]]);
                   16511:                        V=[R,V[1],[0,1]];
                   16512:                }
                   16513:                if(type((Int=getopt(int)))==1 && type(V[0])<4 && (V1=V[1])>=0){
                   16514:                        if(Int==2&&iand(V1,1)) V1++;
                   16515:                        if(!V1) V1=32;
                   16516:                        Opt=cons(["raw",1],getopt());
                   16517:                        W=xygraph(V[0],V[1],V[2],Mx,Mx|option_list=Opt);
                   16518:                        SS=W[0][1];
                   16519:                        for(S0=S1=0,I=0,L=W;L!=[] && I<=V1;I++, L=cdr(L)){
                   16520:                                if(iand(I,1)) S1+=car(L)[1];
                   16521:                                else S0+=car(L)[1];
                   16522:                                if (I==V1) SS+=car(L)[1];
                   16523:                        }
                   16524:                        VV=deval(V[2][1]-V[2][0]);
                   16525:                        if(Int==2)
                   16526:                                return (2*S0+4*S1-SS)*VV/(3*V1);
                   16527:                        else
                   16528:                                return (2*S0+2*S1-SS)*VV/(2*V1);
                   16529:                }
                   16530:                Opt=cons(["opt",0],getopt());
                   16531:                V=xygraph(V[0],V[1],V[2],Mx,Mx|option_list=Opt);
                   16532:        }
                   16533:        if(type(V[0][0])!=4) V=os_md.lbezier(V);
                   16534:        for(S=0; V!=[]; V=cdr(V)){
                   16535:                B=tobezier(car(V));
                   16536:                P=intpoly(B[1]*diff(B[0],t),t);
                   16537:                S+=mysubst(P,[t,1]);
                   16538:        }
                   16539:        return S;
                   16540: }
                   16541:
                   16542: def velbezier(V,L)
                   16543: {
                   16544:        if(L==0) L=[t,0,1];
                   16545:        else L=[(length(L)==3)?L[2]:t,L[0],L[1]];
                   16546:        for(R=[],II=length(V)-1;II>=0;II--){
                   16547:                S=fmmx(diff(V[II],L[0]|dif=1),L|dif=1);
                   16548:                for(U=0;S!=[];S=cdr(S)) if((T=abs(car(S)[1]))>U) U=T;
                   16549:                R=cons(U,R);
                   16550:        }
                   16551:        return R;
                   16552: }
                   16553:
                   16554: def ptbezier(V,L)
                   16555: {
                   16556:        if(type(V[0])==4&&type(V[0][0])!=4)  V=lbezier(V);
                   16557:        K=length(V);
                   16558:        if(type(L)<2){
                   16559:                if(L<0) return K;
                   16560:                if(L>=K-1) L=[K-1,1];
                   16561:                else{
                   16562:                        L0=floor(L);
                   16563:                        if(L0>=K-1) L0=K-1;
                   16564:                        L=[L0,L-L0];
                   16565:                }
                   16566:        }
                   16567:        if(L[0]>=0) B=V[L[0]];
                   16568:        else B=V[K+L[0]];
                   16569:        B=tobezier(B);
                   16570:        BB=[diff(B[0],t),diff(B[1],t)];
                   16571:        return [subst(B,t,L[1]),subst(BB,t,L[1])];
                   16572: }
                   16573:
1.70      takayama 16574: /*
                   16575: def isroot(P,Q,I)
                   16576: {
                   16577:        if(subst(P,X,X0=I[0])*subst(P,X,I[1])<=0) return 1;
                   16578:        XM=(I[1]+I[0])/2;W=XM-X0;
                   16579:        if(W<0) W=-W;
                   16580:        X=var(P);
                   16581:        if(!Q) Q=diff(P,X);
                   16582:        Q=subst(Q,X,X+I2);D=deg(Q,X);
                   16583:        for(M=0,P=1,I=deg(Q,X);I<=D;I++){
                   16584:                V=coef(Q,I,X);
                   16585:                M+=(V<0?-V:V)*P;
                   16586:                P*=W;
                   16587:        }
                   16588:        V=subst(P,X,X0);
                   16589:        if(V<0) V=-V;
                   16590:        return (V-M<=0) 2:0;
                   16591: }
                   16592: */
                   16593:
                   16594: def sgnstrum(L,V)
                   16595: {
                   16596:        X=var(car(L));
                   16597:        if(X==0) X=var(L[1]);
                   16598:        for(F=N=0;L!=[];L=cdr(L)){
                   16599:                P=car(L);
                   16600:                if(type(V)==7){
                   16601:                        C=coef(P,D=deg(P,X),X);
                   16602:                        if(V=="-"&&iand(D,1)) C=-C;
                   16603:                }else C=subst(P,X,V);
                   16604:                if(!C) continue;
                   16605:                if(C*F<0) N++;
                   16606:                F=C;
                   16607:        }
                   16608:        return N;
                   16609: }
                   16610:
                   16611: def polstrum(P)
                   16612: {
                   16613:        X=vars(P0=P);
                   16614:        if(!length(X)) return [];
                   16615:        X=car(X);
                   16616:        if(isfctr(P)){
                   16617:                D=gcd(P,Q=diff(P,X));
                   16618:                P=sdiv(P,D);
                   16619:                if(getopt(mul)==1&&type(getopt(num))<0)
                   16620:                        return append(polstrum(D|mul=1),[P]);
                   16621:        }
                   16622:        D=deg(P,X);
                   16623:        P=P/coef(P,deg(P,X),X);
                   16624:        Q=diff(P,X)/D;
                   16625:        for(L=[Q,P];D>0;){
                   16626:                R=urem(P,Q);
                   16627:                if((D=deg(R,X))<0) break;
                   16628:                C=coef(R,D,X);
                   16629:                if(C>0) C=-C;
                   16630:                R/=C;
                   16631:                L=cons(R,L);
                   16632:                P=Q;Q=R;
                   16633:        }
                   16634:        if(type(N=getopt(num))>0){
                   16635:                if(getopt(mul)!=1){
                   16636:                        if(type(N)==1) N=["-","+"];
                   16637:                        return sgnstrum(L,N[0])-sgnstrum(L,N[1]);
                   16638:                }
                   16639:                if(!isfctr(P0)) return -1;
                   16640:                R=polstrum(P0|mul=1);
                   16641:                for(C=0;R!=[];R=cdr(R)) C+=polstrum(car(R)|num=N);
                   16642:                return C;
                   16643:        }
                   16644:        return reverse(L);
                   16645: }
                   16646:
1.71      takayama 16647: def iceil(X)
                   16648: {
                   16649:        S=(X>0)?1:-1;
                   16650:        X*=S;
                   16651:        if(X>1) X=ceil(X);
                   16652:        else if(X>1/2) X=1;
                   16653:        else if(X) X=1/floor(1/X);
                   16654:        return S*X;
                   16655: }
                   16656:
1.70      takayama 16657: def polradiusroot(P)
                   16658: {
                   16659:        X=var(P);D=deg(P,X);
                   16660:        if(D<1) return -1;
                   16661:        C=coef(P,D,X);
                   16662:        P/=-C;
                   16663:        Int=getopt(int);
                   16664:        if(getopt(comp)==1){
                   16665:                for(ND=0,TD=0;TD<D;TD++) if(coef(P,TD,X)!=0) ND++;
                   16666:                for(V=0,TD=0;TD<D;TD++){
                   16667:                        TV=eval((abs(coef(P,TD,X))*ND)^(1/(D-TD)));
                   16668:                        if(V<TV) V=TV;
                   16669:                }
1.71      takayama 16670:                return (Int==1)? iceil(X):X;
1.70      takayama 16671:        }
                   16672:        for(N0=N1=0,TD=0;TD<D;TD++){
                   16673:                if(!(C=coef(P,TD,X))) continue;
                   16674:                if(C>0){
                   16675:                        N2++;
                   16676:                        if(!iand(D-TD,1)) N1++;
                   16677:                }else if(iand(D-TD,1)) N1++;
                   16678:        }
                   16679:        for(V1=V2=0,TD=0;TD<D;TD++){
                   16680:                if(!(C=C1=coef(P,TD,X))) continue;
                   16681:                if(C>0){
                   16682:                        TV=eval((C*N2)^(1/(D-TD)));
                   16683:                        if(V2<TV) V2=TV;
                   16684:                }
                   16685:                if(iand(D-TD,1)) C=-C;
                   16686:                if(C>0){
                   16687:                        TV=eval((C*N1)^(1/(D-TD)));
                   16688:                        if(V1<TV) V1=TV;
                   16689:                }
                   16690:        }
1.71      takayama 16691:        return Int?[-iceil(V1),iceil(V2)]:[-V1,V2];
1.70      takayama 16692: }
                   16693:
1.71      takayama 16694: /* step, num, strum */
1.70      takayama 16695: def polrealroots(P)
                   16696: {
                   16697:        if(type(MC=getopt(step))==4){
                   16698:                MC1=MC[1];MC=car(MC);
                   16699:        }else if(isint(MC)&&MC>1&&MC<10001) MC1=MC;
1.71      takayama 16700:        else MC1=MC=32;
                   16701:        if(type(I=getopt(in))!=4){
                   16702:                I=polradiusroot(P);
1.70      takayama 16703:                W=(I[1]-I[0])/1024;
                   16704:                I=[I[0]-W,I[1]+W];
                   16705:        }
                   16706:        if(type(L=type(getopt(strum)))!=4) L=polstrum(P);
                   16707:        N0=sgnstrum(L,I[0]);N1=sgnstrum(L,I[1]);
                   16708:        P=car(L);X=var(P);
1.71      takayama 16709:        if(N0<=N1) return []; /* [L,I,N0,N1]; */
1.70      takayama 16710:        LT=[[0,I[0],I[1],N0,N1]];R=[];
1.71      takayama 16711:        Z=eval(exp(0));
1.70      takayama 16712:        while(LT!=[]){
                   16713:                T=car(LT);LT=cdr(LT);
                   16714:                C=T[0];X0=T[1];X1=T[2];N0=T[3];N1=T[4];
                   16715:                if(N0<=N1)continue;
                   16716:                if(N0==N1+1){
1.71      takayama 16717:                        V0=subst(P,X,X0);
                   16718:                        V1=subst(P,X,X1);
1.70      takayama 16719:                        while(C++<MC1){
1.71      takayama 16720:                                V2=subst(P,X,X2=(X0+X1)/2*Z);
1.70      takayama 16721:                                if((V0>0&&V2>0)||(V0<0&&V2<0)) X0=X2;
                   16722:                                else X1=X2;
                   16723:                        }
                   16724:                        R=cons([X0,X1,1],R);
                   16725:                        continue;
                   16726:                }
                   16727:                while(++C<MC){
1.71      takayama 16728:                        N2=sgnstrum(L,X2=(X0+X1)/2*Z);
1.70      takayama 16729:                        if(N0>N2){
1.71      takayama 16730:                                if(N2>N1) LT=cons([C,X2,X1,N2,N1],LT);
1.70      takayama 16731:                                X1=X2;
                   16732:                                N1=N2;
                   16733:                                if(N0==N1+1){
                   16734:                                        LT=cons([C,X0,X1,N0,N1],LT);
1.71      takayama 16735:                                        C=MC+1;
1.70      takayama 16736:                                }
                   16737:                        }else{
                   16738:                                X0=X2;
                   16739:                                N0=N2;
                   16740:                        }
                   16741:                }
1.71      takayama 16742:                if(C!=MC+2) R=cons([X0,X1,N0-N1],R);
                   16743:        }
                   16744:        if(isint(Nt=getopt(nt)) && Nt>0){
                   16745:                if(Nt>256) Nt=256;
                   16746:                Q=diff(P,X);
                   16747:                for(S=[],TR=R;TR!=[];TR=cdr(TR)){
                   16748:                        if(car(TR)[2]>1) continue;
                   16749:                        V0=subst(P,X,car(TR)[0]);
                   16750:                        V1=subst(P,X,car(TR)[1]);
                   16751:                        if(abs(V0)<abs(V1))
                   16752:                                X0=car(TR)[0];
                   16753:                        else{
                   16754:                                X0=car(TR)[1];V0=V1;
                   16755:                        }
                   16756:                        for(Tn=Nt;Tn>0;Tn--){
                   16757:                                X1=X0-V0/subst(Q,X,X0);
                   16758:                                V1=subst(P,X,X1);
                   16759:                                if(abs(V1)>=abs(V0)) break;
                   16760:                                X0=X1;V0=V1;
                   16761:                        }
                   16762:                        S=cons(X0,S);
                   16763:                }
                   16764:                for(TR=R;TR!=[];TR=cdr(TR))
                   16765:                        if(car(TR)[2]>1) S=cons(car(TR),S);
                   16766:                return reverse(S);
1.70      takayama 16767:        }
                   16768:        return reverse(cons(P,R));
                   16769: }
                   16770:
                   16771: /*
                   16772: def ptcombezier0(P,Q)
                   16773: {
                   16774:        PB=subst(tobezier(P|div=1),t,s);
                   16775:        QB=tobezier(Q|Div=1);
                   16776:        Z=res(PB[0]-QB[0],PB[1]-QB[1],s);
                   16777:        D=pmaj(diff(Z,t)|val=t);
                   16778: }
                   16779: */
                   16780:
1.6       takayama 16781: def ptcombezier(P,Q,T)
                   16782: {
                   16783:        if(type(T)<2){
                   16784:                if(T<2) T=20;           /*  default */
                   16785:                return ptcombezier(P,Q,[0,0,1,T]);
                   16786:        }
                   16787:        V=T[2]/2;;
                   16788:        PB=tobezier(P|div=1);
                   16789:        PP=[ptbbox(PB[0]),ptbbox(PB[1])];
                   16790:        QB=tobezier(Q|div=1);
                   16791:        QQ=[ptbbox(QB[0]),ptbbox(QB[1])];
                   16792:        for(L=[],I=0;I<2;I++){
                   16793:                for(J=0;J<2;J++){
                   16794:                        if(!iscombox(PP[I],QQ[J])) continue;
                   16795:                        if(T[3]<=1) return
                   16796:                                [[T[0]+(I+0.5)*V,T[1]+(J+0.5)*V,
                   16797:                                        [(PP[I][0][0]+PP[I][0][1])/2,(PP[I][1][0]+PP[I][1][1])/2]]];
                   16798:                        else{
                   16799: #if 0
                   16800:                                U=PB[I][0];V=PB[I][length(PB[I])-1];
                   16801:                                if(abs(A=(U[0]-V[0]))>abs(B=(U[1]-V[I])))
                   16802:                                        M=mat([1,0],[-B/A,1]);
                   16803:                                else if(U!=V)
                   16804:                                        M=mat([1,-A/B],[0,1]);
                   16805:                                else continue;
                   16806:                                if(!iscombox(ptbox(ptaffine(M,PB[I])),ptbox(ptaffine(M,QB[J])))) continue;
                   16807: #endif
                   16808:
                   16809:                                LN=ptcombezier(PB[I],QB[J],[T[0]+I*V,T[1]+J*V,V,T[3]-1]);
                   16810: #if 0
                   16811:                                L=append(LN,L);
                   16812: #else
                   16813:                                if(LN!=[]){
                   16814:                                        if(L==[]) L=LN;
                   16815:                                        else for(VV=3*V/2^T[3];LN!=[];LN=cdr(LN)){
                   16816:                                                for(LT=L;LT!=[];LT=cdr(LT)){
                   16817:                                                        if(abs(car(LN)[0]-car(LT)[0])<VV&&abs(car(LN)[1]-car(LT)[1])<VV) break;
                   16818:                                                }
                   16819:                                        }
                   16820:                                }
                   16821:                                if(length(L)>32){               /* Too many points */
                   16822:                                        I=J=2;
                   16823:                                }
                   16824: #endif
                   16825:                        }
                   16826:                }
                   16827:        }
                   16828:        return L;
                   16829: }
                   16830:
                   16831:
                   16832: def ptcombz(P,Q,T)
                   16833: {
                   16834:        if(P==Q) Q=0;
                   16835:        if(type(P[0][0])!=4) P=P0=lbezier(P);
                   16836:        if(Q==0){
                   16837:                Q=P;F=1;
                   16838:        }
                   16839:        else if(type(Q[0][0])!=4) Q=lbezier(Q);
                   16840:        for(R=[],I=0,Q0=Q;P!=[];P=cdr(P),I++){
                   16841:                for(J=0,Q=Q0;Q!=[];Q=cdr(Q),J++){
                   16842:                        if(F==1&&I<J+2) break;
                   16843:                        if((RT=ptcombezier(car(P),car(Q),T))!=[]){
                   16844:                                RT=cons([I,J],RT);
                   16845:                                R=cons(RT,R);
                   16846:                        }
                   16847:                }
                   16848:        }
                   16849:        if((Red=getopt(red))==1||Red==2){
                   16850:                if(type(M=getopt(prec))!=1) M=12;
                   16851:                for(F=0,T=P0;T!=[];T=cdr(T)){
                   16852:                        for(S=car(T);S!=[];S=cdr(S)){
                   16853:                                if(type(ST=car(S))==4 && type(ST[0])<2){
                   16854:                                        if(F++==0){
                   16855:                                                X0=X1=ST[0];Y0=Y1=ST[1];
                   16856:                                        }else{
                   16857:                                                if(ST[0]<X0) X0=ST[0];
                   16858:                                                if(ST[0]>X1) X1=ST[0];
                   16859:                                                if(ST[1]<Y0) Y0=ST[1];
                   16860:                                                if(ST[1]>Y1) Y1=ST[1];
                   16861:                                        }
                   16862:                                }
                   16863:                        }
                   16864:                }
                   16865:                V0=(X1-X0)/2^M;V1=(Y1-Y2)/2^M;
                   16866:                for(RR=[],RT=R;RT!=[];RT=cdr(RT))
                   16867:                        for(S=cdr(car(RT));S!=[];S=cdr(S)) RR=cons(car(S)[2],RR);
                   16868:                RR=ltov(RR);L=length(RR);
                   16869:                for(I=0;I<L;I++)
                   16870:                        for(K=1,J=I+1;K!=0&&J<L;J++)
                   16871:                                if(abs(RR[I][0]-RR[J][0])<V0 && abs(RR[I][1]-RR[J][1])<V1) RR[I]=K=0;
                   16872:                R0=[];
                   16873:                I=L-1;
                   16874:                if(Red==2){
                   16875:                        for(;I>=0;I--) if(RR[I]!=0) R0=cons(RR[I],R0);
                   16876:                }else{
                   16877:                        for(RT=R;RT!=[];RT=cdr(RT)){
                   16878:                                R00=[car(RT)[0]];
                   16879:                                for(S=cdr(car(RT));S!=[];S=cdr(S),I--)
                   16880:                                        if(RR[L-I-1]!=0) R00=cons(car(S),R00);
                   16881:                                if(length(R00)>1) R0=cons(reverse(R00),R0);
                   16882:                        }
                   16883:                }
                   16884:                return R0;
                   16885:        }
                   16886:        return reverse(R);
                   16887: }
                   16888:
                   16889: def draw_bezier(ID,IDX,B)
                   16890: {
                   16891:        if(getopt(init)==1){
                   16892:                S_FDot=0;
                   16893:                return;
                   16894:        }
                   16895:        if(type(Col=getopt(col))!=1&&Col!=0) Col=0;
                   16896:        Dot=0;
                   16897:        if(type(Opt=getopt(opt))==7){
                   16898:                if(!Col){
                   16899:                        Col=drawopt(Opt,0);
                   16900:                        if(Col==-1) Col=0;
                   16901:                }
                   16902:                T=drawopt(Opt,3);
                   16903:                if(iand(T,2)){
                   16904:                        M=iand(T,1)?1/8:1/4;
                   16905:                        for(C=Col,Col=I=0;I<20;I+=8)
                   16906:                                Col+=ishift(0xff-(floor((0xff-iand(0xff,ishift(C,I)))*M)),-I);
                   16907:                }
                   16908:                if(iand(T,4)) Dot=2;            /* 2 or 3 or 4 or 6 */
                   16909:                else if(iand(T,8)) Dot=4;
                   16910:        }
                   16911:        if(type(B)==4 && (type(B[0])==4||type(B[0])==5) && type(B[0][0])<2) B=lbezier(B);
                   16912:        else if(type(B)==5) B=[vtol(B)];
                   16913:        for(;B!=[];B=cdr(B)){
                   16914:                if(vars(F=car(B))==[]){
                   16915: #if 1
                   16916:                        if(length(F)<3&&!Dot){          /* line or point */
                   16917:                                if(length(F)>0){
                   16918:                                        G=[rint(F[0][0]),rint(F[0][1])];
                   16919:                                        if(length(F)==1) draw_obj(ID,IDX,G,Col);
                   16920:                                        else{
                   16921:                                                G=[G[0],G[1],rint(F[1][0]),rint(F[1][1])];
                   16922:                                                draw_obj(ID,IDX,G,Col);
                   16923:                                        }
                   16924:                                }
                   16925:                                continue;
                   16926:                        }
                   16927: #endif
                   16928:                        if(length(F)<2) continue;
                   16929:                        F=tobezier(F);
                   16930:                }
                   16931:                N=velbezier(F,0);
                   16932:                N=(N[0]>N[1])?N[0]:N[1];
                   16933:                if(!N) N=1;
                   16934:                for(I=0;I<=N;I++,S_FDot++){
                   16935:                        if(Dot!=iand(S_FDot,Dot)) continue;
                   16936:                        G=subst(F,t,I/N);
                   16937:                        G=[rint(G[0]),rint(G[1])];
                   16938:                        if(G!=G0){
                   16939:                                draw_obj(ID,IDX,G,Col);
                   16940:                                G0=G;
                   16941:                        }
                   16942:                }
                   16943:        }
                   16944:        if(S_FDot-->=2^32) S_FDot=0;
                   16945:        return 0;
                   16946: }
                   16947:
1.29      takayama 16948:
                   16949: /*
                   16950: def redbezier(L)
                   16951: {
                   16952:        V=newvect(4);ST=0;
                   16953:        for(R=[],I=0,T=L;T=[];T=cdr(T){
                   16954:                if(type(car(T))<4){
                   16955:                        F=0;
                   16956:                        if(I==3)
                   16957:                        if(car(T)==0){
                   16958:                        }else if(car(T)==1){
                   16959:                        }else if(car(T)==-1){
                   16960:                                if(I<3) V[I++]=ST;
                   16961:                        }
                   16962:                }else if(I==3){
                   16963:                        if(R==[] || car(R)!=1){
                   16964:                                R=cons(V[0],R);
                   16965:                                if(ST==0) ST=V[0];
                   16966:                        }
                   16967:                        for(J=1;J<3;J++) R=cons(V[J],R);
                   16968:                        while((T=cdr(T))!=[]){
                   16969:                                R=cons(car(T),R);
                   16970:                                if(type(car(R))<4)
                   16971:                        }
                   16972:                }else{
                   16973:                        if(ST==0) ST=car(T);
                   16974:                        V[I++]= car(T);
                   16975:                }
                   16976:        }
                   16977: }
                   16978: */
                   16979:
1.6       takayama 16980: def lbezier(L)
                   16981: {
                   16982:        if((In=getopt(inv))==1||In==2||In==3){
                   16983:                for(F=0,R=[];L!=[];L=cdr(L)){
                   16984:                        LT=car(L);
                   16985:                        if(F==car(LT)) R=cons(1,R);
                   16986:                        else{
                   16987:                                if(R!=[]&&F!=0) R=cons(0,R);
                   16988:                                R=cons(G=car(LT),R);
1.72      takayama 16989:                                if(In==3) In=2;
1.6       takayama 16990:                        }
                   16991:                        for(LT=cdr(LT);LT!=[];LT=cdr(LT))
                   16992:                                R=cons(car(LT),R);
                   16993:                        if((F=car(R))==G&&In==1){
                   16994:                                R=cons(-1,cdr(R));
                   16995:                                F=0;
                   16996:                        }
                   16997:                }
                   16998:                if(In==3 && car(R)==G) R=cons(-1,cdr(R));
                   16999:                return reverse(R);
                   17000:        }
                   17001:        for(F=0,RT=R=[];L!=[];L=cdr(L)){
                   17002:                if(type(T=car(L))==4||type(T)==5){
                   17003:                        if(F==0){
                   17004:                                FT=T;F=1;
                   17005:                        }
                   17006:                        RT=cons(T,RT);
                   17007:                }else if(T==0){
1.72      takayama 17008:                        if(RT!=[]) R=cons(reverse(RT),R);
1.6       takayama 17009:                        RT=[];F=0;
                   17010:                }else if(T==1){
                   17011:                        if(RT!=[]){
                   17012:                                R=cons(reverse(RT),R);
                   17013:                                RT=[car(RT)];
                   17014:                        }else{
                   17015:                                RT=[];F=0;
                   17016:                        }
                   17017:                }else if(T==-1){
                   17018:                        RT=cons(FT,RT);
                   17019:                        R=cons(reverse(RT),R);
                   17020:                        RT=[];F=0;
                   17021:                }
                   17022:        }
                   17023:        if(RT!=[]) R=cons(reverse(RT),R);
                   17024:        return reverse(R);
                   17025: }
                   17026:
                   17027:
                   17028: def xybezier(L)
                   17029: {
1.72      takayama 17030:        if(type(L)==4&&type(car(L))==4&&type(car(L)[0])==4) L=lbezier(L|inv=1);
1.6       takayama 17031:        if(L==0 || (LS=length(L))==0) return "";
                   17032:        Out=str_tb(0,0);
                   17033:        if(type(VF=getopt(verb))==4){
                   17034:                if(type(car(VF))>3){
                   17035:                        VFS=VF;VF=1;
                   17036:                }else{
                   17037:                        VFS=cdr(VF);VF=car(VF);
                   17038:                }
                   17039:        }else VFS=["$\\bullet$","$\\times$"];
                   17040:        if(VF!=1 && VF!=2) VF=0;
                   17041:        if(!TikZ){
                   17042:                if(VF) Ob=str_tb(0,0);
                   17043:                T="\n**\\crv{";
                   17044:                if(type(Opt=getopt(opt))==7 && Opt!="") T=T+Opt;
                   17045:                L00=Q=L[I0=0];S=S1="";
                   17046:                for(F=0,I=1;I<=LS;I++){
                   17047:                        P=Q;Q=(I==LS)?0:L[I];
                   17048:                        if(type(Q)==4){
                   17049:                                if(F==0){
                   17050:                                        S1="";L0=P;F=1;
                   17051:                                        continue;
                   17052:                                }else if(F==1)
                   17053:                                        F=2;
                   17054:                                else if(F==2){
                   17055:                                        S1=S1+"&";
                   17056:                                }
                   17057:                                S1=S1+xypos(P);
                   17058:                                if(VF&&length(VFS)>1) str_tb(xyput([P[0],P[1],VFS[1]]),Ob);
                   17059:                        }else{
                   17060:                                if(Q==0){
                   17061:                                        if(F>0){
                   17062:                                                str_tb("{"+xypos(L0)+";"+xypos(P)+T+S1+"}};\n",Out);
                   17063:                                                if(VF){
                   17064:                                                        str_tb(xyput([L[0][0],L[0][1],VFS[0]]),Ob);
                   17065:                                                        if(VF==1) str_tb(xyput([P[0],P[1],VFS[0]]),Ob);
                   17066:                                                }
                   17067:                                                F=0;
                   17068:                                        }
                   17069:                                }else if(Q==1){
                   17070:                                        str_tb("{"+xypos(L0)+";"+xypos(P)+T+S1+"}};\n",Out);
                   17071:                                        if(VF){
                   17072:                                                str_tb(xyput([L[0][0],L[0][1],VFS[0]]),Ob);
                   17073:                                                if(VF==1) str_tb(xyput([P[0],P[1],VFS[0]]),Ob);
                   17074:                                        }
                   17075:                                        F=1;
                   17076:                                }else if(Q==-1){
                   17077:                                        if(F==2)
                   17078:                                                S1=S1+"&";
                   17079:                                        str_tb("{"+xypos(L0)+";"+xypos(L00)+T+S1+xypos(P)+"}};\n",Out);
                   17080:                                        if(VF)  str_tb(xyput([L[0][0],L[0][1],VFS[0]]),Ob);
                   17081:                                        F=0;
                   17082:                                }
                   17083:                                if(F==1){
                   17084:                                        if(I<LS-1 && type(L[I+1])<2){
                   17085:                                                if(L[I+1]==-1){
                   17086:                                                        str_tb("{"+xypos(P)+";"+xypos(L00)+T+"}};\n",Out);
                   17087:                                                }
                   17088:                                                if(VF)  str_tb(xyput([P[0][0],P[0][1],VFS[0]]),Ob);
                   17089:                                                F=0;
                   17090:                                        }
                   17091:                                }
                   17092:                                while(++I<LS && type(L[I])<2);
                   17093:                                if(I>=LS) break;
                   17094:                                if(F==1){
                   17095:                                        Q=P;I--;F=0;
                   17096:                                }else L00=Q=L[I];
                   17097:                        }
                   17098:                }
                   17099:        }else{
                   17100:                if(type(T=getopt(cmd))==7){
                   17101:                        if(T!="") T="\\"+T;
                   17102:                }else T="\\draw";
                   17103:                if((Rel=getopt(relative))==1)   VF=0;
                   17104:                if(VF) Ob=str_tb(0,0);
                   17105:                if(type(Opt=getopt(opt))==7 && Opt!="") T=T+"["+Opt+"]";
                   17106:                Out=str_tb(T,0);
                   17107:                Q=L[0];
                   17108:                for(F=M=0,I=1;I<=LS;I++){
                   17109:                        P=Q; Q=(I==LS)?0:L[I];
                   17110:                        if(++M>XYLim){
                   17111:                                str_tb("\n",Out);M=1;
                   17112:                        }
                   17113:                        if(type(Q)==4 || type(Q)==5 || type(Q)==7){
                   17114:                                if(F==0){
                   17115:                                        str_tb(" ",Out);
                   17116:                                        F=1;
                   17117:                                }else if(F==1){
                   17118:                                        str_tb(" .. controls ",Out);
                   17119:                                        F=2;
                   17120:                                }else if(F==2){
                   17121:                                        str_tb(" and ",Out);
                   17122:                                        F=2;
                   17123:                                }
                   17124:                                PP=xypos(P);
                   17125:                                if(Rel==1 && F==2) PP="+"+PP;
                   17126:                                str_tb(PP,Out);
                   17127:                                if(VF&&((F<2)||length(VFS)>1))
                   17128:                                        str_tb(xyput([P[0],P[1],(F<2)?VFS[0]:VFS[1]]),Ob);
                   17129:                        }else{
                   17130: /*                             if(I<LS-1) VF=0; */
                   17131:                                if(Q==0||Q==1){
                   17132:                                        PP=xypos(P);
                   17133:                                        if(Rel==1) PP="+"+PP;
                   17134:                                        str_tb(((F==0)?" ":((F==1)?" -- ":" .. "))+PP,Out);
                   17135:                                        if(VF) str_tb(xyput([P[0],P[1],VFS[0]]),Ob);
                   17136:                                        F=Q;
                   17137:                                }else if(Q==-1){
                   17138:                                        PP=xypos(P);
                   17139:                                        if(Rel==1) PP="+"+PP;
                   17140:                                        if(F==1)
                   17141:                                                str_tb("..controls "+PP+" .. cycle",Out);
                   17142:                                        else if(F==2)
                   17143:                                                str_tb(" and "+PP+" .. cycle",Out);
                   17144:                                        if(VF&&length(VFS)>1) str_tb(xyput([P[0],P[1],VFS[1]]),Ob);
                   17145:                                        F=0;
                   17146:                                }
                   17147:                                if(F==1){
                   17148:                                        if(I<LS-1){
                   17149:                                                if(L[I+1]==-1){
                   17150:                                                        str_tb(" -- cycle",Out);
                   17151:                                                        I=I+1;
                   17152:                                                        F=0;
                   17153:                                                }
                   17154:                                                else if(type(L[I+1])<2) F=0;
                   17155:                                        }
                   17156:                                }
                   17157:                                while(++I<LS && type(L[I])<2);
                   17158:                                if(I>=LS) break;
                   17159:                                Q=L[I];
                   17160:                        }
                   17161:                }
                   17162:                str_tb(";\n",Out);
                   17163:        }
                   17164:        if(VF)  str_tb(str_tb(0,Ob),Out);
                   17165:        return str_tb(0,Out);
                   17166: }
                   17167:
                   17168: def xybox(L)
                   17169: {
                   17170:        K=length(L);
1.76      takayama 17171:        P=L[0];Q=L[1];
1.75      takayama 17172:        if(K==2)
                   17173:                LL=[ P, [P[0],Q[1]], Q, [Q[0],P[1]] ];
                   17174:        else{
                   17175:                R=L[2];
                   17176:                LL=[ P, R, Q, [P[0]+Q[0]-R[0],P[1]+Q[1]-R[1]] ];
                   17177:        }
                   17178:        Opt=getopt();
                   17179:        SS=getopt(opt);
                   17180:        FL=getopt(color);
                   17181:        if(TikZ&&type(SS)<1&&K==2){
                   17182:                if(type(FL)==4){
                   17183:                        F=FL[0];
                   17184:                        if(length(FL)>1) CMD=FL[1];
                   17185:                }else if(type(FL)==7) F=FL;
                   17186:                else F="";
                   17187:                F=cons(F,["rectangle"]);
                   17188:                if(CMD) return xyarrow(P,Q|opt=F,cmd=CMD);
                   17189:                else return xyarrow(P,Q|opt=F);
                   17190:        }
                   17191:        if(type(SS)!=7&&!TikZ) Opt=cons(["opt","@{-}"],Opt);
                   17192:        Opt=cons(["close",1],Opt);
                   17193:        return xylines(LL|option_list=Opt);
                   17194: }
                   17195:
                   17196: def xyang(S,P,Q,R)
                   17197: {
                   17198:        Opt=delopt(getopt(),"ar");
1.81      takayama 17199:        if(type(S)>2) S=dnorm([S,P]);
1.75      takayama 17200:        if(type(Prec=getopt(prec))!=1) Prec=0;
                   17201:        if(type(Q)>2){
1.82      takayama 17202:                if(isint(S)&&S<0&&S>-8){
                   17203:                        if((S=-S)==6||S==7){
                   17204:                                H=ptcommon([Q,R],[P,0]);
                   17205:                                if(S==6) return xyang(H,P,0,0|option_list=getopt()); /* 円 */
                   17206:                                return xylines([P,H]|option_list=getopt()); /* 垂線 */
                   17207:                        }
                   17208:                        O=pt5center(P,Q,R);
                   17209:                        if(S==2) H=P;   /* 外心 */
1.75      takayama 17210:                        else{
1.82      takayama 17211:                                if(S>2) S++; /* 内心,傍心 */
                   17212:                                H=ptcommon([P,Q],[O[S],0]);
1.75      takayama 17213:                        }
1.82      takayama 17214:                        return xyang(H,O[S],0,0|option_list=getopt());
                   17215:                }
                   17216:                if(type(Ar=getopt(ar))!=1) Ar=0;
                   17217:                if(isint(R)){
                   17218:                        if(R==1||R==-1){                                /* 直角 */
                   17219:                                P1=ptcommon([Q,P],[-S,0]);
                   17220:                                S*=R;
                   17221:                                P2=ptcommon([P,P1],[S,@pi/2]);
                   17222:                                P3=ptcommon([P1,P2],[S,@pi/2]);
                   17223:                                return xylines([P1,P2,P3]|option_list=Opt);
                   17224:                        }else if((AR=abs(R))==0||AR==2||AR==3||AR==4||AR>=10){  /* 矢印 */
                   17225:                                Ang=myarg([Q[0]-P[0],Q[1]-P[1]]);
                   17226:                                if(R<0) Ang+=3.14159;
                   17227:                                if(AR>10) X=deval(@pi/180*AR);
                   17228:                                else{
                   17229:                                        ANG=[0.7854,0.5236,1.0472];
                   17230:                                        X=(AR==0)?1.5708:ANG[AR-2];
                   17231:                                }
                   17232:                                U=[P[0]+S*dcos(Ang+X),P[1]+S*dsin(Ang+X)];
                   17233:                                V=[P[0]+S*dcos(Ang-X),P[1]+S*dsin(Ang-X)];      /* 矢先 */
                   17234:                                L=(X==0)?[U,V]:[U,P,V];
                   17235:                                if(X&&iand(Ar,2)){
                   17236:                                        L=append([V],L);
                   17237:                                        if((X=ptcommon([P,Q],[U,V]|in=1))!=0) P=X;
                   17238:                                }
                   17239:                                if(iand(Ar,1))
                   17240:                                        L=append([Q,P,0],L);            /* 心棒 */
                   17241:                                        return xylines(L|option_list=Opt);
                   17242:                                }else if(AR>4&&AR<9){
                   17243:                                        Ang=myarg([Q[0]-P[0],Q[1]-P[1]]);
                   17244:                                ANG=[0.7854,0.5236,0.3927,0.2618];
                   17245:                                X=ANG[AR-5];
                   17246:                                U=[P[0]+S*dcos(Ang+X),P[1]+S*dsin(Ang+X)];
                   17247:                                V=[P[0]+S*dcos(Ang-X),P[1]+S*dsin(Ang-X)];
                   17248:                                W=ptcommon([P,U],[P,Q]|in=-2);
                   17249:                                W1=[(U[0]+P[0]+W[0])/3,(U[1]+P[1]+W[1])/3];
                   17250:                                W2=[(V[0]+P[0]+W[0])/3,(V[1]+P[1]+W[1])/3];
                   17251:                                L=iand(Ar,2)?[V,U,1,W1,P,1,W2,V]:[U,W1,P,1,W2,V];
                   17252:                                if(iand(Ar,1)){
                   17253:                                        if(iand(Ar,2)) P=ptcommon([P,Q],[U,V]);
                   17254:                                        L=append([Q,P,0],L);
                   17255:                                };
                   17256:                                if(type(Sc=getopt(scale))>0){
                   17257:                                        if(type(Sc)==1) Sc=[Sc,Sc];
                   17258:                                        L=ptaffine(diagm(2,Sc),L);
                   17259:                                }
                   17260:                                Opt=delopt(Opt,"proc");
                   17261:                                if(getopt(proc)==1)     return append([2,Opt],L);
                   17262:                                S=xybezier(L|option_list=Opt);
                   17263:                                if(getopt(dviout)!=1) return S;
                   17264:                                dviout(xyproc(S));
                   17265:                                return 1;
1.75      takayama 17266:                        }
                   17267:                }
                   17268:        }
                   17269:        if(type(Q)<3){
                   17270:                X=deval(Q); Y=deval(R);
                   17271:        }else{
                   17272:                X=myarg([Q[0]-P[0],Q[1]-P[1]]);
                   17273:                Y=myarg([R[0]-P[0],R[1]-P[1]]);
                   17274:        }
                   17275:        if(Prec>2) N=8;
                   17276:        else if(Prec==2) N=6;
                   17277:        else if(Prec==1) N=4;
                   17278:        else N=3;
                   17279:        U=deval(@pi)*2/N;
                   17280:        if(X==Y||Y-X>6.28318){
                   17281:                for(L=[],I=N-1;I>=0;I--) L=cons([P[0]+S*dcos(I*U),P[1]+S*dsin(I*U)],L);
                   17282:                return xylines(L|option_list=append([["curve",1],["close",1]],Opt));
                   17283:        }
                   17284:        for(M=1;(Y-X)/M>U;M++);
                   17285:        for(L=[],I=M+1;I>-2;I--){
                   17286:                Ang=X+(Y-X)*I/M;
                   17287:                L=cons([P[0]+S*dcos(Ang),P[1]+S*dsin(Ang)],L);
                   17288:        }
                   17289:        if(getopt(ar)!=1) return xylines(L|option_list=append([["curve",1],["close",-1]],Opt));
                   17290:        OL=delopt(Opt,["dviout","opt","proc"]);
                   17291:        S=xylines(L|option_list=append([["curve",1],["close",-1],["opt",0]],OL));
                   17292:        T=xylines([P,L[1]]|option_list=cons(["opt",0],OL));
                   17293:        S=ptaffine("close",[S,T]);                      /* connect curves */
                   17294:        if(getopt(opt)==0) return S;
                   17295:        OL=(type(SS=getopt(opt))>1)?[["opt",SS]]:[];
                   17296:        if(type(T=getopt(proc))==1 && T>=1 && T<=3) return [1,OL,S];
                   17297:        if(OL==[]) S=xybezier(S);
                   17298:        else S=(type(SS)==7)? xybezier(S|opt=SS):xybezier(S|opt=SS[0],cmd=SS[1]);
                   17299:        if(getopt(dviout)==1) return xyproc(S|dviout=1);
                   17300:        return S;
                   17301: }
                   17302:
                   17303: def xyoval(P,L,R)
                   17304: {
                   17305:        if(type(Arg=getopt(arg))!=4 && type(Arg=getopt(deg))==4){
                   17306:                if(length(Arg)>2)
                   17307:                        Arg=[@pi*Arg[0]/180,@pi*Arg[1]/180,@pi*Arg[2]/180];
                   17308:                else
                   17309:                        Arg=[@pi*Arg[0]/180,@pi*Arg[1]/180];
                   17310:        }
                   17311:        if(type(Arg)==4){
                   17312:                Arg0=deval(Arg[0]); Arg1=deval(Arg[1]);
                   17313:                if(length(Arg)>2) Arg2=deval(Arg[2]);
                   17314:                if(Arg1<Arg0 || Arg0<-7) return 0;
                   17315:        }
                   17316:        if(type(Prec=getopt(prec))!=0) Prec=0;
                   17317:        if((Ar=getopt(ar))!=1) Ar=0;
                   17318:        L=xyang(L,[0,0],Arg0,Arg1|prec=Prec,opt=0,ar=Ar);
                   17319:        Sc=getopt(scale);
                   17320:        if(type(Sc=getopt(scale))<1) Sc=[1,1];
                   17321:        else if(type(Sc)==1) Sc=[Sc,Sc];
                   17322:        M=mat([1,0],[0,R]);
                   17323:        L=ptaffine(M,L|shift=P);
                   17324:        M=mat([Sc[0],0],[0,Sc[1]]);
                   17325:        L=ptaffine(M,L|arg=Arg2);
                   17326:        if((Opt=getopt(opt))==0) return L;
                   17327:        Opt=(type(Opt)>1)? [["opt2",Opt]]:[];
                   17328:        if(getopt(proc)==1) return [1,Opt,L];
                   17329:        S=xybezier(L|option_list=getopt());
                   17330:        if(getopt(dviout)==1){
                   17331:                xyproc(S|dviout=1);
                   17332:                return 1;
                   17333:        }
                   17334:        return S;
                   17335: }
                   17336:
                   17337: def xycirc(P,R)
                   17338: {
                   17339:        ST=getopt(opt);
                   17340:        if(type(ST)<0) ST="";
                   17341:        if(type(Arg=getopt(arg))!=4 && type(Arg=getopt(deg))==4){
                   17342:                Arg=[@pi*Arg[0]/180,@pi*Arg[1]/180];
                   17343:        }
                   17344: /*                                                             Is it OK?
                   17345:        if(TikZ==0 && XYcm==1){
                   17346:                R*=10; P=[P[0]*10,P[1]*10];
                   17347:        }
                   17348: */
                   17349:        if(type(Arg)==4){
                   17350:                Arg0=deval(Arg[0]); Arg1=deval(Arg[1]);
                   17351:                if(Arg1<=Arg0 || Arg0<-7 || Arg1-Arg0>7) return 0;
                   17352:                if(type(ST)==7)
                   17353:                        S=xygraph([R*cos(x)+P[0],R*sin(x)+P[1]],-4,[Arg0,Arg1],[P[0]-R-1,P[0]+R+1],
                   17354:         [P[1]-R-1,P[1]+R+1]|opt=ST);
                   17355:                else
                   17356:                        S=xygraph([R*cos(x)+P[0],R*sin(x)+P[1]],-4,[Arg0,Arg1],[P[0]-R-1,P[0]+R+1],
                   17357:         [P[1]-R-1,P[1]+R+1]);
                   17358:                if(getopt(close)==1){
                   17359:                        S=S+xyline([0,0],
                   17360:                                [deval(subst(R*cos(x)+P[0],x,Arg0)),deval(subst(R*sin(x)+P[0],x,Arg0))]);
                   17361:                        S=S+xyline([0,0],
                   17362:                                [deval(subst(R*cos(x)+P[0],x,Arg1)),deval(subst(R*sin(x)+P[0],x,Arg1))]);
                   17363:                }
                   17364:                return S;
                   17365:        }
                   17366:        if(TikZ){
                   17367:                SP="";
                   17368:                if(length(P)>2) SP=P[2];
                   17369:                if(type(SP)!=7) SP="$"+my_tex_form(SP)+"$";
                   17370:                if(R==0){
                   17371:                        if(ST!="") ST=ST+",";
                   17372:                        return "\\node ["+ST+"circle,draw]"+xypos([P[0],P[1]])+ "{"+SP+"};\n";
                   17373:                }
                   17374:                if(type(R)!=7) R=rtostr(deval(R));
                   17375:                if(ST!="") ST="["+ST+"]";
                   17376:                S="\\draw "+ST+xypos([P[0],P[1]])+" circle [radius="+R+"]";
                   17377:                if(SP!="") S=S+" node at"+xypos([P[0],P[1]])+" {"+SP+"}";
                   17378:                return S+";\n";
                   17379:        }
                   17380:        S="{"+xypos([P[0],P[1]]);
                   17381:        if(length(P)>2){
                   17382:                SP=P[2];
                   17383:                if(type(P)!=7) SP=my_tex_form(SP);
                   17384:                S=S+" *+{"+SP+"}";
                   17385:        }
                   17386:        S =S+" *\\cir";
                   17387:        if(R!=0){
                   17388:                R=deval(R);
                   17389:                S=S+"<"+rtostr(R)+((XYcm)?"cm>":"mm>");
                   17390:        }
                   17391:        S = S+"{";
                   17392:        if(type(ST)==7) S=S+ST;
                   17393:     return S+"}};\n";
                   17394: }
                   17395:
                   17396: def xypoch(W,H,R1,R2)
                   17397: {
                   17398:        if(H>R1||2*H>R2){
                   17399:                errno(0);
                   17400:                return;
                   17401:        }
                   17402:        if(type(Ar=getopt(ar))!=1) Ar=TikZ?0.25:2.5;
                   17403:        T1=dasin(H/R1);S1=R1*dcos(T1);
                   17404:        T2=dasin(H/R2);S2=R2*dcos(T2);
                   17405:        T3=dasin(2*H/R2);S3=R2*dcos(T3);
                   17406:        S=xyline([R1,0],[W-R1,0]);
                   17407:        S+=xyang(R1,[W,0],-@pi,@pi-T1);
                   17408:        S+=xyline([S2,H],[W-S1,H]);
                   17409:        S+=xyang(R2,[0,0],T2,2*@pi-T3);
                   17410:        S+=xylines([[S3,-2*H],[W-H-R2,-2*H],[W-H-R2,2*H],[W-S3,2*H]]);
                   17411:        S+=xyang(R2,[W,0],-@pi+T2,@pi-T3);
                   17412:        S+=xyline([W-T2,-H],[W-T2,-H]);
                   17413:        S+=xyang(R1,[0,0],0,2*@pi-T1);
                   17414:        S+=xyline([W-S2,-H],[S1,-H]);
                   17415:        if(Ar>0){
                   17416:                S+=xyang(Ar,[W/2,0],[0,0],8);
                   17417:                S+=xyang(Ar,[W/2,-2*H],[0,-2*H],8);
                   17418:                S+=xyang(Ar,[W/2-Ar,-H],[W,-H],8);
                   17419:                S+=xyang(Ar,[W/2-Ar,H],[W,H],8);
                   17420:                S+=xyang(Ar,[W-S3,2*H],[W-H-R2,2*H],8);
                   17421:        }
                   17422:        S+=xyput([R1,0,"$\\bullet$"]);
                   17423:        S+=xyput([0,0,"$\\times$"]);
                   17424:        S+=xyput([W,0,"$\\times$"]);
                   17425:        if(TikZ) S=str_subst(S,";\n\\draw","\n");
                   17426:        return S;
                   17427: }
1.33      takayama 17428:
1.72      takayama 17429: def xycircuit(P,S)
                   17430: {
                   17431:        if(type(Sc=getopt(scale))!=1) Sc=1;
                   17432:        if(type(Opt0=getopt(opt))!=7) Opt0="";
1.73      takayama 17433:        if(type(At=getopt(at))!=1) At=(S=="E"||S=="EE")?1:1/2;
1.72      takayama 17434:        Rev=(getopt(rev)==1)?-1:1;
                   17435:        if(type(P)==4&&type(car(P))==4&&P[0][0]==P[1][0]) Rev=-Rev;
1.75      takayama 17436:        W=R=B2=B3=0;Opt=Opt2=Opt3="";
1.73      takayama 17437:        if(S=="L"||S=="VL"||S=="LT"){
1.72      takayama 17438:                G=[1/8*x-2/5*cos(x)+2/5,1/2*sin(x)+1/2];
                   17439:                B=xygraph(G,-21,[0,7*@pi],[-1,10],[-2,2]|scale=0.3/1.06466,opt=0);
                   17440:                B=append(B,[1,[1,0]]);
                   17441:                B=append([[0,0],car(B),1],cdr(B));
                   17442:                W=1;Opt="thick";
                   17443:                if(S=="VL"){
                   17444:                        B2=xyang(0.2,[0.5+0.4*Rev,0.45],[0.5-0.435*Rev,-0.3],3|ar=3,opt=0);
                   17445:                        Opt2="thick,fill";
1.73      takayama 17446:                }else if(S=="LT"){
                   17447:                        B2=[[0.5+0.4*Rev,0.45],[0.5-0.435*Rev,-0.3],0,[0.45+0.4*Rev,0.394],[0.55+0.4*Rev,0.506]];
                   17448:                        Opt2="thick";
1.72      takayama 17449:                }
1.73      takayama 17450:        }else if(S=="C"||S=="VC"||S=="C+"||S=="C-"||S=="CT"){
1.72      takayama 17451:                B=[[0,-0.2],[0,0.2],0,[0.15,-0.2],[0.15,0.2]];
                   17452:                W=0.15;Opt="very thick";
                   17453:                if(S=="VC"){
                   17454:                        B2=xyang(0.2,[1/3+0.075,0.3*Rev],[-1/3+0.075,-0.3*Rev],3|ar=3,opt=0);
                   17455:                        Opt2="thick,fill";
1.73      takayama 17456:                }else if(S=="CT"){
                   17457:                        B2=[[1/3+0.075,0.3*Rev],[-1/3+0.075,-0.3*Rev],0,[1/3+0.125,0.244*Rev],
                   17458:                                [1/3+0.025,0.356*Rev]];
                   17459:                        Opt2="thick";
                   17460:                }else if(S=="C+")
1.72      takayama 17461:                        B2=[[0,0.05],[0.15,-0.05],0,[0,0.15],[0.15,0.05],0,[0,-0.05],[0.15,-0.15],
1.73      takayama 17462:                        0,[0.29,0.04*Rev],[0.29,0.24*Rev],0,[0.19,0.14*Rev],[0.39,0.14*Rev]];
                   17463:                else if(S=="C-")
                   17464:                        B2=[[0,0.05],[0.15,-0.05],0,[0,0.15],[0.15,0.05],0,[0,-0.05],[0.15,-0.15]];
                   17465:        }else if(S=="R"||S=="VR"||S=="VR3"||S=="RT"){
1.72      takayama 17466:                for(I=0,B=[[0,0]];I<12;I++)
                   17467:                        if(iand(I,1)) B=cons([I,(-1)^((I+1)/2)],B);
                   17468:                B=reverse(cons([12,0],B));
                   17469:                B=xylines(B|scale=[1/18,0.15],opt=0);
                   17470:                W=2/3;Opt="thick";
                   17471:                if(S=="VR"){
                   17472:                        B2=xyang(0.2,[2/3,0.3*Rev],[0,-0.3*Rev],3|ar=3,opt=0);
                   17473:                        Opt2="thick,fill";
1.73      takayama 17474:                }else if(S=="RT"){
                   17475:                        B2=[[2/3,0.3*Rev],[0,-0.3*Rev],0,[0.717,0.244*Rev],[0.617,0.357*Rev]];
                   17476:                        Opt2="thick";
1.72      takayama 17477:                }else if(S=="RN3"){
                   17478:                        B2=xyang(0.2,[1/3,0.2*Rev],[1/3,0.5*Rev],3|ar=3,opt=0);
                   17479:                        Opt2="thick,fill";
                   17480:                }
1.73      takayama 17481:        }else if(S=="RN"||S=="VRN"||S=="RN3"||S=="NRT"){
1.72      takayama 17482:                B=xylines([[0,0.1],[2/3,0.1],[2/3,-0.1],[0,-0.1],[0,0.1]]|opt=0);
                   17483:                W=2/3;Opt="thick";
                   17484:                if(S=="VRN"){
                   17485:                        B2=xyang(0.2,[2/3,0.3*Rev],[0,-0.3*Rev],3|ar=3,opt=0);
                   17486:                        Opt2="thick,fill";
                   17487:                }else if(S=="RN3"){
                   17488:                        B2=xyang(0.2,[1/3,0.2*Rev],[1/3,0.5*Rev],3|ar=3,opt=0);
                   17489:                        Opt2="thick,fill";
1.73      takayama 17490:                }else if(S=="NRT"){
                   17491:                        B2=[[2/3,0.3*Rev],[0,-0.3*Rev],0,[0.717,0.244*Rev],[0.617,0.357*Rev]];
                   17492:                        Opt2="thick";
1.72      takayama 17493:                }
                   17494:        }else if(S=="circle"){
                   17495:                W=1;
                   17496:                B=xyang(0.5,[0.5,0],0,0|opt=0);
                   17497:        }else if(S=="gap"){
                   17498:                W=0.3;
                   17499:                B=xyang(0.15,[0.15,0],0,3.1416|opt=0);
                   17500:        }else if(S=="E"){
                   17501:                W=0.1;
                   17502:                B=[[0,0.2],[0,-0.2],0,[0,0.05],[0.1,-0.05],0,[0,0.15],[0.1,0.05],0,[0,-0.05],[0.1,-0.15]];
1.73      takayama 17503:        }else if(S=="EE"){
                   17504:                W=0.15;
                   17505:                B=[[0,0.2],[0,-0.2],0,[0.075,0.13],[0.075,-0.13],0,[0.15,-0.06],[0.15,0.06]];
1.72      takayama 17506:        }else if(S=="Cell"){
                   17507:                W=0.1;
                   17508:                B=[[0,-0.2],[0,0.2]];
                   17509:                B2=[[0.1,-0.1],[0.1,0.1]];Opt2="very thick";
                   17510:        }else if(S=="Cell2"){
                   17511:                W=0.3;
                   17512:                B=[[0,-0.2],[0,0.2],0,[0.2,-0.2],[0.2,0.2]];
                   17513:                B2=[[0.1,-0.1],[0.1,0.1],0,[0.3,-0.1],[0.3,0.1]];Opt2="very thick";
1.73      takayama 17514:        }else if(S=="Cells"){
                   17515:                W=0.6;
                   17516:                B=[[0,-0.2],[0,0.2],0,[0.5,-0.2],[0.5,0.2],0,[0.1,0],[0.18,0],0,
                   17517:                        [0.24,0],[0.34,0],0,[0.40,0],[0.5,0]];
                   17518:                B2=[[0.1,-0.1],[0.1,0.1],0,[0.6,-0.1],[0.6,0.1]];Opt2="very thick";
1.72      takayama 17519:        }else if (S=="Sw"){
                   17520:                W=0.5;
                   17521:                B=xyang(0.05,[0.05,0],0,0|opt=0);
                   17522:                B0=ptaffine(1,B|shift=[0.4,0]);
                   17523:                B=ptaffine("union",[B,B0]);
                   17524:                B=ptaffine("union",[B,[[0.0908,0.025*Rev],[0.45,0.17*Rev]]]);
                   17525:        }else if(S=="D"){
                   17526:                W=0.3;Opt="thick";
                   17527:                B=[[0,0],[0.3,0.173],0,[0.3,0.173],[0.3,-0.173],0,[0.3,-0.173],[0,0],0,
                   17528:                [0,0.173],[0,-0.173]];
1.75      takayama 17529:        }else if(S=="NPN"||S=="PNP"||S=="NPN0"||S=="PNP0"){
                   17530:                W=0.6;
                   17531:                C=[[0.6,0],[0.37,0.23],[0,0],[0.23,0.23]];
                   17532:                if(Rev==-1) C=[C[2],C[3],C[0],C[1]];
                   17533:                if(S=="PNP"||S=="PNP0") C=[C[1],C[0],C[2],C[3]];
                   17534:                B=[[0,0],[0.23,0.23],0,[0.6,0],[0.37,0.23],0,[0.3,0.23],[0.3,0.6]];
                   17535:                B=ptaffine("union",[xyang(0.15,C[0],C[1],18|ar=1,opt=0),B]);
                   17536:                if(S=="PNP"||S=="NPN") B=ptaffine("union",[xyang(0.3354,[0.3,0.15],0,0|opt=0),B]);
                   17537:                B2=[[0.07,0.23],[0.53,0.23]];
                   17538:                Opt2="very thick";
                   17539:        }else if(S=="JN"||S=="JP"){
                   17540:                W=0.6;
                   17541:                B=[[0,0],[0.2,0],1,[0.2,0.23],0,[0.6,0],[0.4,0],1,[0.4,0.23],0,[0.3,0.23],[0.3,0.6]];
                   17542:                C=[[0.3,0.23],[0.3,0.4854]];
                   17543:                if(S=="JP") C=reverse(C);
                   17544:                B=ptaffine("union",[B,xyang(0.15,C[0],C[1],18|opt=0)]);
                   17545:                B=ptaffine("union",[B,xyang(0.3354,[0.3,0.15],0,0|opt=0)]);
                   17546:                B2=[[0.07,0.23],[0.53,0.23]];
                   17547:                Opt2="very thick";
1.72      takayama 17548:        }else if(S=="") R=(Opt0=="")?xyline(P[0],P[1]):xyline(P[0],P[1]|opt=Opt0);
                   17549:        else if(S=="arrow") R=xyang(0.2*Sc,P[1],P[0],3|ar=1,opt=Opt0);
                   17550:        else if(type(S)==4&&type(car(S))==7){
                   17551:                if(type(car(P))!=4) P=[P];
                   17552:                for(R="";P!=[];P=cdr(P)) R+=xyput([car(P)[0],car(P)[1],car(S)]);
                   17553:        }
                   17554:        if(W){
                   17555:                R="";
                   17556:                if(type(P)==4){
                   17557:                        if(type(car(P))==4){
                   17558:                                T=ptcommon([[0,0],[1,0]],P|in=2);
                   17559:                                L=dnorm(P);
                   17560:                                W*=Sc;
                   17561:                                L1=L*At-W/2;L2=L*(1-At)-W/2;
                   17562:                                if(L1>0){
                   17563:                                        P1=[P[0][0]+L1*dcos(T),P[0][1]+L1*dsin(T)];
                   17564:                                        R+=xyline(P[0],P1);
                   17565:                                }
                   17566:                                if(L2>0){
                   17567:                                        P2=[P[1][0]-L2*dcos(T),P[1][1]-L2*dsin(T)];
                   17568:                                        R+=xyline(P2,P[1]);
                   17569:                                }
                   17570:                                B=ptaffine(Sc,B|shift=P1,arg=T);
                   17571:                                if(B2) B2=ptaffine(Sc,B2|shift=P1,arg=T);
1.75      takayama 17572:                                if(B3) B3=ptaffine(Sc,B3|shift=P1,arg=T);
1.72      takayama 17573:                        }else{
                   17574:                                B=ptaffine(Sc,B|shift=P1);
                   17575:                                if(B2) B2=ptaffine(Sc,B2|shift=P1);
1.75      takayama 17576:                                if(B3) B3=ptaffine(Sc,B3|shift=P1);
1.72      takayama 17577:                        }
                   17578:                }else{
                   17579:                        B=ptaffine(Sc,B);
                   17580:                        if(B2) B2=ptaffine(Sc,B2);
1.75      takayama 17581:                        if(B3) B3=ptaffine(Sc,B3);
1.72      takayama 17582:                }
                   17583:                if(Opt=="") Opt=Opt0;
                   17584:                else if(Opt0!="") Opt=Opt+","+Opt0;
                   17585:                R+=(Opt=="")?xybezier(B):xybezier(B|opt=Opt);
                   17586:                if(B2){
                   17587:                        if(Opt2=="") Opt2=Opt0;
                   17588:                        else if(Opt0!="") Opt2=Opt2+","+Opt0;
                   17589:                        R+=(Opt2=="")?xybezier(B2):xybezier(B2|opt=Opt2);
                   17590:                }
1.75      takayama 17591:                if(B3){
                   17592:                        if(Opt3=="") Opt3=Opt0;
                   17593:                        else if(Opt0!="") Opt3=Opt3+","+Opt0;
                   17594:                        R+=(Opt3=="")?xybezier(B3):xybezier(B3|opt=Opt3);
                   17595:                }
1.72      takayama 17596:        }
                   17597:        return R;
                   17598: }
                   17599:
                   17600:
1.6       takayama 17601: def ptaffine(M,L)
                   17602: {
                   17603:        if(type(L)!=4&&type(L)!=5){
                   17604:                erno(0);return L;
                   17605:        }
                   17606:        if(type(M)==7){ /* connect lists */
                   17607:                if(M=="reverse"){
                   17608:                        for(LO=LR=[],F=0,LT=L; LT!=[]; LT=cdr(LT)){
                   17609:                                if(type(P=car(LT))==4 || type(P)==7){
                   17610:                                        LR=cons(P,LR);
                   17611:                                        continue;
                   17612:                                }else{
                   17613:                                        if(P==-1){
                   17614:                                                LL=reverse(LR);
                   17615:                                                LO=append(reverse(cons(-1,cdr(LL))),LO);
                   17616:                                                LO=cons(car(LL),LO);
                   17617:                                                LR=[];
                   17618:                                        }else if(P==1){
                   17619:                                                LR=cons(car(LR),cons(1,cdr(LR)));
                   17620:                                        }else if(P==0 || length(LT)==1){
                   17621:                                                        if(LO!=[] && car(LO)!=0 && (type(car(LO))==4 || car(LO)==1))
                   17622:                                                                LO=cons(0,LO);
                   17623:                                                        LO=append(LR,LO);
                   17624:                                                        if(length(LT)>1&&length(LO)>0&&car(LO)!=0) LO=cons(0,LO);
                   17625:                                                        LR=[];
                   17626:                                        }
                   17627:                                }
                   17628:                        }
                   17629:                        return append(LR,LO);
                   17630:                }
                   17631:                if(type(L[0][0])!=4) L=[L];
                   17632:                LO=[];
                   17633:                if(M=="connect" || M=="close" || M=="loop"){
                   17634:                        Top=car(car(L));
                   17635:                        for(K=1,LL=L; LL!=[]; LL=cdr(LL)){
                   17636:                                for(F=0,LT=car(LL); LT!=[]; LT=cdr(LT),F++){
                   17637:                                        if((LTT=car(LT))==0) LTT=1;
                   17638:                                        if(F==0 && LO!=[]){
                   17639:                                                LO0=car(LO);
                   17640:                                                if(car(LO)!=1&&length(LO)>1) LO=cons(1,LO);
                   17641:                                                if(LTT==LO0) continue;
                   17642:                                                else LO=cons(1,cons(LTT, LO));
                   17643:                                        }else LO=cons(LTT, LO);
                   17644:                                }
                   17645:                        }
                   17646:                        if(M!="connect"){
                   17647:                                if(Top==car(LO) || car(LO)==1 || M=="loop")
                   17648:                                        LO=cons(-1,cdr(LO));
                   17649:                                else
                   17650:                                        LO=cons(-1,cons(1,LO));
                   17651:                        }
                   17652:                        return reverse(LO);
                   17653:                }
                   17654:                if(M=="union"){
                   17655:                        for(LL=reverse(L); LL!=[]; LL=cdr(LL)){
                   17656:                                if(LO!=[]) LO=cons(0,LO);
                   17657:                                LO=append(car(LL),LO);
                   17658:                        }
                   17659:                        L=LO;
                   17660:                }
                   17661:                return L;
                   17662:        }
                   17663:        if(type(Arg=getopt(deg))==1)
                   17664:                Arg=@pi*Arg/180;
                   17665:        else Arg=getopt(arg);
                   17666:        if(type(Arg)==2) Arg=deval(Arg);
                   17667:        if(type(Arg)==1)
                   17668:                M=M*mat([dcos(Arg),-dsin(Arg)],[dsin(Arg),dcos(Arg)]);
                   17669:        if(type(Sft=getopt(org))==4){
                   17670:                Sft=ltov(Sft);
                   17671:                Sft-=M*Sft;
                   17672:        }else Sft=ltov([0,0]);
                   17673:        if(type(V=getopt(shift))==4)
                   17674:                Sft+=ltov(V);
                   17675:        if(getopt(proc)==1){
                   17676:                if(Sft!=0&&ltov(Sft)!=[0,0]) Sft=[["shift",vtol(Sft)]];
                   17677:                else Sft=[];
                   17678:                for(LO=[],LT=L;LT!=[];LT=cdr(LT)){
                   17679:                        if(type(car(T=car(LT)))<2){
                   17680:                                if((P=car(T))==0){      /* exedraw 0 */
                   17681:                                        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]]];
                   17682:                                        V=ptbbox(ptaffine(M,V|option_list=Sft));
                   17683:                                        L1=cdr(cdr(cdr(T)));
                   17684:                                        LO=cons(append([0,V[0],V[1]],L1),LO);
                   17685:                                        continue;
                   17686:                                }else if(P==1){ /* exedraw 1 */
                   17687:                                        L1=[];
                   17688:                                        for(TT=cdr(cdr(T));TT!=[];TT=cdr(TT)){
                   17689:                                                D=car(TT);
                   17690:                                                if(type(D[0][0])==4){
                   17691:                                                        for(L2=[],DT=D;DT!=[];DT=cdr(DT))
                   17692:                                                                L2=cons(ptaffine(M,car(DT)|option_list=Sft),L2);
                   17693:                                                        L1=cons(reverse(L2),L1);
                   17694:                                                }else L1=cons(ptaffine(M,D|option_list=Sft),L1);
                   17695:                                        }
                   17696:                                        LO=cons(append([1,T[1]],reverse(L1)),LO);
                   17697:                                        continue;
                   17698:                                }else if(P>=2 && P<=5){
                   17699:                                        L1=ptaffine(M,cdr(cdr(T))|optilon_list=Sft);
                   17700:                                        LO=cons(append([P,T[1]],L1),LO);
                   17701:                                        continue;
                   17702:                                }
                   17703:                        }
                   17704:                        LO=cons(T,LO);
                   17705:                }
                   17706:                return reverse(LO);
                   17707:        }
                   17708:        F=0;
                   17709:        if(type(L)==4){
                   17710:                for(LT=L; LT!=[]; LT=cdr(LT)){
                   17711:                        if((T=type(car(LT)))==4||T==5){
                   17712:                                F=1; break;
                   17713:                        }
                   17714:                }
                   17715:        }
                   17716:        if(F==0) return (Sft==0)?ptaffine(M,[L])[0]:ptaffine(M,[L]|shift=vtol(Sft))[0];
                   17717:        for(LO=[],LT=L; LT!=[]; LT=cdr(LT)){
                   17718:                if(((T=type(P=car(LT)))!=4 && T!=5)||type(P[0])>3) LO=cons(P,LO);
                   17719:                else{
                   17720:                        if(T==4) P=ltov(P);
                   17721:                        V=M*P;
                   17722:                        if(Sft!=0) V+=Sft;
                   17723:                        if(T==4) V=vtol(V);
                   17724:                        LO=cons(V,LO);
                   17725:                }
                   17726:        }
                   17727:        return reverse(LO);
                   17728: }
                   17729:
                   17730: def ptlattice(M,N,X,Y)
                   17731: {
                   17732:        if(type(S=getopt(scale))!=1) S=1;
                   17733:        if(type(Cond=getopt(cond))!=4) Cond=[];
                   17734:        Line=getopt(line);
                   17735:        if(Line==1 || Line==2) F=newmat(M,N);
                   17736:        else Line=0;
                   17737:        if(type(Org=getopt(org))==4) Org=ltov(Org);
                   17738:        else Org=newvect(length(X));
                   17739:        X=ltov(X); Y=ltov(Y);
                   17740:        for(L=[],I=M-1;I>=0;I--){
                   17741:                for(P0=P1=0,J=N-1;J>=0;J--){
                   17742:                        P=Org+I*X+J*Y;
                   17743:                        for(C=Cond; C!=[]; C=cdr(C))
                   17744:                                if(subst(car(C),x,P[0],y,P[1])<0) break;
                   17745:                        if(C!=[]) continue;
                   17746:                        if(Line) F[I][J]=1;
                   17747:                        else L=cons(vtol(S*P),L);
                   17748:                }
                   17749:        }
                   17750:        if(Line==0) return L;
                   17751:        for(I=M-1;I>=0;I--){
                   17752:                for(T0=0,T1=J=N-1;J>=0;J--){
                   17753:                        if((K=F[I][J])!=0){
                   17754:                                if(T0==0) T0=J;
                   17755:                                else T1=J;
                   17756:                        }
                   17757:                        if(K==0 || T1==0){
                   17758:                                if(T1<T0){
                   17759:                                        L=cons(vtol(S*(Org+I*X+T0*Y)), L);
                   17760:                                        L=cons(vtol(S*(Org+I*X+T1*Y)), L);
                   17761:                                        L=cons(0,L);
                   17762:                                }
                   17763:                                T0=0; T1=N-1;
                   17764:                        }
                   17765:                }
                   17766:        }
                   17767:        for(J=N-1;J>=0;J--){
                   17768:                for(T0=0,T1=I=M-1;I>=0;I--){
                   17769:                        if((K=F[I][J])!=0){
                   17770:                                if(T0==0) T0=I;
                   17771:                                else T1=I;
                   17772:                        }
                   17773:                        if(K==0 || T1==0){
                   17774:                                if(T1<T0){
                   17775:                                        L=cons(vtol(S*(Org+T0*X+J*Y)), L);
                   17776:                                        L=cons(vtol(S*(Org+T1*X+J*Y)), L);
                   17777:                                        L=cons(0,L);
                   17778:                                }
                   17779:                                T0=0; T1=M-1;
                   17780:                        }
                   17781:                }
                   17782:        }
                   17783:        return cdr(L);
                   17784: }
                   17785:
                   17786: def ptpolygon(N,R)
                   17787: {
                   17788:        if(type(S=getopt(scale))!=1) S=1;
                   17789:        if(type(Org=getopt(org))!=4) Org=[0,0];
                   17790:        Pi=deval(@pi);
                   17791:        if(type(Arg=getopt(deg))==1)
                   17792:                Arg=Pi*Arg/180;
                   17793:        else Arg=getopt(arg);
                   17794:        if(type(Arg)==2) Arg=deval(Arg);
                   17795:        if(type(Arg)!=1) Arg=0;
                   17796:        Arg -= Pi*(1/2+1/N);
                   17797:        D=Pi*2/N;
                   17798:        for(L=[],I=N-1; I>=0; I--)
                   17799:                L=cons([S*(Org[0]+R*dcos(Arg+I*D)),S*(Org[1]+R*dsin(Arg+I*D))],L);
                   17800:        return L;
                   17801: }
                   17802:
                   17803: def ptwindow(L,X,Y)
                   17804: {
                   17805:        if(type(S=getopt(scale))==1){
                   17806:                X=[S*X[0],S*X[1]]; Y=[S*Y[0],S*Y[1]];
                   17807:        }
                   17808:        for(R=[],LT=L;LT!=[];LT=cdr(LT)){
                   17809:                P=car(LT);
                   17810:                if(P[0]<X[0] || P[0]>X[1] || P[1]<Y[0] || P[1]>Y[1])
                   17811:                        R=cons(0,R);
                   17812:                else R=cons(P,R);
                   17813:        }
                   17814:        return reverse(R);
                   17815: }
                   17816:
1.81      takayama 17817: def pt5center(P,Q,R)
                   17818: {
1.83    ! takayama 17819: /* P=[1,[0,0]];Q=[[0,0],[1,0]];R=[[0,0],[0,1]]; */
        !          17820:        if(length(P)==2&&type(P[0])==4){ /* circle */
        !          17821:                if(type(Q)==4&&type(Q[1])==4){ /* line */
        !          17822:                        A=myarg(lsub(Q));B=myarg(lsub(R));X0=ptcommon(Q,R);
        !          17823:                        M=mrot(-A);N=mrot(A);X=M*ltov(X0);O=M*ltov(P[0]);
        !          17824:                        if(!(L=B-A)) return 0;
        !          17825:                        Pi=deval(@pi);for(;L<0;L+=Pi);for(;L>Pi;L-=Pi);
        !          17826:                        XX=X[0]+y*deval(cos(L/2))/deval(sin(L/2));
        !          17827:                        XY=X[1]+y;
        !          17828:                        if(getopt(neg)==1){
        !          17829:                                XX=subst(XX,y,-y);XY=subst(XY,y,-y);
        !          17830:                        }
        !          17831: /* mycat([[P[0],O],XX,XY]); */
        !          17832:                        V=(XX-O[0])^2+(XY-O[1])^2;
        !          17833: /* mycat(V-(y+P[0])^2); */
        !          17834:                        S=polroots(V-(y+P[1])^2,y);
        !          17835:                        S=append(polroots(V-(y-P[1])^2,y),S);
        !          17836:                        S=qsort(S);V=ltov([XX,XY]);
        !          17837: /* mycat([S,V,M,N,M*N]); */
        !          17838:                        for(R0=[],ST=S;ST!=[];ST=cdr(ST)) R0=cons([vtol(N*subst(V,y,car(ST))), car(ST)],R0);
        !          17839: /*  mycat(R0); */
        !          17840:                        for(R=[],F=1;R0!=[];R0=cdr(R0)){
        !          17841:                                if(car(R0)[1]>=0) R=cons(car(R0),R);
        !          17842:                                else{
        !          17843:                                        if(F){
        !          17844:                                                F=0; R=reverse(R);
        !          17845:                                        }
        !          17846:                                        R=cons(car(R0),R);
        !          17847:                                }
        !          17848:                        }
        !          17849: /* mycat(R); */
        !          17850:                        if(!F) R=reverse(R);
        !          17851:                        return R;
        !          17852:                }
        !          17853:        }
1.81      takayama 17854:        L=newvect(7);
                   17855:        L[2]=ptcommon([P,Q],[P,R]|in=-1);
                   17856:        Q1=ptcommon([P,R],[Q,0]);R1=ptcommon([P,Q],[R,0]);
                   17857:        L[3]=ptcommon([Q,Q1],[R,R1]);
                   17858:        P=ltov(P);Q=ltov(Q);R=ltov(R);
                   17859:     A=dnorm([Q,R]);B=dnorm([P,R]);C=dnorm([P,Q]);
                   17860:        L[0]=vtol((P+Q+R)/3);
                   17861:        L[1]=vtol((A*P+B*Q+C*R)/(A+B+C));
                   17862:        L[4]=vtol((-A*P+B*Q+C*R)/(-A+B+C));
                   17863:        L[5]=vtol((A*P-B*Q+C*R)/(A-B+C));
                   17864:        L[6]=vtol((A*P+B*Q-C*R)/(A+B-C));
                   17865:        return vtol(L);
                   17866: }
                   17867:
1.6       takayama 17868: def lninbox(L,W)
                   17869: {
                   17870:        if(L[0]==L[1]) return 0;
                   17871:        R=newvect(2);C=newvect(2);
                   17872:        for(J=0;J<2;J++){
                   17873:                C[J]=L[1][J]-L[0][J];
                   17874:                if(C[J]!=0){
                   17875:                        R[J]=[(W[J][0]-L[0][J])/C[J],(W[J][1]-L[0][J])/C[J]];
                   17876:                        if(R[J][0]>R[J][1]) R[J]=[R[J][1],R[J][0]];
                   17877:                }
                   17878:        }
                   17879:        if(R[0]==0) R[0]=R[1];
                   17880:        if(R[1]==0) R[1]=R[0];
                   17881:        S0=(R[0][0]<R[1][0])?R[1][0]:R[0][0];
                   17882:        S1=(R[0][1]<R[1][1])?R[0][1]:R[1][1];
                   17883:        if(getopt(in)==1){
                   17884:                if(S0<0) S0=0;
                   17885:                if(S1>1) S1=1;
                   17886:        }
                   17887:        if(S0>S1) return 0;
                   17888:        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]];
                   17889: }
                   17890:
                   17891: def ptbbox(L)
                   17892: {
                   17893:        J=length(L[0]);
                   17894:        if((Box=getopt(box))==1){
                   17895:                for(R=[],I=0;I<J;I++){
                   17896:                        P=car(LT=L)[I][0];Q=car(LT)[I][1];
                   17897:                        for(;LT!=[];LT=cdr(LT)){
                   17898:                                if((type(T=car(LT))==4 || type(T)==5) && length(T)==J){
                   17899:                                        if(T[I][0]<P) P=T[I][0];
                   17900:                                        if(T[I][1]>Q) Q=T[I][1];
                   17901:                                }
                   17902:                        }
                   17903:                        R=cons([P,Q],R);
                   17904:                }
                   17905:        }else if(type(Box)==4) return ptbbox([ptbbox(L),Box]|box=1);
                   17906:        else{
                   17907:                for(R=[],I=0;I<J;I++){
                   17908:                        P=Q=car(LT=L)[I];LT=cdr(LT);
                   17909:                        for(;LT!=[];LT=cdr(LT)){
                   17910:                                if((type(T=car(LT))==4||type(T)==5) && type(T[0])<2 && length(T)==J){
                   17911:                                        if((V=T[I])<P) P=V;
                   17912:                                        else if(V>Q) Q=V;
                   17913:                                }
                   17914:                        }
                   17915:                        R=cons([P,Q],R);
                   17916:                }
                   17917:        }
                   17918:        return reverse(R);
                   17919: }
                   17920:
                   17921: def iscombox(S,T)
                   17922: {
                   17923:        for(;S!=[];S=cdr(S),T=cdr(T))
                   17924:                if(car(S)[0]>car(T)[1] || car(S)[1]<car(T)[0]) return 0;
                   17925:        return 1;
                   17926: }
                   17927:
                   17928: def ptcopy(L,V)
                   17929: {
                   17930:        if(type(V[0])!=4) V=[V];
                   17931:        for(F=0,LL=[]; V!=[]; V=cdr(V)){
                   17932:                if(F)   LL=append(LL,[0]);
                   17933:                F++;
                   17934:                LL=append(LL,ptaffine(1,L|shift=car(V)));
                   17935:        }
                   17936: }
                   17937:
1.58      takayama 17938: def regress(L)
                   17939: {
                   17940:        E=deval(exp(0));
                   17941:        for(S0=T0=0,S=L;S!=[];S=cdr(S)){
                   17942:                S0+=car(S)[0]*E;T0+=car(S)[1]*E;
                   17943:        }
                   17944:        K=length(L);S0/=K;T0/=K;
                   17945:        for(SS=TT=0,S=L;S!=[];S=cdr(S)){
                   17946:                SS+=(car(S)[0]-S0)^2*E;TT+=(car(S)[1]-T0)^2*E;
                   17947:                ST+=(car(S)[0]-S0)*(car(S)[1]-T0)*E;
                   17948:        }
                   17949:        if(!SS||!TT) return [];
                   17950:        A=ST/SS;
                   17951:        L=[A,A*S0-T0,ST/dsqrt(SS*TT),S0,dsqrt(SS/K),T0,dsqrt(TT/K)];
                   17952:        if(isint(N=getopt(sint))){
                   17953:                R=reverse(L);
                   17954:                for(L=[];R!=[];R=cdr(R)) L=cons(sint(car(R),N|str=0),L);
                   17955:        }
                   17956:        return L;
                   17957: }
                   17958:
1.6       takayama 17959: def    average(L)
                   17960: {
1.32      takayama 17961:        if(getopt(opt)=="co"){
                   17962:                S0=average(L[0]);V0=car(S0);
                   17963:                S1=average(L[1]);V1=car(S1);
                   17964:                L0=os_md.m2l(L[0]|flat=1);
                   17965:                L1=os_md.m2l(L[1]|flat=1);
                   17966:                for(S=0;L0!=[];L0=cdr(L0),L1=cdr(L1))
                   17967:                        S+=(car(L0)-V0)*(car(L1)-V1);
                   17968:                S/=S0[1]*S1[1]*S0[2];
                   17969:                S=[S,S0,S1];
                   17970:        }else{
                   17971:                L=os_md.m2l(L|flat=1);
                   17972:                M0=M1=car(L);
                   17973:                for(I=SS=0, LT=L; LT!=[]; LT=cdr(LT), I++){
                   17974:                        S+=(V=car(LT));
                   17975:                        SS+=V^2;
                   17976:                        if(V<M0)                M0=V;
                   17977:                        else if(V>M1)   M1=V;
                   17978:                }
                   17979:                SS=dsqrt(SS/I-S^2/I^2);
                   17980:                S=[deval(S/I),SS,I,M0,M1];
1.6       takayama 17981:        }
1.8       takayama 17982:        if(isint(N=getopt(sint))) S=sint(S,N);
                   17983:        return S;
1.6       takayama 17984: }
                   17985:
                   17986: def m2ll(M)
                   17987: {
                   17988:        for(R=[],I=size(M)[0]-1; I>=0; I--)
                   17989:                R=cons(vtol(M[I]),R);
                   17990:        return R;
                   17991: }
                   17992:
                   17993: def madjust(M,W)
                   17994: {
                   17995:        if(type(Null=getopt(null))<0) Null=0;
                   17996:        if(type(M)==4 && type(M[0])==4){
                   17997:                M=lv2m(M|null=Null);
                   17998:                return m2ll(madjust(M,W|null=Null));
                   17999:        }
                   18000:        S=size(M);
                   18001:        if(W<0){
                   18002:                W=-W;
                   18003:                T0=ceil(S[0]/W);
                   18004:                T1=S[1]*W;
                   18005:                N=newmat(T0,T1);
                   18006:                for(I=0; I<T0; I++){
                   18007:                        for(K=0; K<W; K++){
                   18008:                                II=K*T0+I;
                   18009:                                for(J=0; J<S[1]; J++)
                   18010:                                        N[I][S[1]*K+J]=(II<S[0])?M[II][J]:Null;
                   18011:                        }
                   18012:                }
                   18013:        }else{
                   18014:                T1=W;
                   18015:                T0=S[0]*(D=ceil(S[1]/T1));
                   18016:                N=newmat(T0,T1);
                   18017:                for(K=0; K<D; K++){
                   18018:                        for(J=0; J<W;J++){
                   18019:                                JJ=W*K+J;
                   18020:                                for(I=0; I<S[0]; I++)
                   18021:                                        N[S[0]*K+I][J]=(JJ<S[1])?M[I][JJ]:Null;
                   18022:                        }
                   18023:                }
                   18024:        }
                   18025:        return N;
                   18026: }
                   18027:
                   18028: def texcr(N)
                   18029: {
                   18030:        if(!isint(N) || N<0 || N>127) return N;
                   18031:        S=(iand(N,8))? "\\allowdisplaybreaks":"";
                   18032:        if(iand(N,2))  S=S+"\\\\";
                   18033:        if(iand(N,16)) S=S+"\\pause";
                   18034:        if(iand(N,1))  S=S+"\n";
                   18035:        if(iand(N,4))  S=S+"& ";
                   18036:        else if(!iand(N,1)) S=S+" ";
                   18037:        if(iand(N,64)) S=S+"=";
                   18038:        if(iand(N,32)) S=","+S;
                   18039:        return S;
                   18040: }
                   18041:
                   18042: def ltotex(L)
                   18043: {
                   18044:        /* extern TeXLim;       */
                   18045:
                   18046:        if(type(L)==5)
                   18047:                L = vtol(L);
                   18048:        if(type(L) != 4)
                   18049:                return my_tex_form(L);
                   18050:        Opt=getopt(opt);
                   18051:        Pre=getopt(pre);
                   18052:        if(type(Var=getopt(var))<1) Var=0;
                   18053:     Cr2="\n";
                   18054:        if(type(Cr=getopt(cr))==4){
                   18055:                Cr2=Cr[1];Cr=Cr[0];
                   18056:        }
                   18057:        if(isint(Cr)) Cr=texcr(Cr);
                   18058:        if(type(Cr)!=7) Cr="\\\\\n & "; /* Cr=7 */
                   18059:        if(type(Opt)==7) Opt=[Opt];
                   18060:        if(type(Opt)!=4)
                   18061:                Op = -1;
                   18062:        else{
                   18063:                Op=findin(Opt[0],["spt","GRS","Pfaff","Fuchs","vect","cr","text","spts","spts0",
                   18064:                        "dform","tab", "graph","coord"]);
                   18065:                Opt=cdr(Opt);
                   18066:        }
                   18067:        if(Op==0){      /* spt */
                   18068:                Out = str_tb("\\left\\{\n ",0);
                   18069:                for(CC=0; L!=[]; L=cdr(L), CC++){
                   18070:                        if(CC>0) str_tb(",\\, ",Out);
                   18071:                        TP=car(L);
                   18072:                        if(Op!=0)
                   18073:                                str_tb(my_tex_form(TP),Out);
                   18074:                        else if(TP[0]==1)
                   18075:                                str_tb(my_tex_form(TP[1]),Out);
                   18076:                        else
                   18077:                                str_tb(["[", my_tex_form(TP[1]), "]_", rtotex(TP[0])],Out);
                   18078:                }
                   18079:                str_tb("%\n\\right\\}\n",Out);
                   18080:        }else if(Op==1){ /* GRS */
                   18081:                Out = string_to_tb("\\begin{Bmatrix}\n");
                   18082:                if(type(Pre)==7) str_tb(Pre,Out);
                   18083:                MC=length(M=ltov(L));
                   18084:                for(ML=0, I=length(M); --I>=0; ){
                   18085:                        if(length(M[I]) > ML)  ML=length(M[I]);
                   18086:                }
                   18087:                for(I=0; I<ML; I++){
                   18088:                        for(CC=J=0; J<MC; J++, CC++){
                   18089:                                if(length(M[J]) <= I){
                   18090:                                        if(CC > 0) str_tb(" & ",Out);
                   18091:                                }else if(M[J][I][0] <= 1){
                   18092:                                        if(M[J][I][0] == 0) str_tb(" & ",Out);
                   18093:                                        else
                   18094:                                                str_tb([(!CC)?" ":" & ", my_tex_form(M[J][I][1])], Out);
                   18095:                                }else
                   18096:                                        str_tb([((!CC)?" [":" & ["), my_tex_form(M[J][I][1]), "]_",
                   18097:                                         rtotex(M[J][I][0])], Out);
                   18098:                        }
                   18099:                        str_tb((I<ML-1)?"\\\\\n":"\n", Out);
                   18100:                }
                   18101:                str_tb("\\end{Bmatrix}",Out);
                   18102:        }else if(Op==2){ /* Pfaff */
                   18103:                V=monototex(Opt[0]);
                   18104:                Out = string_to_tb("d"+V+"= \\Biggl(");
                   18105:                Opt=cdr(Opt);
                   18106:                II=length(Opt);
                   18107:                for(I=0; I<II; I++){
                   18108:                         str_tb([(I>0)?" + ":" ",mtotex(L[I]),"\\frac{d",monototex(Opt[I]),"}{",
                   18109:                         my_tex_form(Opt[I]),(I==II-1)?"}\n":"}\n\\\\&\n"],Out);
                   18110:                }
                   18111:                str_tb(["\\Biggr)",V,"\n"],Out);
                   18112:        }else if(Op==3){ /* Fuchs */
                   18113:                Out = string_to_tb("\\frac{d");
                   18114:                V=my_tex_form(Opt[0]);
                   18115:                str_tb([V,"}{d",my_tex_form(Opt[1]),"}="] ,Out);
                   18116:                Opt=cdr(Opt); Opt=cdr(Opt);
                   18117:                II=length(Opt);
                   18118:                for(I=0; I<II; I++){
                   18119:                         str_tb([(I>0)?" +":"\\Biggl(", " \\frac{",
                   18120:                         my_tex_form(L[I]),"}{", my_tex_form(Opt[I]),"}\n"],Out);
                   18121:                }
                   18122:                str_tb(["\\Biggr)",V,"\n"],Out);
                   18123:        }else if(Op==4){        /* vect */
                   18124:                Out=str_tb(mtotex(matc(L)|lim=0,var=Var),0);
                   18125:        }else if(Op==5 || Op==6){       /* cr or text */
                   18126:                Out = str_tb(0,0);
                   18127:                if(type(Lim=getopt(lim))!=1) Lim=0;
                   18128:                else if(Lim<30&&Lim>0) Lim=TeXLim;
                   18129:                Str=getopt(str);
                   18130:                if(length(Opt)==1 && (car(Opt)=="spts" || car(Opt)=="spts0") && type(Str)!=1)
                   18131:                        Str=2;
                   18132:                for(K=I=0; L!=[]; I++, L=cdr(L)){
                   18133:                        LT=car(L);
                   18134:                        if((!Lim||Op==6)&&I>0) str_tb((Op==5)?Cr:"\n",Out);
                   18135:                        if(Op==6){
                   18136:                                if(type(LT)==7){
                   18137:                                        str_tb([LT," "],Out);
                   18138:                                        I=-1;
                   18139:                                        continue;
                   18140:                                }
                   18141:                                str_tb("$",Out);
                   18142:                        }
                   18143:                        KK=0;
                   18144:                        if(Str>0 && type(LT)==4 && Opt!=[])
                   18145:                                S=ltotex(LT|opt=car(Opt),lim=0,str=Str,cr=Cr2,var=Var);
                   18146:                        else if(type(LT)==6){
                   18147:                                if(Lim>0){
                   18148:                                        S=mtotex(LT|var=Var,lim=0,len=1);
                   18149:                                        KK=S[1];
                   18150:                                        S=S[0];
                   18151:                                }else S=mtotex(LT|var=Var,lim=0);
                   18152:                        }else if(type(LT)==3 || type(LT)==2)
                   18153:                                S=fctrtos(LT|TeX=2,lim=0,var=Var);
                   18154:                        else S=my_tex_form(LT);
                   18155:                        if(Op!=6&&I>0&&Lim){
                   18156:                                if(Lim<0){
                   18157:                                        if(I%(-Lim)==0)
                   18158:                                                str_tb((Op==5)?Cr:"\n",Out);
                   18159:                                }else if((K+=(KK=(KK)?KK:texlen(S)))>Lim){
                   18160:                                        str_tb((Op==5)?Cr:"\n",Out);
                   18161:                                        K=KK;
                   18162:                                }
                   18163:                        }
                   18164:                        str_tb(S,Out);
                   18165:                        if(Op==6) str_tb("$",Out);
                   18166:                }
                   18167:        }else if(Op==7||Op==8){ /* spts, spts0 */
                   18168:                if(type(Lim=getopt(lim))!=1 || (Lim<30 && Lim!=0))
                   18169:                        Lim=TeXLim;
                   18170:                Str=getopt(str);
                   18171:                Out = str_tb(0,0);
                   18172:                for(K=0; L!=[]; L=cdr(L)){
                   18173:                        LT=car(L);
                   18174:                        KK=0;
                   18175:                        if(type(LT)==7 && Str==1) S=LT;
                   18176:                        else if(type(LT)==3 || type(LT)==2)
                   18177:                                S=fctrtos(LT|TeX=2,lim=0,var=Var);
                   18178:                        else if(type(LT)==6){
                   18179:                                if(Lim){
                   18180:                                        S=mtotex(LT|var=Var,lim=0,len=1);
                   18181:                                        KK=S[1];
                   18182:                                        S=S[0];
                   18183:                                }else S=mtotex(LT|var=Var,lim=0);
                   18184:                        }else
                   18185:                                S=my_tex_form(LT);
                   18186:                        if(Lim!=0){
                   18187:                                if(!KK) KK=texlen(S);
                   18188:                                if(K>0 && K+KK>Lim){
                   18189:                                        str_tb(Cr,Out);
                   18190:                                        K=0;
                   18191:                                }
                   18192:                        }
                   18193:                        if(K>0){
                   18194:                                str_tb((Op==7)?"\\ ":" ",Out);
                   18195:                                if(type(LT)>3 && type(LT)<7)    str_tb("%\n",Out);
                   18196:                        }
                   18197:                        str_tb(S,Out);
                   18198:                        K+=KK;
                   18199:                        if(OP==7)       K++;
                   18200:                }
                   18201:        }else if(Op==9){        /* dform */
                   18202:                Out=str_tb(0,0);
                   18203:                for(I=0;L!=[];L=cdr(L),I++){
                   18204:                        for(J=0,LT=car(L); LT!=[]; LT=cdr(LT),J++){
                   18205:                                if(J==0){
                   18206:                                        if((V=car(LT))==0)      continue;
                   18207:                                        if(I>0){
                   18208:                                                if(type(V)==1){
                   18209:                                                        if(V<0){
                   18210:                                                                str_tb("-",Out);
                   18211:                                                                V=-V;
                   18212:                                                        }
                   18213:                                                        else    str_tb("+",Out);
                   18214:                                                        if(V==1 && length(LT)>1) continue;
                   18215:                                                        str_tb(monototex(V),Out);
                   18216:                                                        continue;
                   18217:                                                }
                   18218:                                                else    str_tb("+",Out);
                   18219:                                        }
                   18220:                                }else if(J>0)   str_tb((J>1)?"\\wedge d":"\\,d",Out);
                   18221:                                V=monototex(car(LT));
                   18222:                                if(V<"-" || V>=".")     str_tb(V,Out);
                   18223:                                else str_tb(["(",V,")"],Out);
                   18224:                        }
                   18225:                }
                   18226:        }else if(Op==10 && type(L)==4 && type(car(L))==4){      /* tab */
                   18227:                if(type(Null=getopt(null))<0) Null="";
                   18228:                if(getopt(vert)==1){
                   18229:                        M=lv2m(L|null=Null);
                   18230:                        L=m2ll(mtranspose(M));
                   18231:                }
                   18232:                if(type(W=getopt(width))==1)
                   18233:                        L=madjust(L,W|null=Null);
                   18234:                LV=ltov(L);
                   18235:                S=length(LV);
                   18236: #if 1
                   18237:                if(type(T=getopt(left))==4){
                   18238:                        T=str_times(T,S);
                   18239:                        for(L=[],I=0;I<S;I++){
                   18240:                                L=cons(cons(car(T),LV[I]),L);
                   18241:                                T=cdr(T);
                   18242:                        }
                   18243:                        LV=reverse(L);
                   18244:                }
                   18245:                if(type(T=getopt(right))==4){
                   18246:                        T=str_times(T,S);
                   18247:                        for(L=[],I=0;I<S;I++){
                   18248:                                L=cons(append(LV[I],[car(T)]),L);
                   18249:                                T=cdr(T);
                   18250:                        }
                   18251:                        LV=reverse(L);
                   18252:                }
                   18253:                for(I=CS=0; I<S; I++)
                   18254:                        if(length(LV[I])>CS) CS=length(LV[I]);
                   18255:                if(type(T=getopt(top))==4){
                   18256:                        LV=cons(str_times(T,CS),vtol(LV));
                   18257:                        S++;
                   18258:                }
                   18259:                if(type(T=getopt(last))==4){
                   18260:                        LV=append(vtol(LV),[str_times(T,CS)]);
                   18261:                        S++;
                   18262:                }
                   18263: #else
                   18264:                for(I=CS=0; I<S; I++)
                   18265:                        if(length(LV[I])>CS) CS=length(LV[I]);
                   18266: #endif
                   18267:                if(type(Title=getopt(title))!=7) Title="";
                   18268:                if(type(Vline=getopt(vline))!=4) Vline=[0,CS];
                   18269:                else Vline=subst(Vline,z,CS);
                   18270:                for(VV=[],VT=Vline;VT!=[];VT=cdr(VT)){
                   18271:                        if(type(T=car(VT))==4 && T[1]>0){
                   18272:                                for(I=T[0];I<=CS;I+=T[1]) VV=cons(I,VV);
                   18273:                        }else VV=cons(T,VV);
                   18274:                }
                   18275:                Vline=qsort(VV);
                   18276:                Out=str_tb("\\begin{tabular}{",0);
                   18277:                if(type(Al=getopt(align))==7 && str_len(Al)>1){
                   18278:                        str_tb(Al,Out);
                   18279:                }else{
                   18280:                        if(type(Al)!=7 || str_len(Al)<1) Al="r";
                   18281:                        for(I=0;I<=CS;I++){
                   18282:                                if(I!=0) str_tb(Al,Out);
                   18283:                                while(Vline!=[] && car(Vline)==I){
                   18284:                                        str_tb("|",Out);
                   18285:                                        Vline=cdr(Vline);
                   18286:                                }
                   18287:                        }
                   18288:                }
                   18289:                str_tb("}",Out);
                   18290:                if(Title!="")
                   18291:                        str_tb("\n\\multicolumn{"+rtostr(CS)+"}{c}{"+Title+"}\\\\",Out);
                   18292:                if(type(Hline=getopt(hline))!=4) Hline=[0,S];
                   18293:                else Hline=subst(Hline,z,S);
                   18294:                for(VV=[],VT=Hline;VT!=[];VT=cdr(VT)){
                   18295:                        if(type(T=car(VT))==4 && T[1]>0){
1.14      takayama 18296:                                for(I=T[0];I<=S;I+=T[1]) VV=cons(I,VV);
1.6       takayama 18297:                        }else VV=cons(T,VV);
                   18298:                }
                   18299:                Hline=qsort(VV);
                   18300:                while(Hline!=[] && car(Hline)==0){
                   18301:                        str_tb(" \\hline\n",Out);
                   18302:                        Hline=cdr(Hline);
                   18303:                }
                   18304: /*
                   18305:                if(type(getopt(left))==4) CS++;
                   18306:                if(type(getopt(right))==4) CS++;
                   18307:                if(type(T=getopt(top))==4){
                   18308:                        LV=cons(str_times(T,CS),vtol(LV));
                   18309:                        S++;
                   18310:                }
                   18311:                if(type(T=getopt(last))==4){
                   18312:                        LV=append(vtol(LV),[str_times(T,CS)]);
                   18313:                        S++;
                   18314:                }
                   18315:                if(type(T=getopt(left))==4){
                   18316:                        T=str_times(T,S);
                   18317:                        for(L=[],I=0;I<S;I++){
                   18318:                                L=cons(cons(car(T),LV[I]),L);
                   18319:                                T=cdr(T);
                   18320:                        }
                   18321:                        LV=reverse(L);
                   18322:                }
                   18323:                if(type(T=getopt(right))==4){
                   18324:                        T=str_times(T,S);
                   18325:                        for(L=[],I=0;I<S;I++){
                   18326:                                L=cons(append(LV[I],[car(T)]),L);
                   18327:                                T=cdr(T);
                   18328:                        }
                   18329:                        LV=reverse(L);
                   18330:                }
                   18331: */
                   18332:                for(I=0; I<S; I++){
                   18333:                        for(C=0,LT=LV[I];C<CS; C++){
                   18334:                                if(LT!=[]){
                   18335:                                        P=car(LT);
                   18336:                                        if(type(P)!=7) P="$"+my_tex_form(P)+"$";
                   18337:                                        if(P!="") str_tb(P,Out);
                   18338:                                        LT=cdr(LT);
                   18339:                                }
                   18340:                                if(C<CS-1) str_tb("& ",Out);
                   18341:                        }
                   18342:                        str_tb("\\\\",Out);
                   18343:                        while(Hline!=[] && car(Hline)==I+1){
                   18344:                                str_tb(" \\hline",Out);
                   18345:                                Hline=cdr(Hline);
                   18346:                        }
                   18347:                        str_tb("\n",Out);
                   18348:                }
                   18349:                str_tb("\\end{tabular}\n",Out);
                   18350:        }else if(Op==11){       /* graph */
1.10      takayama 18351:                if(type(Strip=getopt(strip))!=1) Strip=0;
                   18352:                if(type(MX=getopt(max))!=1)  MX=0;
                   18353:                if(type(ML=getopt(mult))!=1) ML=0;
                   18354:                if((REL=getopt(relative))!=1) REL=0;
                   18355:                CL=getopt(color);
                   18356:                OL=delopt(getopt(),["color","strip","mult"]);
                   18357:                if(ML==1&&type(CL)==4){
                   18358:                        LL=L[1];L=L[0];K=length(L);S=T="";
                   18359:                        if(!MX){
                   18360:                                MX=vector(length(L[0]));
                   18361:                                for(LT=L;LT!=[];LT=cdr(LT)){
                   18362:                                        for(I=0,LTT=car(LT);LTT!=[];I++,LTT=cdr(LTT)){
                   18363:                                                if(REL==1) MX[I]+=car(LTT);
                   18364:                                                else if(MX[I]<car(LTT)) MX[I]=car(LTT);
                   18365:                                        }
                   18366:                                }
                   18367:                                MX=lmax(MX);
                   18368:                                OL=cons(["max",MX],OL);
                   18369:                        }
                   18370:                        if(REL==1) MX=newvect(length(L[0]));
                   18371:                        for(I=0;I<K;I++){
                   18372:                                for(R=[],J=length(L[I]);--J>=0;){
                   18373:                                        if(REL==1){
                   18374:                                                R=cons([MX[J],V=MX[J]+L[I][J]],R);
                   18375:                                                MX[J]=V;
                   18376:                                        }else R=cons([(!I)?0:L[I-1][J],L[I][J]],R);
                   18377:                                }
                   18378:                                OP=cons(["color",CL[I]],OL);
                   18379:                                S+=ltotex([R,LL]|option_list=cons(["value",0],cons(["strip",(!I)?1:2],OP)));
                   18380:                                T+=ltotex([R,LL]|option_list=cons(["strip",3],OP));
                   18381:                        }
                   18382:                        return(!Strip)?xyproc(S+T):(S+T);
                   18383:                }else if(!TikZ) CL=0;
                   18384:                if(type(Line=getopt(line))!=1){
                   18385:                        if(type(Line)==4){
                   18386:                                if(type(Line[0])==1 && (type(Line[1])==7 || type(Line[1])==1)){
                   18387:                                        Opt=Line[1]; Line=Line[0];
                   18388:                                }else if(ML==1){
                   18389:                                        OL=delopt(OL,"line");
                   18390:                                        LL=L[1];L=L[0];K=length(L);S="";
                   18391:                                        if(!MX){
1.15      takayama 18392:                                                MX=newvect(length(L[0]));
1.10      takayama 18393:                                                for(LT=L;LT!=[];LT=cdr(LT)){
                   18394:                                                        for(I=0,LTT=car(LT);LTT!=[];I++,LTT=cdr(LTT)){
                   18395:                                                                if(REL==1) MX[I]+=car(LTT);
                   18396:                                                                else if(MX[I]<car(LTT)) MX[I]=car(LTT);
                   18397:                                                        }
                   18398:                                                }
                   18399:                                                MX=lmax(MX);
                   18400:                                                OL=cons(["max",MX],OL);
                   18401:                                        }
1.15      takayama 18402:                                        for(I=0;I<K;I++)
                   18403:                                                S+=ltotex([L[I],LL]|option_list
1.10      takayama 18404:                                                        =cons(["line",Line[I]],cons(["strip",(!I)?1:2],OL)));
                   18405:                                        return(!Strip)?xyproc(S):S;
                   18406:                                }
                   18407:                        }else Line=0;
                   18408:                }else Opt="@{-}";
                   18409:                Width=8; Hight=3; WRet=1/2; HMerg=(getopt(horiz)==1)?0.3:0.2;
1.6       takayama 18410:                if(!TikZ){
1.7       takayama 18411:                        Width*=10; Hight*=10; HMerg*=10;
1.6       takayama 18412:                }
1.10      takayama 18413:                VMerg=HMerg;
                   18414:                if(type(Shift=getopt(shift))!=1)
                   18415:                        Shift=0;
1.6       takayama 18416:                if(type(V=getopt(size))==4){
                   18417:                        Width=V[0];Hight=V[1];
                   18418:                        if(length(V)>2) WRet=V[2];
1.10      takayama 18419:                        if(length(V)>3) VMerg=VMerg=V[3];
                   18420:                        if(length(V)>4) HMerg=V[4];
1.6       takayama 18421:                }
                   18422:                Val=getopt(value);
                   18423:                if(!isint(Val)) Val=-1;
                   18424:                if(type(Line=getopt(line))!=1){
                   18425:                        if(type(Line)==4 && type(Line[0])==1 && (type(Line[1])==7 || type(Line[1])==1)){
                   18426:                                Opt=Line[1]; Line=Line[0];
                   18427:                        }else   Line=0;
                   18428:                }else Opt="@{-}";
                   18429:                if(type(car(L))==4){
                   18430:                        LL=L[1]; L=L[0];
                   18431:                }else LL=[];
                   18432:                if(Line==-1){
                   18433:                        for(Sum=0, LT=L; LT!=[]; LT=cdr(LT)){
                   18434:                                if((S=car(LT))<=0) return 0;
                   18435:                                Sum+=S;
                   18436:                        }
1.16      takayama 18437:                        for(R=[],LT=L;LT!=[];LT=cdr(LT)) R=cons(car(LT)/Sum,R);
1.6       takayama 18438:                        R=reverse(R);
                   18439:                        Opt0=Opt*2/3;
1.10      takayama 18440:                        Out=str_tb((Strip>0)?0:xyproc(1),0);
1.16      takayama 18441:                        if(type(CL)!=4) str_tb(xylines(ptpolygon(6,Opt)|close=1,curve=1),Out);
1.6       takayama 18442:                        for(S=0,RT=R,LT=LL;RT!=[];RT=cdr(RT)){
1.16      takayama 18443:                                SS=S+RT[0];
                   18444:                                if(type(CL)==4){
                   18445:                                        str_tb(xyang(Opt,[0,0],(0.25-SS)*6.2832,(0.25-S)*6.2832|ar=1,opt=car(CL)),Out);
                   18446:                                        if(length(CL)>0) CL=cdr(CL);
                   18447:                                }else str_tb(xyline([0,0],[Opt*dsin(S*6.2832),Opt*dcos(S*6.2832)]),Out);
                   18448:                                T=(S+SS)/2;
                   18449:                                S=SS;
1.6       takayama 18450:                                if(LT!=[]){
1.16      takayama 18451:                                        str_tb(xyput([Opt0*dsin(T*6.2832),Opt0*dcos(T*6.2832),car(LT)]),Out);
1.6       takayama 18452:                                        LT=cdr(LT);
                   18453:                                }
                   18454:                        }
1.10      takayama 18455:                        if(!Strip) str_tb(xyproc(0),Out);
1.6       takayama 18456:                        return str_tb(0,Out);
                   18457:                }
                   18458:                if(MX==0){
                   18459:                        for(MX=0,LT=L; LT!=[]; LT=cdr(LT))
                   18460:                                if(car(LT)>MX) MX=car(LT);
                   18461:                }
                   18462:                MX-=Shift;
                   18463:                S=length(L);
                   18464:                WStep=Width/S;
                   18465:                WWStep=WStep*WRet;
1.10      takayama 18466:                HStep=(Hight<0)?-Hight:Hight/MX;
1.7       takayama 18467:                if(LL!=[]&&length(LL)==S-1) WS2=WStep/2;
                   18468:                else WS2=0;
1.10      takayama 18469:                Out=str_tb((Strip>0)?0:xyproc(1),0);
                   18470:                Hori=getopt(horiz);
                   18471:                if(Strip<2){
                   18472:                        if(Hori==1)  str_tb(xyline([0,0],[0,Width-WStep+WWStep]),Out);
                   18473:                        else str_tb(xyline([0,0],[Width-WStep+WWStep,0]),Out);
                   18474:                }
1.6       takayama 18475:                for(I=0,LT=L;LT!=[]; LT=cdr(LT),I++){
1.10      takayama 18476:                        XP=WStep*I; XPM=XP+WWStep/2;
                   18477:                        if(type(LTT=car(LT))==4){
                   18478:                                YP0=(car(LTT)-Shift)*HStep;YP=(LTT[1]-Shift)*HStep;
                   18479:                                VL=LTT[1];
                   18480:                                if(REL) VL-=LTT[0];
                   18481:                        }else{
                   18482:                                YP0=0;YP=(LTT-Shift)*HStep;VL=LTT;
                   18483:                        }
                   18484:                        if(Hori==1){
                   18485:                                if(Line!=0){
                   18486:                                        if(I>0)
                   18487:                                                str_tb(xyarrow([XPM,YP],[XPM-WStep,YPP]|opt=Opt),Out);
                   18488:                                        if(Val!=0)
                   18489:                                                str_tb(xyput([YP+HMerg, XPM,car(LT)]),Out);
                   18490:                                        if(Line==2)
                   18491:                                                str_tb(xyput([YP,XPM,"$\\bullet$"]),Out);
                   18492:                                        YPP=YP;
                   18493:                                }else if(YP!=0 || Val==1){
                   18494:                                        if(Strip!=3){
                   18495:                                                if(CL) str_tb(xybox([[YP,XP+WWStep], [YP0,XP]]|color=CL),Out);
                   18496:                                                else str_tb(xybox([[YP,XP+WWStep],[YP0,XP]]),Out);
                   18497:                                        }
                   18498:                                        if(Val!=0) str_tb(xyput([(YP<0||REL==1)?(YP-HMerg):(YP+HMerg),XPM,VL]),Out);
                   18499:                                }
                   18500:                                if(LL!=[]&&I<length(LL)&&Strip<2) str_tb(xyput([-VMerg,XPM+WS2,LL[I]]),Out);
                   18501:                        }else{
                   18502:                                if(Line!=0){
                   18503:                                        if(I>0)
                   18504:                                                str_tb(xyarrow([XPM-WStep,YPP],[XPM,YP]|opt=Opt),Out);
                   18505:                                        if(Val!=0)
                   18506:                                                str_tb(xyput([XPM,YP+HMerg,car(LT)]),Out);
                   18507:                                        if(Line==2)
                   18508:                                                str_tb(xyput([XPM,YP,"$\\bullet$"]),Out);
                   18509:                                        YPP=YP;
                   18510:                                }else if(YP!=0 || Val==1){
                   18511:                                        if(Strip!=3){
                   18512:                                                if(CL) str_tb(xybox([[XP,YP0],[XP+WWStep,YP]]|color=CL),Out);
                   18513:                                                else str_tb(xybox([[XP,YP0],[XP+WWStep,YP]]),Out);
                   18514:                                        }
                   18515:                                        if(Val!=0) str_tb(xyput([XPM,(YP<0||REL==1)?(YP-HMerg):(YP+HMerg),VL]),Out);
1.6       takayama 18516:                                }
1.10      takayama 18517:                                if(LL!=[]&&I<length(LL)&&Strip<2) str_tb(xyput([XPM+WS2,-VMerg,LL[I]]),Out);
1.6       takayama 18518:                        }
                   18519:                }
1.10      takayama 18520:                if(!Strip)str_tb(xyproc(0),Out);
1.6       takayama 18521:        }else if(Op==12){       /* coord */
                   18522:                Out=str_tb("(",0);
                   18523:                for(LT=L;;){
                   18524:                        X=car(LT);
                   18525:                        if(type(X)>3 || imag(X)==0)     str_tb(my_tex_form(X),Out);
                   18526:                        else{
                   18527:                                XR=real(X);XI=imag(X);
                   18528:                                S=monototex(imag(X));
                   18529:                                if(S=="1") S="";
                   18530:                                else if(S=="- 1") S="-";
                   18531:                                if(getopt(cpx)==2) S=S+"\\sqrt{-1}";
                   18532:                                else S=S+"i";
                   18533:                                if(XR!=0){
                   18534:                                        if(str_char(S,0,"-")==0) S=monototex(XR)+S;
                   18535:                                        else S=monototex(XR)+"+"+S;
                   18536:                                }
                   18537:                                str_tb(S,Out);
                   18538:                        }
                   18539:                        if((LT=cdr(LT))==[]) break;
                   18540:                        else str_tb(",",Out);
                   18541:                }
                   18542:                str_tb(")",Out);
                   18543:        }
                   18544:        else    return my_tex_form(L);
                   18545:        S = str_tb(0,Out);
                   18546:        return (getopt(small)==1)?smallmattex(S):S;
                   18547: }
                   18548:
                   18549:
                   18550: def str_tb(L,TB)
                   18551: {
                   18552:        if(type(TB) == 0) TB = "";
                   18553:        if(L == 0)
                   18554:                return (type(TB) == 7)?string_to_tb(TB):tb_to_string(TB);
                   18555:        if(type(L) == 7)
                   18556:                L = [L];
                   18557:        else if(type(L) != 4){
                   18558:                erno(0);
                   18559:                return 0;
                   18560:        }
                   18561:        if(type(TB) <= 7)
                   18562:                 TB = string_to_tb((type(TB)==7)?TB:"");
                   18563:        for(; L != []; L = cdr(L))
                   18564:                write_to_tb(car(L), TB);
                   18565:        return TB;
                   18566: }
                   18567:
                   18568: /*
                   18569: def redgrs(M,T)
                   18570: {
                   18571:        L = [zzz];
                   18572:        for(I=S=0,Eq=[],MT=M; MT!=[]; I++, MT=cdr(MT)){
                   18573:                for(J=LS=0, N=car(MT); N!=[]; N=cdr(N)){
                   18574:                        X = makev([z,I,z,J]);
                   18575:                        L=cons(X,L);
                   18576:                        LS += X;
                   18577:                        S += car(N)[1]*X;
                   18578:                }
                   18579:                Eq = cons(LS-zzz,Eq);
                   18580:        }
                   18581:        Eq = cons(S-T,Eq);
                   18582:        Sol= lnsol(Eq,L);
                   18583:        for(LS=[],S=Sol; S!=[]; S=cdr(S)){
                   18584:                T=car(S);
                   18585:                if(type(S)!=4) return 0;
                   18586:                LS=cons(car(S)[0],LS);
                   18587:        }
                   18588: }
                   18589: */
                   18590:
                   18591: /* T=0 : all reduction
                   18592:                =1 : construction procedure
                   18593:                =2 : connection coefficient
                   18594:                =3 : operator
                   18595:                =4 : series expansion
                   18596:                =5 : expression by TeX
                   18597:                =6 : Fuchs relation
                   18598:                =7 : All
                   18599:                =8 : basic
                   18600:                =9 : ""
                   18601:                =10: irreducible
                   18602:                =11: recurrence */
                   18603: def getbygrs(M, TT)
                   18604: {
                   18605:        /* extern TeXEq;        */
                   18606:
                   18607:        if(type(M)==7) M=s2sp(M);
                   18608:        if(type(M) != 4 || TT =="help"){
                   18609:                mycat(
                   18610: ["getbygrs(m,t) or getbygrs(m,[t,s_1,s_2,...]|perm=?,var=?,pt=?,mat=?)\n",
                   18611: " m: generalized Riemann scheme or spectral type\n",
                   18612: " t: reduction, construct, connection, series, operator, TeX, Fuchs, irreducible, basic, recurrence,\n",
                   18613: "    All\n",
                   18614: " s: TeX dviout simplify short general operator irreducible top0 x1 x2 sft\n",
                   18615: "Ex: getbygrs(\"111,21,111\", [\"All\",\"dviout\",\"operator\",\"top0\"])\n"]);
                   18616:                return 0;
                   18617:        }
                   18618:        if(type(TT) == 4){
                   18619:                T  = TT[0];
                   18620:                T1 = cdr(TT);
                   18621:        }else{
                   18622:                T  = TT;
                   18623:                T1 = [];
                   18624:        }
                   18625:        if(type(T) == 7)
                   18626:                T = findin(T,["reduction","construct","connection", "operator", "series",
                   18627:                         "TeX", "Fuchs", "All", "basic", "", "irreducible", "recurrence"]);
                   18628:        TeX   = findin("TeX", T1);
                   18629:        Simp  = findin("simplify", T1);
                   18630:        Short = findin("short", T1);
                   18631:        Dviout= findin("dviout", T1);
                   18632:        General=findin("general", T1);
                   18633:        Op     =findin("operator", T1);
                   18634:        Irr    =findin("irreducible", T1);
                   18635:        Top0   =findin("top0",T1);
                   18636:        X1     =findin("x1",T1);
                   18637:        X2     =findin("x2",T1);
                   18638:        Sft    =findin("sft",T1);
                   18639:        Title = getopt(title);
                   18640:        Mat   = getopt(mat);
                   18641:        if(Mat!=1 || T<0 ||(T!=0&&T!=1&&T!=5&&T!=6&&T!=8&&T!=10&&T!=9)) Mat = 0;
                   18642:        if(findin("keep",T1) >= 0)
                   18643:                Keep = Dviout = 1;
                   18644:        else Keep = 0;
                   18645:        if(Dviout >= 0 || T == 5) TeX = 1;
                   18646:        for(J = 0, MM = M; J == 0 && MM != []; MM = cdr(MM)){
                   18647:                for(MI = car(MM); MI != []; MI = cdr(MI)){
                   18648:                        if(type(car(MI)) != 1 || car(MI) <= 0){
                   18649:                                J = 1; break;
                   18650:                        }
                   18651:                }
                   18652:        }
                   18653:
                   18654:        /* spectral type -> GRS */
                   18655:        if(J == 0){
                   18656:                for(R = [], S = J = 0, MM = M; MM != []; MM = cdr(MM), J++){
                   18657:                        MT = qsort(car(MM));
                   18658:                        R = cons(reverse(MT), R);
                   18659:                        if(J == 1){
                   18660:                                S = length(MT)-1;
                   18661:                                if(MT[S] > MT[0]) S = 0;
                   18662:                        }
                   18663:                }
                   18664:                M = reverse(R);
                   18665:                R = getopt(var);
                   18666:                if(type(R)<1){
                   18667:                        for(R = [], I = J-1; I >= 0; I--)
                   18668:                                R = cons(asciitostr([97+I]), R);
                   18669:                }
                   18670:                Sft=(Sft>=0)?1:0;
                   18671:                if(General < 0)
                   18672:                        Sft=-Sft-1;
                   18673:                M = sp2grs(M,R,Sft|mat=Mat);
                   18674:        }
                   18675:        for(M0=[],MM=M;MM!=[];MM=cdr(MM)){      /* change "?" -> z_z */
                   18676:                for(M1=[],Mm=car(MM);Mm!=[];Mm=cdr(Mm)){
                   18677:                        Mt=car(Mm);
                   18678:                        if(type(Mt)==4 && Mt[1]=="?"){
                   18679:                                M1=cons([Mt[0],z_z],M1);
                   18680:                                continue;
                   18681:                        }else if(type(Mt)==7 && Mt=="?"){
                   18682:                                M1=cons(z_z,M1);
                   18683:                                continue;
                   18684:                        }
                   18685:                        M1=cons(Mt,M1);
                   18686:                }
                   18687:                M0=cons(reverse(M1),M0);
                   18688:        }
                   18689:        M = fspt(reverse(M0),5);  /* short -> long */
                   18690:        if(findin(z_z,vars(M))>=0)
                   18691:                M=subst(M,z_z,lsol(chkspt(M|mat=Mat)[3],z_z));  /* Fuchs relation */
                   18692:        NP = length(M);
                   18693:        Perm = getopt(perm);
                   18694:        if(type(Perm) == 4)
                   18695:                M = mperm(M,Perm,0);
                   18696:        if(T == 9){  /* "" */
                   18697:                if(Short >= 0)
                   18698:                        M = chkspt(M|opt=4,mat=Mat);
                   18699:                return M;
                   18700:        }
                   18701:        R = [0,M];
                   18702:        ALL = [R];
                   18703:
                   18704:        while(type(R = redgrs(R[1]|mat=Mat)) == 4)
                   18705:                ALL = cons(R, ALL);
                   18706:        if(R < 0)
                   18707:                return 0;
                   18708:
                   18709:        /* TeX */
                   18710:        if(TeX >= 0 && !chkfun("print_tex_form", "names.rr"))
                   18711:                return 0;
                   18712:        if(Dviout >= 0 && type(Title) == 7)
                   18713:                dviout(Title|keep=1);
                   18714:        if(T == 7 && Dviout >= 0){
                   18715:                S=["keep","simplify"];
                   18716:                if(Top0 >= 0)
                   18717:                        S = cons("top0",S);
                   18718:                getbygrs(M,cons(5,S)|title="\\noindent Riemann Scheme",mat=Mat);
                   18719:                Same = 0;
                   18720:                if(R > 0){
                   18721:                        MM = getbygrs(M,8|mat=Mat);    /* basic GRS */
                   18722:                        MS = chkspt(MM|opt=0,mat=Mat); /* spectral type */
                   18723:                        if(M != MM)
                   18724:                                 getbygrs(MM,cons(5,S)|title="Basic Riemann Scheme",mat=Mat);
                   18725:                        else{
                   18726:                                 dviout("This is a basic Riemann Scheme.\n\n\\noindent"|keep=1);
                   18727:                                 Same = 1;
                   18728:                        }
                   18729:                        dviout(MS|keep=1);
                   18730:                }
                   18731:                if(chkspt(ALL[0][1]|mat=Mat)[3] != 0)
                   18732:                        getbygrs(M,cons(6,S)|title="Fuchs condition",mat=Mat);
                   18733:                if(Same == 0){
                   18734:                        M1 = M[1];
                   18735:                        if(M1[length(M1)-1][0]==1 && Mat!=1){
                   18736:                                M1=M[2];
                   18737:                                if(M1[length(M1)-1][0] == 1){
                   18738:                                        getbygrs(M,cons(2,S)|title="Connection formula");
                   18739:                                        if(M1[length(M[0][0])-1][0] == 1 && R==0)
                   18740:                                                getbygrs(M,cons(11,S)|title="Recurrence relation shifting the last exponents at $\\infty$, 0, 1");
                   18741:                                }
                   18742:                                getbygrs(M,cons(1,S)|title="Integral representation");
                   18743:                                getbygrs(M,cons(4,S)|title="Series expansion");
                   18744:                        }
                   18745:                        if(Irr < 0){
                   18746:                                TI="Irreduciblity $\\Leftrightarrow$ any value of the following linear forms $\\notin\\mathbb Z$";
                   18747:                                if(R > 0)
                   18748:                                        TI += " + fundamental irreducibility";
                   18749:                                getbygrs(M,cons(10,S)|title=TI,mat=Mat);
                   18750:                                dviout("which coorespond to the decompositions"|keep=1);
                   18751:                                sproot(chkspt(M|opt=0),"pairs"|dviout=1,keep=1);
                   18752:                        }
                   18753:                }
                   18754:                if(Op >= 0 && Mat!=1) getbygrs(M,cons(3,S)|title="Operator");
                   18755:                dviout(" ");
                   18756:                return 1;
                   18757:        }
                   18758:        if(T == 0 && TeX >= 0){
                   18759:                T = 1; TeX = 16;
                   18760:        }
                   18761: /* Fuchs */
                   18762:        Fuc = chkspt(ALL[0][1]|Mat=mat)[3];
                   18763:        if(Fuc == 0) Simp = -1;
                   18764:        if(type(Fuc) == 1){
                   18765:                print("Violate Fuchs condition");
                   18766:                return 0;
                   18767:        }
                   18768:        if(T == 6){
                   18769:                if(Dviout >= 0) dviout(Fuc|eq=0,keep=Keep);
                   18770:                return (TeX >= 0)?my_tex_form(Fuc):Fuc;
                   18771:        }
                   18772:        Fuc = [Fuc];
                   18773: /* Generelized Riemann scheme */
                   18774:        if(T == 5){
                   18775:                M = ltov(M);
                   18776:                for(ML=0, I=0; I<NP; I++){
                   18777:                        L = length(M[I]);
                   18778:                        if(L > ML) ML = L;
                   18779:                }
                   18780:                Out = string_to_tb("P\\begin{Bmatrix}\nx=");
                   18781:                if(Top0 < 0)
                   18782:                        write_to_tb("\\infty & ",Out);
                   18783:                Pt = getopt(pt);
                   18784:                if(type(Pt) == 4){
                   18785:                        for(J = 3; J < NP; J++){
                   18786:                                str_tb(["& ",rtotex(car(Pt))],Out);
                   18787:                                Pt = cdr(Pt);
                   18788:                        }
                   18789:                }
                   18790:                else if(X2>=0)
                   18791:                        str_tb("0 & x_2",Out);
                   18792:                else
                   18793:                        str_tb((X1>=0)?"x_1 & x_2":"0 & 1",Out);
                   18794:                for(J = 3; J < NP; J++)
                   18795:                        str_tb(["& x_",rtotex(J)],Out);
                   18796:                if(Top0 >= 0)
                   18797:                        write_to_tb("& \\infty",Out);
                   18798:                write_to_tb("\\\\\n",Out);
                   18799:                for(I = 0; I < ML; I++){
                   18800:                        for(CC = 0, J = (Top0 >= 0)?1:0; ; J++, CC++){
                   18801:                                if(J == NP){
                   18802:                                        if(Top0 < 0) break;
                   18803:                                        J = 0;
                   18804:                                }
                   18805:                                if(length(M[J]) <= I){
                   18806:                                        if(CC > 0) write_to_tb(" & ",Out);
                   18807:                                }else if(M[J][I][0] <= 1){
                   18808:                                        if(M[J][I][0] == 0) str_tb(" & ",Out);
                   18809:                                        else
                   18810:                                                str_tb([(!CC)?" ":" & ", my_tex_form(M[J][I][1])], Out);
                   18811:                                }else{
                   18812:                                        str_tb([((!CC)?"[":" & ["), my_tex_form(M[J][I][1]),
                   18813:                                                (Mat==1)?"]_{":"]_{("],Out);
                   18814:                                        str_tb([my_tex_form(M[J][I][0]),(Mat==1)?"}":")}"],Out);
                   18815:                                }
                   18816:                                if(Top0 >= 0 && J == 0)
                   18817:                                        break;
                   18818:                        }
                   18819:                        if(I == 0)
                   18820:                                str_tb("&\\!\\!;x",Out);
                   18821:                        str_tb("\\\\\n",Out);
                   18822:                }
                   18823:                str_tb("\\end{Bmatrix}",Out);
                   18824:                Out = str_tb(0,Out);
                   18825:                if(Dviout >= 0)
                   18826:                        dviout(Out|eq=0,keep=Keep);
                   18827:                return Out;
                   18828:        }
                   18829:
                   18830: /* Reduction */
                   18831:        if(T == 0){
                   18832:                if(Simp >= 0)
                   18833:                        ALL = simplify(ALL,Fuc,4);
                   18834:                return reverse(ALL);
                   18835:        }
                   18836:        LA = length(ALL) - 1;
                   18837:        NP = length(ALL[0][1]);
                   18838:
                   18839: /* irreducible */
                   18840:        if(T == 10){
                   18841:                for(IR=[], I = 0; I < LA; I++){
                   18842:                        AI = ALL[I]; AIT = AI[1];
                   18843:                        K = AI[0][0];
                   18844:                        P = -AIT[0][K][1];
                   18845:                        P -= cterm(P);
                   18846:                        IR = cons(P, IR);
                   18847:                        for(J = 0; J < NP; J++){
                   18848:                                K = AI[0][J];
                   18849:                                for(L = length(AIT[J]) - 1; L >= 0 ; L--){
                   18850:                                        if(L == K || AIT[J][L][0] <= AIT[J][K][0])
                   18851:                                                continue;
                   18852:                                        P = AIT[J][L][1] - AIT[J][K][1];
                   18853:                                        Q = cterm(P);
                   18854:                                        if(dn(Q)==1)
                   18855:                                                P -= Q;
                   18856:                                        IR = cons(P,IR);
                   18857:                                }
                   18858:                        }
                   18859:                }
                   18860:                P=Fuc[0];
                   18861:                Q=cterm(P);
                   18862:                if(type(Q)==1 && dn(Q)==1){
                   18863:                        for(F=0,V=vars(P);V!=[];V=cdr(V)){
                   18864:                                R=mycoef(P,1,car(V));
                   18865:                                if(type(R)!=1 || Q%R!=0){
                   18866:                                        F=1; break;
                   18867:                                }
                   18868:                        }
                   18869:                        if(F==0){
                   18870:                                P-=Q;
                   18871:                                Simp=0;
                   18872:                        }
                   18873:                }
                   18874:                if(Simp >= 0){
                   18875:                        IR=simplify(IR,[P],4);
                   18876:                        for(R=[]; IR!=[]; IR=cdr(IR)){
                   18877:                                P=car(IR);
                   18878:                                Q=cterm(P);
                   18879:                                if(dn(Q)==1) P-=Q;
                   18880:                                R=cons(P,R);
                   18881:                        }
                   18882:                        IR=R;
                   18883:                }
                   18884:                for(R=[]; IR!=[]; IR=cdr(IR)){
                   18885:                        P=car(IR);
                   18886:                        if(str_len(rtostr(P)) > str_len(rtostr(-P)))
                   18887:                                P = -P;
                   18888:                        R = cons(P,R);
                   18889:                }
                   18890:                R = ltov(R);
                   18891: #ifdef USEMODULE
                   18892:                R = qsort(R,os_md.cmpsimple);
                   18893: #else
                   18894:                R = qsort(R,cmpsimple);
                   18895: #endif
                   18896:                R = vtol(R);
                   18897:                if(TeX >= 0){
                   18898:                        Out = string_to_tb("");
                   18899:                        for(I=L=K=0; R!=[]; R=cdr(R),I++){
                   18900:                                K1 = K;
                   18901:                                RS = my_tex_form(car(R));
                   18902:                                K = nmono(car(R));
                   18903:                                L += K;
                   18904:                                if(I){
                   18905:                                        if(K1 == K && L < 30)
                   18906:                                                str_tb("\\quad ",Out);
                   18907:                                        else{
                   18908:                                                L = K;
                   18909:                                                str_tb((TeXEq==5)?["\\\\%\n &"]:["\\\\%\n "],Out);
                   18910:                                        }
                   18911:                                }
                   18912:                                str_tb(RS,Out);
                   18913:                        }
                   18914:                        R = Out;
                   18915:                        if(Dviout>=0){
                   18916:                                dviout(R|eq=0,keep=Keep);
                   18917:                                return 1;
                   18918:                        }
                   18919:                }
                   18920:                return R;
                   18921:        }
                   18922:
                   18923:        AL = []; SS = 0;
                   18924:        for(I = 0; I <= LA; I++){
                   18925:                AI = ALL[I]; AIT = AI[1];  /* AIT: GRS */
                   18926:                if(I > 0){
                   18927:                        for(S = J = 0; J < NP; J++){
                   18928:                                GE = AIT[J][AI0[J]][1];
                   18929:                                S += GE;
                   18930:                                if(J == 0)
                   18931:                                        SS = [];
                   18932:                                else
                   18933:                                        SS = cons(GE,SS);
                   18934:                        }
                   18935:                        SS = cons(1-Mat-S, reverse(SS));
                   18936:                }
                   18937:                AI0 = AI[0];
                   18938:                AL = cons([SS, cutgrs(AIT)], AL);
                   18939:        }
                   18940:        AL = reverse(AL);
                   18941:        AD = newvect(NP);
                   18942:        ALT = AL[0][1];
                   18943:        for(J = 1; J < NP; J++){
                   18944:                /* AD[J] = ALT[J][0][1];   [J][?][1] <- [J][?][0]: max */
                   18945:                for(MMX=0, K = KM = length(ALT[J])-1; K >= 0; K--){
                   18946:                        if(MMX <= ALT[J][K][0]){
                   18947:                                 if(J == 1 && MMX == ALT[J][K][0])
                   18948:                                         continue;
                   18949:                                 KM = K;
                   18950:                                 MMX = ALT[J][K][0];
                   18951:                        }
                   18952:                }
                   18953:                AD[J] = ALT[J][KM][1];
                   18954:        }
                   18955:        AL = cdr(AL);
                   18956:        AL = cons([vtol(AD), ALT], AL);
                   18957:        AL = cons([0, mcgrs(ALT, [vtol(-AD)]|mat=Mat)], AL);
                   18958:        if(Simp >= 0 && T != 3)
                   18959:                AL = simplify(AL,Fuc,4);
                   18960: /* Basic */
                   18961:        if(T == 8){
                   18962:                ALT = AL[0][1];
                   18963:                if(TeX >= 0){
                   18964:                        if(Dviout >= 0){
                   18965:                                return getbygrs(ALT,["TeX","dviout","keep"]);
                   18966:                        }
                   18967:                        return getbygrs(ALT,"TeX");
                   18968:                }
                   18969:                if(Short >= 0)
                   18970:                        ALT = chkspt(ALT|opt=4);
                   18971:                return ALT;
                   18972:        }
                   18973:
                   18974: /* Construct */
                   18975:        if(T == 1){
                   18976:                if(TeX >= 0){
                   18977:                        L = length(AL);
                   18978:                        I = Done = 0; Out0=Out1=""; NM = DN = [];
                   18979:                        if(TeX != 16){
                   18980:                                AL11=AL[L-1][1][1];
                   18981:                                AT = AL11[length(AL11)-1];
                   18982:                                if(type(AT) == 4){
                   18983:                                        PW = (AT[0] > 1)?"":AT[1];
                   18984:                                }else PW = AT;
                   18985:                        }
                   18986:                        Out = string_to_tb("");
                   18987:                        while(--L >= 0){
                   18988:                                if(TeX == 16){
                   18989:                                        if(Done)
                   18990:                                                write_to_tb(":\\ ", Out);
                   18991:                                        write_to_tb(getbygrs(AL[L][1],(Top0>=0)?["TeX", "top0"]:"TeX"|mat=Mat), Out);
                   18992:                                        Done = 1;
                   18993:                                        if(L != 0) write_to_tb((TeXEq==5)?
                   18994:                                                "\\\\%\n&\\leftarrow ":"\\\\%\n\\leftarrow ", Out);
                   18995:                                }
                   18996:                                ALT = AL[L][0];
                   18997:                                if(TeX != 16){
                   18998:                                        V1 = (I==0)?"x":V2;
                   18999:                                        V2 = /* (I==0 && L<=2)?"s": */
                   19000:                                                 "s_"+rtotex(I);
                   19001:                                }else V1=V2="x";
                   19002:                                JJ = (type(ALT) == 4)?length(ALT):0;
                   19003:                                if(I > 0 && L > 0)
                   19004:                                        write_to_tb("\n ", Out);
                   19005:                                for(Outt = "", J = 1; J < JJ; J++){
                   19006:                                        if(ALT[J] == 0) continue;
                   19007:                                        if(J == 1)      Outt += V1;
                   19008:                                        else if(J == 2) Outt += "(1-"+V1+")";
                   19009:                                        else            Outt += "(x_"+rtotex(J)+"-"+V1+")";
                   19010:                                        Outt += "^"+ rtotex(ALT[J]);
                   19011:                                }
                   19012:                                if(TeX != 16) write_to_tb(Outt, Out);
                   19013:                                else if(Outt != "")
                   19014:                                        str_tb(["\\mathrm{Ad}\\Bigl(",Outt,"\\Bigr)"], Out);
                   19015:                                if(JJ == 0){
                   19016:                                        if(I != 0)
                   19017:                                                Out1 = "ds_"+rtotex(I-1)+Out1;
                   19018:                                        continue;
                   19019:                                }
                   19020:                                if(ALT[0] == 0) continue;
                   19021:                                Out0 += "\\int_p^{"+V1+"}";
                   19022:                                if(TeX == 16)
                   19023:                                        str_tb(["mc_",rtotex(ALT[0])], Out);
                   19024:                                else{
                   19025:                                        str_tb(["(",V1,"-",V2,")^",rtotex(-1+ALT[0])], Out);
                   19026:                                        AL11=AL[L-1][1][1];
                   19027:                                        AT = AL11[length(AL11)-1];
                   19028:                                        if(type(AT) == 4) AT = AT[1];
                   19029:                                        DN = cons(ALT[0]+AT+1,DN);
                   19030:                                        NM = cons(AT+1,cons(ALT[0],NM));
                   19031:                                }
                   19032:                                if(L != 2) Out1 += "d"+V2;
                   19033:                                I++;
                   19034:                        }
                   19035:                        if(R){
                   19036:                                if(I == 0) Ov = "x";
                   19037:                                else Ov = "s_"+rtotex(I-1);
                   19038:                                Out1 = "u_B("+Ov+")"+Out1;
                   19039:                        }
                   19040:                        if(TeX != 16){
                   19041:                                Out0 = string_to_tb(Out0);
                   19042:                                str_tb([Out, Out1], Out0);
                   19043:                                Out = Out0;
                   19044:                                NM = simplify(NM, Fuc, 4);
                   19045:                                DN = simplify(DN, Fuc, 4);
                   19046:                                DNT = lsort(NM,DN,"reduce");
                   19047:                                NMT = DNT[0]; DNT = DNT[1];
                   19048:                                if(NMT != [] && PW != ""){
                   19049:                                        write_to_tb((TeXEq==5)?"\\\\\n &\\sim\\frac{\n"
                   19050:                                                :"\\\\\n \\sim\\frac{\n", Out);
                   19051:                                        for(PT = NMT; PT != []; PT = cdr(PT))
                   19052:                                                str_tb(["  \\Gamma(",my_tex_form(car(PT)), ")\n"], Out);
                   19053:                                        write_to_tb(" }{\n", Out);
                   19054:                                        for(PT = DNT; PT != []; PT = cdr(PT))
                   19055:                                                write_to_tb("  \\Gamma("+my_tex_form(car(PT))+")\n", Out);
                   19056:                                        write_to_tb(" }", Out);
                   19057:                                        if(R > 0) write_to_tb("C_0", Out);
                   19058:                                        write_to_tb("x^"+rtotex(PW) +"\\ \\ (p=0,\\ x\\to0)", Out);
                   19059:                                }
                   19060:                        }else
                   19061:                                Out = str_tb(0, Out);
                   19062:                        if(Dviout >= 0){
                   19063:                                dviout(Out|eq=0,keep=Keep);
                   19064:                                return 1;
                   19065:                        }
                   19066:                        return O;
                   19067:                }
                   19068:                if(Short >= 0){
                   19069:                        for(ALL = [] ; AL != []; AL = cdr(AL)){
                   19070:                                 AT = car(AL);
                   19071:                                 ALL = cons([AT[0], chkspt(AT[1]|opt=4)], ALL);
                   19072:                        }
                   19073:                        AL = reverse(ALL);
                   19074:                }
                   19075:                return AL;  /* AL[0][1] : reduced GRS, R==0 -> rigid */
                   19076:        }
                   19077:
                   19078:        if(T == 2 || T == 4 || T == 11){
                   19079:                for(I = (T==2)?2:1; I >= (T==11)?0:1; I--){
                   19080:                        ALT = M[I];
                   19081:                        if(ALT[length(ALT)-1][0] != 1){
                   19082:                                mycat(["multiplicity for",I,":",ALT[length(ALT)-1][1],
                   19083:                                        "should be 1"]);
                   19084:                                return;
                   19085:                        }
                   19086:                }
                   19087:        }
                   19088:        LA++;
                   19089:        NM = DN = [];
                   19090:
                   19091: /* Three term relation */
                   19092:        if(T == 11){
                   19093:                if(R > 0){
                   19094:                        print("This is not rigid\n");
                   19095:                        return 0;
                   19096:                }
                   19097:                for(I = 0; I <= LA; I++){
                   19098:                        if(I > 0){
                   19099:                                AI = AL[I][0];  /* operation */
                   19100:                                if(AI[0] != 0){
                   19101:                                        DN = cons(simplify(AI1+1,Fuc,4),DN);
                   19102:                                        NM = cons(simplify(AI1+AI[0]+1,Fuc,4),NM);
                   19103:                                }
                   19104:                        }
                   19105:                        ALT = AL[I][1][1]; AI1 = ALT[length(ALT)-1][1];
                   19106:                }
                   19107:                DNT = lsort(NM,DN,"reduce");
                   19108:                if(TeX < 0) return DNT;
                   19109:                NMT = DNT[0]; DNT = DNT[1];
                   19110:                Out = str_tb("u_{0,0,0}-u_{+1,0,-1}=\\frac{","");
                   19111:                for(PT = NMT; PT != []; PT = cdr(PT))
                   19112:                        str_tb(["(",my_tex_form(car(PT)),")"], Out);
                   19113:                str_tb(["}\n{"],Out);
                   19114:                for(PT = DNT; PT != []; PT = cdr(PT))
                   19115:                        str_tb(["(",my_tex_form(car(PT)),")"], Out);
                   19116:                write_to_tb("}u_{0,+1,-1}",Out);
                   19117:                if(Dviout >= 0){
                   19118:                        dviout(Out|eq=0,keep=Keep);
                   19119:                        return 1;
                   19120:                }
                   19121:                return Out;
                   19122:        }
                   19123:
                   19124:        AD=newvect(NP);
                   19125:        for(I = 0; I <= LA; I++){
                   19126:                if(I > 0){
                   19127:                        AI = AL[I][0];  /* operation */
                   19128:                        if(T == 2 && AI[0] != 0){
                   19129:                                DN = cons(simplify(-AI2,Fuc,4), cons(simplify(AI1+1,Fuc,4),DN));
                   19130:                                NM = cons(simplify(-AI2-AI[0],Fuc,4), cons(simplify(AI1+AI[0]+1,Fuc,4),
                   19131:                                 NM));
                   19132:                        }
                   19133:                        for(J = 1; J < NP; J++)
                   19134:                                AD[J] += simplify(AI[J],Fuc,4);
                   19135:                }
                   19136:                if(T == 2){
                   19137:                        ALT = AL[I][1][1]; AI1 = ALT[length(ALT)-1][1];
                   19138:                        ALT = AL[I][1][2]; AI2 = ALT[length(ALT)-1][1];
                   19139:                        if(I == 0){
                   19140:                                 C3 = AI1; C4 = AI2;
                   19141:                        }
                   19142:                }
                   19143:        }
                   19144:
                   19145: /* Connection */
                   19146:        if(T == 2){
                   19147:                DNT = lsort(NM,DN,"reduce");
                   19148:                NMT = DNT[0]; DNT = DNT[1];
                   19149:                if(TeX < 0) return [NMT,DNT,AD];
                   19150:                C0 = M[1][length(M[1])-1][1];
                   19151:                C1 = M[2][length(M[2])-1][1];
                   19152:                M =  AL[0][1];
                   19153:                C3 = M[1][length(M[1])-1][1];
                   19154:                C4 = M[2][length(M[2])-1][1];
                   19155:                Out = str_tb(["c(0\\!:\\!", my_tex_form(C0),
                   19156:                        " \\rightsquigarrow 1\\!:\\!", my_tex_form(C1),")"], "");
                   19157:                if(R > 0 && AMSTeX == 1 && (TeXEq == 4 || TeXEq == 5)){
                   19158:                        write_to_tb("\\\\\n", Out);
                   19159:                        if(TeXEq == 5) write_to_tb(" &", Out);
                   19160:                }
                   19161:                write_to_tb("=\\frac{\n",Out);
                   19162:                for(PT = NMT; PT != []; PT = cdr(PT))
                   19163:                        write_to_tb("  \\Gamma("+my_tex_form(car(PT))+")\n", Out);
                   19164:                write_to_tb(" }{\n",Out);
                   19165:                for(PT = DNT; PT != []; PT = cdr(PT))
                   19166:                        write_to_tb("  \\Gamma("+my_tex_form(car(PT))+")\n",Out);
                   19167:                write_to_tb(" }", Out);
                   19168:                for(J = 3; J < length(AD); J++){
                   19169:                        if(AD[J] == 0) continue;
                   19170:                        str_tb(["\n (1-x_", rtotex(J), "^{-1})^", rtotex(AD[J])], Out);
                   19171:                }
                   19172:                if(R != 0)
                   19173:                        str_tb(["\n c_B(0\\!:\\!", my_tex_form(C3),
                   19174:                                " \\rightsquigarrow 1\\!:\\!", my_tex_form(C4), ")"], Out);
                   19175:                Out = tb_to_string(Out);
                   19176:                if(Dviout >= 0){
                   19177:                        dviout(Out|eq=0,keep=Keep);
                   19178:                        return 1;
                   19179:                }
                   19180:                return Out;
                   19181:        }
                   19182:
                   19183: /*  Series */
                   19184:        if(T == 4){
                   19185:                AL11 = AL[0][1][1];
                   19186:                V = AL11[length(AL11)-1][1];
                   19187:                S00 = -V; S01 = (R==0)?[]:[[0,0]];
                   19188:                S1 = S2 = [];
                   19189:                for(Ix = 1, ALL = cdr(AL); ALL != []; ){
                   19190:                        ALT = ALL[0][0];
                   19191:                        if(ALT[0] != 0){ /* mc */
                   19192:                                for(Sum = [], ST = S01; ST != []; ST = cdr(ST))
                   19193:                                        Sum = cons(car(ST)[0], Sum);
                   19194:                                S1 = cons(cons(S00+1,Sum), S1);
                   19195:                                S2 = cons(cons(S00+1+ALT[0],Sum),S2);
                   19196:                                S00 += ALT[0];
                   19197:                        }
                   19198:                        ALL = cdr(ALL);
                   19199:                        for(I = 1; I < length(ALT); I++){  /* addition */
                   19200:                                if(I == 1){
                   19201:                                        S00 += ALT[1];
                   19202:                                        if(ALL == [])
                   19203:                                                S00 = [S00];
                   19204:                                }else{
                   19205:                                        if(ALT[I] == 0)
                   19206:                                                continue;
                   19207:                                        if(ALL != []){
                   19208:                                                S1 = cons([-ALT[I],Ix],S1);
                   19209:                                                S2 = cons([1,Ix],S2);
                   19210:                                                S01= cons([Ix,I],S01);
                   19211:                                                Ix++;
                   19212:                                        }else
                   19213:                                                S00 = cons([ALT[I],I],S00);
                   19214:                                }
                   19215:                        }
                   19216:                }
                   19217:                S00 = reverse(S00);
                   19218:                S01 = qsort(S01); S1 = qsort(S1); S2 = qsort(S2);
                   19219:                if(Simp >= 0){
                   19220:                         S00 = simplify(S00,Fuc,4);
                   19221:                         S01 = simplify(S01,Fuc,4);
                   19222:                         S1  = simplify(S1,Fuc,4);
                   19223:                         S2  = simplify(S2,Fuc,4);
                   19224:                         SS  = lsort(S1,S2,"reduce");
                   19225:                         S1 = SS[0]; S2 = SS[1];
                   19226:                }
                   19227:
                   19228:                if(TeX >= 0){
                   19229:                                                 /* Top linear power */
                   19230:                        TOP = Ps = Sm = "";
                   19231:                        for(TOP = Ps = Sm = "", ST = cdr(S00); ST != []; ST = cdr(ST)){
                   19232:                                SP = car(ST);
                   19233:                                if(SP[0] != 0){
                   19234:                                        if(SP[1] == 2)
                   19235:                                                TOP += "(1-x)^"+rtotex(SP[0]);
                   19236:                                        else
                   19237:                                                TOP += "(1-x/x_"+rtotex(SP[1])+")^"+rtotex(SP[0]);
                   19238:                                }
                   19239:                        }
                   19240:                                                 /* Top power */
                   19241:                        PW = my_tex_form(car(S00));
                   19242:                        if(PW == "0")
                   19243:                                PW = "";
                   19244:                        NP = length(AL[0][1]);
                   19245:                        PWS = newvect(NP);
                   19246:                        for(I = 0; I < NP; I++)
                   19247:                                PWS[I] = "";
                   19248:                        for(S = S01, I = 0; S != []; S = cdr(S), I++){
                   19249:                                SI = rtotex(car(S)[0]);
                   19250:                                if(I > 0) Sm += ",\\ ";
                   19251:                                Sm += "n_"+SI+"\\ge0";
                   19252:                                if(PW != "")
                   19253:                                        PW += "+";
                   19254:                                PW += "n_"+SI;
                   19255:                                if(car(S)[1] > 2)
                   19256:                                        PWS[car(S)[1]] += "-n_"+rtotex(car(S)[0]);
                   19257:                                else if(car(S)[1] == 0)
                   19258:                                        Ps = "C_{n_0}"+Ps;
                   19259:                        }
                   19260:                        for(I = 3; I < NP; I++){
                   19261:                                if(PWS[I] != "")
                   19262:                                        Ps += "x_"+rtotex(I)+"^{"+PWS[I]+"}";
                   19263:                        }
                   19264:                        Out = str_tb([TOP, Ps, "x^{", PW, "}"], "");
                   19265:                                 /* Gamma factor */
                   19266:                        for(I = 0, SS = S1; I <= 1; I++, SS = S2){
                   19267:                                PW = string_to_tb("");
                   19268:                                for(PW1=""; SS != [] ; SS = cdr(SS)){
                   19269:                                        for(J = 0, SST = car(SS); SST != [];  SST = cdr(SST), J++){
                   19270:                                                if(J == 0){
                   19271:                                                        JJ = (car(SST) == 1)?((length(SST)==2)?(-1):0):1;
                   19272:                                                        if(JJ > 0)
                   19273:                                                                str_tb(["(", my_tex_form(car(SST)), ")_{"], PW);
                   19274:                                                        else if(JJ == 0)
                   19275:                                                                PW1 = "(";
                   19276:                                                }else{
                   19277:                                                        if(JJ > 0){
                   19278:                                                                if(J > 1) write_to_tb("+", PW);
                   19279:                                                                str_tb(["n_", rtotex(car(SST))], PW);
                   19280:                                                        }else{
                   19281:                                                                if(J > 1) PW1 += "+";
                   19282:                                                                PW1 += "n_"+rtotex(car(SST));
                   19283:                                                        }
                   19284:                                                }
                   19285:                                        }
                   19286:                                        if(JJ > 0) write_to_tb("}", PW);
                   19287:                                        else PW1 += (JJ == 0)?")!":"!";
                   19288:                                }
                   19289:                                if(I == 0)
                   19290:                                        Out0 = "\\frac";
                   19291:                                Out0 += "{"+tb_to_string(PW)+PW1+"}";
                   19292:                                PW = string_to_tb(""); PW1 = "";
                   19293:                        }
                   19294:                        if(Out0 == "\\frac{}{}")
                   19295:                                Out0 = "";
                   19296:                        Out = "\\sum_{"+Sm+"}"+Out0 + Top + tb_to_string(Out);
                   19297:                        if(length(S01) == 1){
                   19298:                                Out = str_subst(Out, "{n_"+SI+"}", "n");
                   19299:                                Out = str_subst(Out, "n_"+SI, "n");
                   19300:                        }
                   19301:                        if(Dviout >= 0)
                   19302:                                dviout(Out|eq=0,keep=Keep);
                   19303:                        return Out;
                   19304:                }
                   19305:                return [cons(S00, S01), S1, S2];
                   19306:        }
                   19307:
                   19308: /* Operator */
                   19309:        if(T==3){
                   19310:                Fuc0 = car(Fuc);
                   19311:                if(Fuc0 != 0){  /* Kill Fuchs relation */
                   19312:                        for(V = vars(Fuc0); V != []; V = cdr(V)){
                   19313:                                VT = car(V);
                   19314:                                if(deg(Fuc0,VT) == 1){
                   19315:                                        AL = mysubst(AL, [VT, -red(coef(Fuc0,0,VT)/coef(Fuc0,1,VT))]);
                   19316:                                        break;
                   19317:                                }
                   19318:                        }
                   19319:                        if(V == []){
                   19320:                                print("Fuchs condition has no variable with degree 1");
                   19321:                                return 0;
                   19322:                        }
                   19323:                }
                   19324:                L = newvect(NP);
                   19325:                Pt = getopt(pt);
                   19326:                for(I = NP-1; I >= 1; I--){
                   19327:                        if(type(Pt) == 4)
                   19328:                                L[I] = Pt[I-1];
                   19329:                        else if(I >= 3 || X1 >= 0 || (X2 >= 0 && I >= 2))
                   19330:                                L[I] = makev(["x_", I]);
                   19331:                        else L[I] = I-1;
                   19332:                }
                   19333:                if(R){  /* non-rigid basic */
                   19334:                        MM = AL[0][1];  /* Riemann scheme */
                   19335:                        for(OD = 0, MT = car(MM); MT != []; MT = cdr(MT))
                   19336:                                OD += car(MT)[0];
                   19337:                        for(V = DN = [], M = MM; M != []; M = cdr(M)){
                   19338:                                MT = car(M);  /* exponents */
                   19339:                                for(K = KM = 0, NT = []; ; K++){
                   19340:                                        for(J = 0, P = 1, MTT = MT; MTT != []; MTT = cdr(MTT)){
                   19341:                                                if(J == 0 && car(MTT)[1] == 0)
                   19342:                                                        KM = car(MTT)[0];
                   19343:                                                for(KK = car(MTT)[0] - K -1; KK >= 0;  KK--)
                   19344:                                                        P *= (dx-car(MTT)[1]-KK);
                   19345:                                        }
                   19346:                                        if(P == 1) break;
                   19347:                                        NT = cons(P,NT);
                   19348:                                }
                   19349:                                V = cons(reverse(NT), V);
                   19350:                                DN = cons(KM, DN);
                   19351:                        }
                   19352:                        V  = ltov(reverse(V));   /* conditions for GRS */
                   19353:                        DN = ltov(reverse(DN));  /* dims of local hol. sol. */
                   19354:                        for(J = OD; J >= 0; J--){
                   19355:                                for(I = Q = 1; I < NP; I++){
                   19356:                                        if(J > DN[I])
                   19357:                                                Q *= (x-L[I])^(J-DN[I]);
                   19358:                                }
                   19359:                                K = mydeg(Q,x);
                   19360:                                if(J == OD){
                   19361:                                        P = Q*dx^J;
                   19362:                                        DM = K;
                   19363:                                }else{
                   19364:                                        for(I = DM-OD+J-K; I >= 0; I--){
                   19365:                                                X = makev(["r",J,"_",I]);
                   19366:                                                P += Q*x^I*X*dx^J;
                   19367:                                        }
                   19368:                                }
                   19369:                        }
                   19370:                        for(R = [], I = 0; I < NP; I++){
                   19371:                                Q = toeul(P, [x,dx], (I==0)?"infty":L[I]);  /* Euler at I-th pt */
                   19372:                                for(VT = V[I], J=0; VT != [] ; VT = cdr(VT), J++){
                   19373:                                         if(car(VT) != 0)
                   19374:                                                 R = cons(rpdiv(coef(Q,J,x), car(VT), dx)[0], R); /* equations */
                   19375:                                }
                   19376:                        }
                   19377:                        for(RR = RRR = [], I = OD-1; I>=0; I--){
                   19378:                                 RR = [];
                   19379:                                 for(RT = R; RT != [] ; RT = cdr(RT)){
                   19380:                                         if( (VT = mycoef(car(RT), I, dx)) != 0)
                   19381:                                                 RR = cons(VT, RR);   /* real linear eqs */
                   19382:                                 }
                   19383:                                 J = mydeg(mycoef(P,I,dx),x);
                   19384:                                 for(S = 0, VVV = []; J >= 0; J--){
                   19385:                                         X = makev(["r",I,"_",J]);
                   19386:                                         VVV = cons(X, VVV);     /* unknowns */
                   19387:                                 }
                   19388:                                 RR = lsol(RR,VVV);
                   19389:                                 LN = length(RR);
                   19390:                                 for(K=0; K<LN; K++){
                   19391:                                         RRT = RR[K];
                   19392:                                         if(type(RRT) != 4) continue;
                   19393:                                         R = mysubst(R,RRT);
                   19394:                                         P = mysubst(P,RRT);
                   19395:                                 }
                   19396:                        }
                   19397:                }else  /* Rigid case */
                   19398:                        P = dx^(AL[0][1][0][0][0]);
                   19399:  /* additions and middle convolutions */
                   19400:                for(ALT = AL; ALT != []; ALT = cdr(ALT)){
                   19401:                        AI = car(ALT)[0];
                   19402:                        if(type(AI) != 4) continue;
                   19403:                        V = ltov(AI);
                   19404:                        if(V[0] != 0) P = mc(P,x,V[0]);
                   19405:                        for(I = 1; I < NP; I++){
                   19406:                                if(V[I] != 0)
                   19407:                                        P = sftexp(P,x,L[I],-V[I]);
                   19408:                        }
                   19409:                }
                   19410:                P = (Simp>=0)? simplify(P,Fuc,4|var=[dx]):simplify(P,Fuc,4);
                   19411:                if(TeX >= 0){
                   19412:                        Val = 1;
                   19413:                        if(mydeg(P,dx) > 2 && AMSTeX == 1 && TeXEq > 3)
                   19414:                                Val = (TeXEq==5)?3:2;
                   19415:                        Out = fctrtos(P|var=[dx,"\\partial"],TeX=Val);
                   19416:                        if(Dviout < 0) return Out;
                   19417:                        dviout(Out|eq=0,keep=Keep);
                   19418:                        return 1;
                   19419:                }
                   19420:                return P;
                   19421:        }
                   19422:        return 0;
                   19423: }
                   19424:
                   19425: def mcop(P,M,S)
                   19426: {
                   19427:        for(V=[],ST=S;ST!=[];ST=cdr(ST))
                   19428:                if(isvar(VT=car(ST))) V=cons(vweyl(VT),V);
                   19429:        V=reverse(V);
                   19430:        N=length(V);
                   19431:        for(MT=M;MT!=[];MT=cdr(MT)){
                   19432:                T=car(MT);
                   19433:                if(T[0]!=0)
                   19434:                        P=mc(P,V[0],T[0]);
                   19435:                for(TT=cdr(T),ST=cdr(S);ST!=[];TT=cdr(TT),ST=cdr(ST))
                   19436:                        if(car(TT)!=0) P=sftpexp(P,V,S[0]-ST[0],-car(TT));
                   19437:        }
                   19438:        return P;
                   19439: }
                   19440:
                   19441: /* option: zero, all, raw */
                   19442: def shiftop(M,S)
                   19443: {
                   19444:        if(type(M)==7)  M=s2sp(M);
                   19445:        if(type(S)==7)  S=s2sp(S);
                   19446:        Zero=getopt(zero);
                   19447:        NP=length(M);
                   19448:        for(V=L=[],I=NP-1; I>=0; I--){
                   19449:                V=cons(strtov(asciitostr([97+I])),V);
                   19450:                if(I>2) L=cons(makev(["y_", I-1]),L);
                   19451:                else L=cons(I-1,L);
                   19452:        }
                   19453:        if(type(M[0][0])==4){
                   19454:                F=1;RS=M;SS=S;
                   19455:                R=chkspt(M);
                   19456:                if(R[2]!=2 || R[3]!=0){
                   19457:                        mycat("GRS is not valid!");return 0;
                   19458:                }
                   19459:                for(; S!=[]; S=cdr(S)){
                   19460:                        if(nmono(S[0][0])!=1) break;
                   19461:                        if(isint(S[0][1]-S[0][0])==0) break;
                   19462:                }
                   19463:                if(S!=[]){
                   19464:                        mycat("Error in shift!"); return 0;
                   19465:                }
                   19466:        }else{
                   19467:                F=0;
                   19468:                RS=sp2grs(M,V,[1,length(M[0]),1]);
                   19469:                for(SS=S0=[],I=0; I<NP; I++){
                   19470:                        for(J=F=0; J<length(M[I]); J++){
                   19471:                                if(I==0 && J==length(M[0])-1) break;
                   19472:                                if((U=S[I][J])!=0){
                   19473:                                        if(isint(U)!=1){
                   19474:                                                mycat("Error in shift!"); return 0;
                   19475:                                        }
                   19476:                                        VT=RS[I][J][1];
                   19477:                                        SS=cons([VT,VT+U],SS);
                   19478:                                }else if(I>0 && Zero==1 && F==0){
                   19479:                                        RS=mysubst(RS,[RS[I][J][1],0]);
                   19480:                                        F=J+1;
                   19481:                                }
                   19482:                        }
                   19483:                        if((F>0 && J==2) || (I==0 && J==1)){
                   19484:                                J=(I==0)?0:2-F; VT=RS[I][J][1];
                   19485:                                S0=cons([VT,strtov(asciitostr([strtoascii(rtostr(VT))[0]]))],S0);
                   19486:                        }
                   19487:                }
                   19488:        }
                   19489:        RS1=mysubst(RS,SS);
                   19490:        if(F==1){
                   19491:                R=chkspt(RS1);
                   19492:                if(R[2]!=2 || R[3]!=0){
                   19493:                        mycat("Error in shift!");
                   19494:                        return 0;
                   19495:                }
                   19496:        }
                   19497:        R=getbygrs(RS,1); R1=getbygrs(RS1,1);
                   19498:        RT=R[0][1][0];
                   19499:        if(length(RT)!=1 || RT[0][0]!=1){
                   19500:                mycat("Not rigid!");
                   19501:                return 0;
                   19502:        }
                   19503:        P=dx;Q=Q1=1;
                   19504:        for(RT = R, RT1=R1; RT != []; RT = cdr(RT), RT1=cdr(RT1)){
                   19505:                V=car(RT)[0]; V1=car(RT1)[0];
                   19506:                if(type(V) != 4) continue;
                   19507:
                   19508:                if(V[0] != 0){
                   19509:                        P = mc(P,x,V[0]);  /* middle convolution */
                   19510:                        QT = mc(Q,x,V[0]);
                   19511:                }else QT=Q;
                   19512:                D0=mydeg(Q,dx);D0T=mydeg(QT,dx);
                   19513:                C0=red(mycoef(Q,D0,dx)/mycoef(QT,D0T,dx));
                   19514:                if(C0!=1) QT=red(C0*QT);
                   19515:
                   19516:                if(V1[0] != 0) Q1T = mc(Q1,x,V1[0]);
                   19517:                else Q1T=Q1;
                   19518:                D1=mydeg(Q1,dx);D1T=mydeg(Q1T,dx);
                   19519:                C1=red(mycoef(Q1,D1,dx)/mycoef(Q1T,D1T,dx));
                   19520:                if(C1!=1) Q1T=red(C1*Q1T);
                   19521:                DD=(V[0]-V1[0])+(D0-D0T)-(D1-D1T);
                   19522:                if(DD>0){
                   19523:                        QT=muldo(dx^DD,QT,[x,dx]);
                   19524:                        D0T+=DD;
                   19525:                }else if(DD<0){
                   19526:                        Q1T=muldo(dx^(-DD),Q1T,[x,dx]);
                   19527:                        D1T-=DD;
                   19528:                }
                   19529:                C=mylcm(dn(QT),dn(Q1T),x);
                   19530:                if(C!=1){
                   19531:                        QT=red(C*QT); Q1T=red(C*Q1T);
                   19532:                }
                   19533:                Q=QT;Q1=Q1T;
                   19534:                for(I = 1; I < NP; I++){
                   19535:                        if(V[I]!=0){
                   19536:                                P = sftexp(P,x,L[I],-V[I]);  /* addition u -> (x-L[I])^V[I]u */
                   19537:                                QT = sftexp(QT,x,L[I],-V[I]);
                   19538:                        }
                   19539:                        if(V1[I]!=0)
                   19540:                                Q1T = sftexp(Q1T,x,L[I],-V1[I]);
                   19541:                }
                   19542:                C=red(mycoef(QT,D0T,dx)*mycoef(Q1,D1T,dx)/(mycoef(Q,D0T,dx)*mycoef(Q1T,D1T,dx)));
                   19543:                Q=red(dn(C)*QT);Q1=red(nm(C)*Q1T);
                   19544:                for(I = 1; I < NP; I++){
                   19545:                        if((J=V[I]-V1[I])!=0){
                   19546:                                if(J>0) Q1*=(x-L[I])^J;
                   19547:                                else Q*=(x-L[I])^(-J);
                   19548:                        }
                   19549:                        while((QT=tdiv(Q,x-L[I]))!=0){
                   19550:                                if((Q1T=tdiv(Q1,x-L[I]))!=0){
                   19551:                                        Q=QT;Q1=Q1T;
                   19552:                                }else break;
                   19553:                        }
                   19554:                }
                   19555:        }
                   19556:        P1=mysubst(P,SS);
                   19557:        if(type(S0)==4 && S0!=[]){
                   19558:                P=mysubst(P,S0); Q=mysubst(Q,S0);
                   19559:                P1=mysubst(P1,S0); Q1=mysubst(Q1,S0);
                   19560:                RS=mysubst(RS,S0); RS1=mysubst(RS1,S0);
                   19561:        }
                   19562:        R=mygcd(Q1,P1,[x,dx]);
                   19563:        if(findin(dx,vars(R[0]))>=0){
                   19564:                mycat("Some error!");
                   19565:                return 0;
                   19566:        }
                   19567:        Q=muldo(R[1]/R[0],Q,[x,dx]);
                   19568:        R=divdo(Q,P,[x,dx]);
                   19569:        Q=red(R[1]/R[2]);
                   19570:        R=fctr(nm(Q));
                   19571:        QQ=Q/R[0][0];
                   19572:        R1=fctr(dn(QQ));
                   19573:        for(RR=cdr(R1); RR!=[]; RR=cdr(RR)){
                   19574:                VT=vars(car(RR)[0]);
                   19575:                if(findin(x,VT)<0 && findin(dx,VT)<0){
                   19576:                        for(I=car(RR)[1];I>0;I--) QQ=red(QQ*car(RR)[0]);
                   19577:                }
                   19578:        }
                   19579:        Raw=getopt(raw);
                   19580:        Dviout=getopt(dviout);
                   19581:        if(Dviout==1) Raw=4;
                   19582:        if(Raw!=1){
                   19583:                for(RR=cdr(R); RR!=[]; RR=cdr(RR)){
                   19584:                        VT=vars(car(RR)[0]);
                   19585:                        if(findin(x,VT)<0 && findin(dx,VT)<0){
                   19586:                                for(I=car(RR)[1];I>0;I--) QQ=red(QQ/car(RR)[0]);
                   19587:                        }
                   19588:                }
                   19589:        }
                   19590:        if(Raw==2||Raw==3||Raw==4){
                   19591:                R=mygcd(QQ,P,[x,dx]);  /* R[0]=R[1]*QQ + R[2]*P */
                   19592:                Q1=red(R[0]/R[2]);
                   19593:                for(Q=1,RR=cdr(fctr(nm(Q1))); RR!=[]; RR=cdr(RR)){
                   19594:                        VT=vars(car(RR)[0]);
                   19595:                        if(findin(x,VT)<0){
                   19596:                                for(I=car(RR)[1];I>0;I--) Q*=car(RR)[0];
                   19597:                        }
                   19598:                }
                   19599:                if(Raw==3) QQ=[QQ,Q];
                   19600:                else if(Raw==4)    /* Q=Q*R[1]/R[0]*QQ+Q/R[0]*P */
                   19601:                        QQ=[QQ,Q,red(R[1]*Q/R[0])];
                   19602:                else QQ=Q;
                   19603:        }
                   19604:        F=getopt(all);
                   19605:        if(Dviout==1){
                   19606:                Pre = " x=\\infty & 0 & 1";
                   19607:                for(I=3; I<NP; I++) Pre = Pre+"& "+rtostr(L[I]);
                   19608:                Pre = Pre+"\\\\\n";
                   19609:                PW=str_tb(ltotex(RS|opt="GRS",pre=Pre),0);
                   19610:                str_tb(
                   19611: "=\\{u\\mid Pu=0\\}\\\\\n&\\underset{Q_2}{\\overset{Q_1}{\\rightleftarrows}}\n",PW);
                   19612:                str_tb([ltotex(RS1|opt="GRS",pre=Pre),"\\\\\n"],PW);
                   19613:                R=fctrtos(QQ[0]|TeX=3,var=[dx,"\\partial"]);
                   19614:                if(type(R)==4)  R="\\frac1{"+R[1]+"}"+R[0];
                   19615:                str_tb(["Q_1&=",R,"\\\\\n"],PW);
                   19616:                R=fctrtos(QQ[2]|TeX=3,var=[dx,"\\partial"]);
                   19617:                if(type(R)==4)  R="\\frac1{"+R[1]+"}"+R[0];
                   19618:                str_tb(["Q_2&=",R,"\\\\\n"],PW);
                   19619:                str_tb(["Q_2Q_1&\\equiv ",fctrtos(QQ[1]|TeX=3),"\\mod W(x)P"],PW);
                   19620:                if(F==1)
                   19621:                        str_tb(["\\\\\nP&=",fctrtos(P|TeX=3,var=[dx,"\\partial"])],PW);
                   19622:                dviout(str_tb(0,PW)|eq=0,title="Shift Operator");
                   19623:        }
                   19624:        if(F==1) return [QQ,P,RS,P1,RS1];
                   19625:        else if(F==0) return QQ;
                   19626:        return [QQ,P,RS];
                   19627: }
                   19628:
1.56      takayama 19629:
                   19630: def shiftPfaff(A,B,G,X,M)
                   19631: {
                   19632:        if(type(G)==4){
                   19633:                G0=G[1];G1=G[0];
                   19634:        }
                   19635:        if(type(G)==6){
                   19636:                G=map(red,G);
                   19637:                G0=llcm(G);G1=map(red,G0*G);
                   19638:        }
                   19639:        if(type(G)==3){
                   19640:                G=red(G);G0=dn(G);G1=nm(G);
                   19641:        }
                   19642:        if(type(M)==4){
                   19643:                M0=M[0];M1=M[1];
                   19644:        }else{
                   19645:                M0=M;M1=0;
                   19646:        }
                   19647:        X=vweyl(X);
                   19648:        D0=mydeg(G0,X[0]);D1=mydeg(G1,X[0]);
                   19649:        if(M1>=0){
                   19650:                D=(D1-M1>D0)?D1-M1:D0;
                   19651:                G0=muldo(X[1]^D,G0,X);G1=muldo(X[1]^(D+M1),G1,X);
                   19652:        }else{
                   19653:                D=(D0+M1>D1)?D0+M1:D1;
                   19654:                G0=muldo(X[1]^(D-M1),G0,X);G1==muldo(X[1]^D,G1,X);
                   19655:        }
                   19656:        G0=map(mc,G0,X,M0);G1=map(mc,G1,X,M0+M1);
                   19657:        G0=appldo(G0,A,X|Pfaff=1);
                   19658:        G1=sppldo(G1,B,X|Pfaff=1);
                   19659:        return rmul(myinv(G0),G1);
                   19660: }
                   19661:
1.6       takayama 19662: def conf1sp(M)
                   19663: {
                   19664:        if(type(M)==7) M=s2sp(M);
                   19665:        L0 = length(M);
                   19666:        L1 = length(M[L0-1]);
                   19667:        X2 = getopt(x2);
                   19668:        Conf= getopt(conf);
                   19669:        if(Conf != 0)
                   19670:                Conf = -1;
                   19671:        if((X2==1 || X2==-1) && Conf != 0){
                   19672:                X1 = 0;
                   19673:                X = x_1;
                   19674:        }else{
                   19675:                X1 = 1;
                   19676:                X = x_2;
                   19677:        }
                   19678:        G = sp2grs(M,a,[L0,L1]);
                   19679:        for(I = 0; I < L0-1; I++){
                   19680:                V = makev([a,I-Conf,0]);
                   19681:                G = subst(G,V,0);
                   19682:        }
                   19683:        L2 = length(M[1]);
                   19684:        for(I=J=S0=S1=0; I < L2; I++){
                   19685:                S1 += G[1][I][0];
                   19686:                while(S0 < S1){
                   19687:                        S0 += G[0][J][0];
                   19688:                        if((V=G[0][J][1]) != 0)
                   19689:                                G = mysubst(G,[V,V-G[1][I][1]]);
                   19690:                        J++;
                   19691:                }
                   19692:                if(S0 > S1){
                   19693:                        print("Error in data!");
                   19694:                        return 0;
                   19695:                }
                   19696:        }
                   19697:        if(Conf==0){
                   19698:                for(L=[], I=L0-2; I>=0; I--)
                   19699:                        L=cons(I,L);
                   19700:                L=cons(L0-1,L);
                   19701:                P = getbygrs(G,["operator","x2"]|perm=L);
                   19702:        }else if(X1)
                   19703:                P = getbygrs(mperm(G,[[1,2]],[]), ["operator","x2"]);
                   19704:        else
                   19705:                P = getbygrs(G,["operator","x1"]);
                   19706:        if(Conf==0)
                   19707:                P=nm(mysubst(P,[X,c]));
                   19708:        else{
                   19709:                P = nm(mysubst(P,[X,1/c]));
                   19710:                if(X2==-1){
                   19711:                        for(I=2; I<L0; I++){
                   19712:                                V=makev(["x_",I]); VC=makev([c,I]);
                   19713:                                P = nm(mysubst(P,[V,1/VC]));
                   19714:                        }
                   19715:                }
                   19716:        }
                   19717:        for(I = 1; I < L2; I++){
                   19718:                X = G[1][I][1];
                   19719:                P = nm(mysubst(P,[X,X/c]));
                   19720:        }
                   19721:        VS = vars(P);
                   19722:        while(VS!=[]){
                   19723:                V = car(VS);
                   19724:                if(str_chr(rtostr(V),0,"r")==0){
                   19725:                        CV = mycoef(P,1,V);
                   19726:                        D = mymindeg(CV,c);
                   19727:                        if(D > 0) P = mysubst(P,[V,V/c^D]);
                   19728:                        CV = mycoef(P,1,V);
                   19729:                        DD = mydeg(CV,dx);
                   19730:                        CVV = mycoef(CV,DD,dx);
                   19731:                        CD1 = mydeg(CVV,x);
                   19732:                        CD  = (X==x1)?0:CD1;
                   19733:                        while(CD>=0 && CD<=CD1){
                   19734:                                CC = mycoef(CVV,CD,x);
                   19735:                                if(type(CC)==1){
                   19736:                                        VT = mycoef(mycoef(mycoef(P,DD,dx),CD,x),0,V)/CC;
                   19737:                                        if(VT != 0) P = mysubst(P,[V,V-VT]);
                   19738:                                        break;
                   19739:                                }
                   19740:                                if(X==x1) CD++;
                   19741:                                else CD--;
                   19742:                        }
                   19743:                        while(subst(P,c,0,V,0) == 0)
                   19744:                                P = red(mysubst(P,[V,c*V])/c);
                   19745:                }
                   19746:                VS =cdr(VS);
                   19747:        }
                   19748:        return P;
                   19749: }
                   19750:
1.44      takayama 19751: /* ((1)(1)) ((1))   111|11|21  [[ [2,[ [1,[1]],[1,[1]] ]], [1,[[1,[1]]]] ]]  */
                   19752: /* (11)(1),111  111|21,111 [[[2,[1,1]],[1,[1]]],[1,1,1]]  */
                   19753: def s2csp(S)
                   19754: {
                   19755:        if(type(S)!=7){
                   19756:                U="";
                   19757:                if(type(N=getopt(n))>0){
                   19758:                        for(D=0,S=reverse(S);S!=[];S=cdr(S),D++){
                   19759:                                if(D) U=","+U;
                   19760:                                T=str_subst(rtostr(car(S)),","," ");
                   19761:                                U=str_cut(T,1,str_len(T)-2)+U;
                   19762:                        }
                   19763:                        V=strtoascii(U);
                   19764:                        for(R=[];V!=[];V=cdr(V)){
                   19765:                                if((CC=car(V))==91){    /* [ */
                   19766:                                        if(length(V)>1 && V[1]==91) V=cdr(V);
                   19767:                                        for(I=1;(CC=V[I])!=91&&CC!=93;I++);
                   19768:                                        if(CC==91){
                   19769:                                                R=cons(40,R);   /* ( */
                   19770:                                                while(I--) V=cdr(V);
                   19771:                                        }else{
                   19772:                                                V=cdr(V);
                   19773:                                                while(--I) R=cons(car(V),R);
                   19774:                                        }
                   19775:                                }else if(CC==93){               /* ] */
                   19776:                                        R=cons(41,R);
                   19777:                                        if(length(V)>1 && V[1]==93) V=cdr(V);
                   19778:                                }else R=cons(CC,R);
                   19779:                        }
                   19780:                        return asciitostr(reverse(R));
                   19781:                }
                   19782:                for(;S!=[];S=cdr(S)){
                   19783:                        if(U!="") U=U+",";
                   19784:                        for(D=0,TU="",T=car(S);T!=[];D++){
                   19785:                                if(type(car(T))==4){
                   19786:                                        R=lpair(T,0);
                   19787:                                        T=R[0];R1=m2l(R[1]|flat=1);
                   19788:                                }else R1=[];
                   19789:                                if(D) TU="|"+TU;
                   19790:                                TU=s2sp([T])+TU;
                   19791:                                T=R1;
                   19792:                        }
                   19793:                                U=U+TU;
                   19794:                }
                   19795:                return U;
                   19796:        }
                   19797:        S=strtoascii(S);
1.45      takayama 19798:        if(type(N=getopt(n))>0){
                   19799:                S=ltov(S);
                   19800:                L=length(S);
                   19801:                R="";
                   19802:                for(I=J=N=0, V=[];J<L;J++){
                   19803:                        if(S[J]==72) I=J;                       /* ( */
                   19804:                        else if(S[J]>47&&S[J]<58) N=N*10+S[J]-48;
                   19805:                        else{
                   19806:                                if(N>0){
                   19807:                                        V=cons(N,V);
                   19808:                                        N=0;
                   19809:                                }
                   19810:                                if(S[J]==41){   /* ) */
                   19811:
                   19812:                                }else if(S[J]==44){             /* , */
                   19813:
                   19814:                                }
                   19815:                        }
                   19816:                }
                   19817:        }
1.44      takayama 19818:        for(P=TS=[],I=D=0; S!=[]; S=cdr(S)){
                   19819:                if((C=car(S))==44){                     /* , */
                   19820:                        P=cons(D,P);D=0;
                   19821:                }else if(C==124){       /* | */
                   19822:                        D++;C=44;
                   19823:                }
                   19824:                TS=cons(C,TS);
                   19825:        }
                   19826:        S=reverse(TS);
                   19827:        P=reverse(cons(D,P));
                   19828:        U=s2sp(asciitostr(S));
                   19829:
                   19830:        for(R=[];P!=[];P=cdr(P),U=cdr(U)){
                   19831:                D=car(P);R0=car(U);
                   19832:                while(D--){
                   19833:                        U=cdr(U);
                   19834:                        for(U0=car(U),R2=[];U0!=[];U0=cdr(U0)){
                   19835:                                for(R1=[],N=car(U0);N>0;R0=cdr(R0)){
                   19836:                                        R1=cons(car(R0),R1);
                   19837:                                        if(type(car(R0))==4) N-=car(R0)[0];
                   19838:                                        else N-=car(R0);
                   19839:                                }
                   19840:                                R2=cons([car(U0),reverse(R1)],R2);
                   19841:                        }
                   19842:                        R0=reverse(R2);
                   19843:                }
                   19844:                R=cons(R0,R);
                   19845:        }
                   19846:        return reverse(R);
                   19847: }
                   19848:
                   19849:
1.36      takayama 19850: def partspt(S,T)
                   19851: {
1.40      takayama 19852:        if(length(S)>length(T)) return [];
1.38      takayama 19853:        if(type(Op=getopt(opt))!=1) Op=0;
1.40      takayama 19854:        else{
                   19855:                VS=ltov(S);
                   19856:                L=length(S)-1;
                   19857:                VT=ltov(qsort(T));
                   19858:        }
1.38      takayama 19859:        if(length(S)==length(T)){
1.40      takayama 19860:                if(S==T||qsort(S)==qsort(T)) R=S;
1.38      takayama 19861:                else return [];
1.40      takayama 19862:        }else if(getopt(sort)==1){
                   19863:                S0=S1=[];
                   19864:                for(;S!=[]&&car(S)==car(T);S=cdr(S),T=cdr(T))
                   19865:                        S0=cons(car(S),S0);
                   19866:                if(S!=[]&&car(S)<car(T)) return [];
                   19867:                S0=reverse(S0);
                   19868:                for(S=reverse(S),T=reverse(T);S!=[],car(S)==car(T);S=cdr(S),T=cdr(T))
                   19869:                        S1=cons(car(S),S1);
                   19870:                if(car(S)!=[]&&car(S)<cat(T)) return [];
                   19871:                R=partspt(reverse(S),reverse(T));
                   19872:                if(S1!=[]){
                   19873:                        for(R0=[];R!=[];R=cdr(R))
                   19874:                                R0=cons(append(car(R),S1),R0);
                   19875:                        R=reverse(R0);
                   19876:                }
                   19877:                if(S0!=[]){
                   19878:                        for(R0=[];R!=[];R=cdr(R))
                   19879:                                R0=cons(append(S0,car(R)),R0);
                   19880:                        R=reverse(R0);
                   19881:                }
1.38      takayama 19882:        }else{
                   19883:          for(R=[];;){
                   19884:                for(I=J=P=0;I<L;I++){
                   19885:                        P=VS[I];
                   19886:                        X=100000;
                   19887:                        while((P-=(Y=VT[J++]))>0){
                   19888:                                if(X<Y) break;
                   19889:                                X=Y;
                   19890:                        }
                   19891:                        if(X<Y||P<0) break;
                   19892:                }
                   19893:                if(!P&&X>=Y) R=cons(vtol(VT),R);
                   19894:                if(!vnext(VT)) break;
                   19895:          }
1.36      takayama 19896:        }
1.38      takayama 19897:        if(Op){
                   19898:                for(W=[];R!=[];R=cdr(R)){
                   19899:                        for(I=0,S=VS[0],K=U=[],TR=car(R);TR!=[];TR=cdr(TR)){
                   19900:                                K=cons(car(TR),K);
                   19901:                                if(!(S-=car(K))){
                   19902:                                        U=cons([VS[I],reverse(K)],U);
                   19903:                                        K=[];
                   19904:                                        S=VS[++I];
                   19905:                                        if(I==L){
                   19906:                                                U=cons([S,cdr(TR)],U);
                   19907:                                                break;
                   19908:                                        }
                   19909:                                }
1.36      takayama 19910:                        }
1.38      takayama 19911:                        W=cons(reverse(U),W);
                   19912:                }
                   19913:                R=W;
                   19914:                if(iand(Op,1)){
1.40      takayama 19915:                        for(R=[];W!=[];W=cdr(W))
1.38      takayama 19916:                                R=cons(reverse(qsort(car(W))),R);
                   19917:                        R=lsort(R,[],1);
                   19918:                }
                   19919:                if(Op==3){
                   19920:                        for(W=[];R!=[];R=cdr(R)){
                   19921:                                for(S=[],TR=car(R);TR!=[];TR=cdr(TR))
                   19922:                                        S=append(S,car(TR)[1]);
                   19923:                                W=cons(S,W);
1.36      takayama 19924:                        }
1.38      takayama 19925:                        R=reverse(W);
1.36      takayama 19926:                }
                   19927:        }
1.38      takayama 19928:        return R;
1.36      takayama 19929: }
                   19930:
1.38      takayama 19931: #if 0
1.36      takayama 19932: def confspt(S,T)
                   19933: {
                   19934:        R=[];
                   19935:        LS=length(S);LT=length(T);
                   19936:        if(LS<LT)  return R;
                   19937:        if(LS==LT){
                   19938:                return(S==T)? return [[S,T]]:R;
                   19939:        }
                   19940:        R=[];
                   19941:        for(ST=S,S0=T0=[],TT=T;ST!=[];ST=cdr(ST),TT=cdr(TT)){
                   19942:                if(car(ST)>car(TT)) return R;
                   19943:                if(car(ST)==car(TT){
                   19944:                        S0=cons(car(ST));T0=cons(car(TT));
                   19945:                        LS--;LT--;continue;
                   19946:                }
                   19947:                V=car(TT);D=LS-LT;
                   19948:                for(P=[ST],DD=D;DD>0;){
                   19949:                        VD=V-car(car(ST));
                   19950:                }
                   19951:        }
                   19952: }
                   19953: #endif
                   19954:
1.76      takayama 19955: def vConv(K,I,J)
                   19956: {
                   19957:        if(type(X=getopt(var))!=7) X="a";
                   19958:        if(getopt(e)==2) return subst(vConv(K,I+1,J+1),makev([X,1]),0);
                   19959:        if(J>K){L=J;J=K;K=L;}
                   19960:        if(K>I||J<1||K+J<I+1) return 0;
                   19961:        if(K+J==I+1) return 1;
                   19962:        else
                   19963: #if 1
                   19964:        L=I-K<J-2?I-K+1:J;
                   19965:        for(S=0,M=0;M<L;M++) S+=(makev([X,K+M])-makev([X,J-M-1]))*vConv(K+M,I,J-M-1|var=X);
                   19966:        return S;
                   19967: #else
                   19968:        return  vConv(K+1,I,J-1|var=X)+(makev([X,K])-makev([X,J-1]))*vConv(K,I,J-1|var=X);
                   19969: #endif
                   19970: }
                   19971:
1.50      takayama 19972: def mcvm(N)
                   19973: {
                   19974:   X=getopt(var);
                   19975:   if((Z=getopt(z))!=1) Z=0;
                   19976:   if(type(N)==4){
                   19977:     if((K=length(N))==1&&isvar(X)) X=[X];
                   19978:     if(type(X)!=4){
1.76      takayama 19979:       for(X=[],I=0;I<K;I++) X=cons(asciitostr([97+I]),X);      /* a,b,... */
1.50      takayama 19980:       X=reverse(X);
                   19981:     }
1.76      takayama 19982:        if((E=getopt(e))==1||E==2){
                   19983:          if(length(N)==4) N=cdr(N);
                   19984:          if(length(N)==3) return vConv(N[0],N[1],N[2]|var=X,e=E);
1.50      takayama 19985:        }
                   19986:        for(M=[],I=S=0;I<K;Z=0,I++){
                   19987:                M=cons(mcvm(N[I]|var=X[I],z=Z),M);
                   19988:                S+=N[I];
                   19989:        }
                   19990:        M=newbmat(K,K,reverse(M));
1.52      takayama 19991:     NR=N;
1.50      takayama 19992:        N=S;
                   19993:   }else{
                   19994:        if(type(X)==7) X=strtov(X);
                   19995:        if(!isvar(X)) X=a;
                   19996:     M=newmat(N,N);
                   19997:     for(I=0;I<N;I++){
                   19998:       V=makev([X,I+1]);
                   19999:       for(J=0;J<=I;J++){
                   20000:         R=polbyroot([1,J],V|var=X);
                   20001:         if(Z==1) R*=V;
                   20002:         M[I][J]=R;
                   20003:       }
                   20004:     }
                   20005:   }
1.52      takayama 20006:   if((Get=getopt(get))==1){
1.50      takayama 20007:     for(R=[],I=0;I<N;I++){
                   20008:       U=newmat(N,N);
                   20009:       for(J=0;J<N;J++) U[J][J]=M[J][I];
1.56      takayama 20010:       R=cons(rmul(rmul(myinv(M),U),M),R);
1.50      takayama 20011:     }
                   20012:     return reverse(R);
1.52      takayama 20013:   }else if(Get==2||Get==3||Get==4){
1.51      takayama 20014:        for(V=[],I=N;I>0;I--) V=cons(makev(["a0",I]),V);
                   20015:     MI=myinv(M);
                   20016:        V=ltov(V)*MI;
                   20017:        for(R=[],I=0;I<N;I++){
                   20018:       for(J=I+1;J<N;J++){
                   20019:         K=newmat(N,N);
                   20020:         K[I][I]=V[J];K[I][J]=-V[J];K[J][J]=V[I];K[J][I]=-V[I];
1.56      takayama 20021:            R=cons(rmul(rmul(MI,K),M),R);
1.51      takayama 20022:        }
                   20023:        }
1.52      takayama 20024:     R=reverse(R);
                   20025:        if(Get==2||length(NR)!=2||Z==1) return R;
                   20026:     for(V1=[],I=NR[0];I>0;I--) V1=cons(os_md.makev([X[0],I]),V1);
                   20027:     for(V2=[],I=NR[1];I>0;I--) V2=cons(os_md.makev([X[1],I]),V2);
                   20028:     R=subst(R,car(V1),0,car(V2),0);
                   20029:     V1=subst(V1,car(V1),0);
                   20030:     V2=subst(V2,car(V2),0);
                   20031:     for(V=[],S=V1;S!=[];S=cdr(S)) for(T=V2;T!=[];T=cdr(T)) V=cons(car(T)-car(S),V);
                   20032:     V=reverse(V);
                   20033:     Mx=length(V);
                   20034:     for(A0=[],I=J=NR[0]-1;J>=0;I+=--J) for(K=0;K<NR[1];K++,I++) A0=cons(R[I],A0);
                   20035:     A0=reverse(A0);
                   20036:     for(F0=[],T=1,I=Mx-1;I>=0;I--) F0=cons(1/(x-V[I]), F0);
                   20037:     MV=confexp([F0,V]|sym=3);
                   20038:     RR=newvect(Mx);
                   20039:     for(K=0;K<Mx;K++) for(RR[K]=0,I=0;I<Mx;I++) RR[K]=map(red,RR[K]+MV[I][K]*A0[I]);
1.76      takayama 20040:        for(RR0=RR,VV=append(cdr(V1),cdr(V2));VV!=[];VV=cdr(VV)) RR0=subst(RR0,car(VV),0);
1.52      takayama 20041:     RR0=vtol(RR0);
                   20042:     return (Get==3)?[RR,RR0]:RR0;
1.50      takayama 20043:   }
                   20044:   return M;
                   20045: }
1.36      takayama 20046:
1.34      takayama 20047: def confexp(S)
                   20048: {
1.52      takayama 20049:        if((Sym=getopt(sym))==1||Sym==2||Sym==3){
1.51      takayama 20050:                D=polbyroot(S[1],x);
1.52      takayama 20051:                for(R=[],T=S[0];T!=[];T=cdr(T)){
                   20052:                        M=D*car(T);
                   20053:                        if(type(M)>3) M=map(red,M);
                   20054:                        else M=red(M);
                   20055:                        R=cons(M,R);
                   20056:                }
1.51      takayama 20057:                R=reverse(R);
                   20058:                if(Sym==2) return R;
                   20059:                M=length(R);N=length(S[1]);
                   20060:                E=newmat(M,N);
                   20061:                for(I=0;I<M;I++){
                   20062:                        for(J=0;J<N;J++) E[I][J]=mycoef(R[I],N-J-1,x);
                   20063:                }
1.52      takayama 20064:                if(Sym==3){
                   20065:                        for(R=[],P=1,T=S[1];T!=[];T=cdr(T)) R=cons(P/=(x-car(T)),R);
                   20066:                        R=confexp([reverse(R),S[1]]|sym=1);
                   20067:                        return E*myinv(R);
                   20068:                }
1.51      takayama 20069:                return E;
                   20070:        }
1.35      takayama 20071:        if(type(S[0])==4){
1.52      takayama 20072:                for(E=[];S!=[];S=cdr(S)) E=cons(confexp(car(S),E));
1.35      takayama 20073:                return reverse(E);
                   20074:        }
1.34      takayama 20075:        V=x;E=[];
                   20076:        for(P=0,Q=[],ST=S;ST!=[];ST=cdr(ST)){
                   20077:                Q=cons(car(ST)[0],Q);
                   20078:                P+=car(ST)[1]/(V-car(ST)[0]);
                   20079:                P=red(P);
                   20080:        }
                   20081:        P=red(P*polbyroot(Q,V));
                   20082:        Q=cdr(reverse(Q));
                   20083:        for(I=(length(W=Q));I>=0;I--){
                   20084:                C=mycoef(P,I,V);
                   20085:                P-=C*polbyroot(W,V);
                   20086:                W=cdr(W);
                   20087:                E=cons(red(C),E);
                   20088:        }
                   20089:        return reverse(E);
                   20090: }
                   20091:
1.6       takayama 20092: def pgen(L,VV)
                   20093: {
                   20094:        if(type(L[0])<4) L=[L];
                   20095:        if(type(L)==4) L=ltov(L);
                   20096:        K=length(L);
                   20097:        V=newvect(K);
                   20098:        if(type(Sum=getopt(sum))!=1) Sum=0;
                   20099:        if((Num=getopt(num))!=1) Num=0;
                   20100:        if((Sep=getopt(sep))!=1) Sep=0;
                   20101:        if(type(Shift=getopt(shift))!=1) Shift=0;
                   20102:        for(;;){
                   20103:                for(PP=1,R=[],II=K-1; II>=0; II--){
                   20104:                        R=cons(V[II]+Shift,R);
                   20105:                        if(II>0 && Sep==1) R=cons("_",R);
                   20106:                        PP*=L[II][0]^V[II];
                   20107:                }
                   20108:                P+=makev(cons(VV,R)|num=Num)*PP;
                   20109:                for(I=0;I<K;){
                   20110:                        if(++V[I]<=L[I][1]){
                   20111:                                if(Sum>0){
                   20112:                                         for(S=II=0;II<K;) S+=V[II++];
                   20113:                                         if(S>Sum){
                   20114:                                                 V[I++]=0;
                   20115:                                                 continue;
                   20116:                                         }
                   20117:                                }
                   20118:                        }else{
                   20119:                                V[I++]=0;
                   20120:                                continue;
                   20121:                        }
                   20122:                        break;
                   20123:                }
                   20124:                if(I>=K) return P;
                   20125:        }
                   20126: }
                   20127:
                   20128: def diagm(M,A)
                   20129: {
                   20130:        return mgen(M,0,A,1);
                   20131: }
                   20132:
                   20133: def mgen(M,N,A,S)
                   20134: {
                   20135:        if(M==0 && N==0){
                   20136:                mycat([
                   20137: "mgen(m,n,a,s|sep=1) : generate a matrix of size m x n\n",
                   20138: " n : a number or \"diagonal\", \"highdiag\", \"lowdiag\",\"skew\",\"symmetric\",\"perm\" = 0,-1,-2,..\n",
                   20139: " a : a symbol or list (ex. a, [a], [a,b,c], [1,2,3])\n",
                   20140: " s : 0 or 1 (shift of suffix)\n"
                   20141:                ]);
                   20142:                return 0;
                   20143:        }
                   20144:        if(type(N)==7) N=-findin(N,["diag","highdiag","lowdiag","skew","symmetric","perm"]);
                   20145:        Sep=(getopt(sep)==1)?1:0;
                   20146:        if(S < 0 || S > 2)
                   20147:                S = 0;
                   20148:        if(M+S > 30 || N+S > 30){
                   20149:                erno(1);
                   20150:                return;
                   20151:        }
                   20152:        if(N==-5){
                   20153:                NM=newmat(M,M);
                   20154:                for(I=0;I<M;I++,A=cdr(A)) NM[I][car(A)-S]=1;
                   20155:                return NM;
                   20156:        }
                   20157:        if(type(A) == 4)
                   20158:                L = length(A)-1;
                   20159:        else
                   20160:                L = -1;
                   20161:        if(N <= 0 && N >= -2){
                   20162:                MM = newmat(M,M);
                   20163:                J = K = 0;
                   20164:                if(N == -1){
                   20165:                        K = 1; M--;
                   20166:                }else if(N == -2){
                   20167:                        J = 1; M--;
                   20168:                }
                   20169:                for(I = 0; I < M; I++){
                   20170:                        if(L >= 0)
                   20171:                                MM[I+J][I+K] = A[(I > L)?L:I];
                   20172:                        else if(type(A)==7 || isvar(A))
                   20173:                                MM[I+J][I+K] = makev([A,S+I]|sep=Sep);
                   20174:                        else
                   20175:                                 MM[I+J][I+K] = A;
                   20176:                }
                   20177:                return MM;
                   20178:        }
                   20179:        K = N;
                   20180:        if(K < 0) N = M;
                   20181:        MM = newmat(M,N);
                   20182:        for(I = 0; I < M; I++){
                   20183:                if(L >= 0)
                   20184:                        AA = rtostr(A[(I > L)?L:I]);
                   20185:                else
                   20186:                        AA = rtostr(A)+rtostr(I+S);
                   20187:                if(AA>="0" && AA<=":"){
                   20188:                        erno(0); return;
                   20189:                }
                   20190:                for(J = 0; J < N; J++){
                   20191:                        if(K < 0){
                   20192:                                if(I > J) continue;
                   20193:                                if(K == -3 && I == J) continue;
                   20194:                        }
                   20195:                        MM[I][J] = makev([AA,J+S]|sep=Sep);
                   20196:                }
                   20197:        }
                   20198:        if(K < 0){
                   20199:                for(I = 0; I < M; I++){
                   20200:                        for(J = 0; J < I; J++)
                   20201:                                MM[I][J] = (K == -4)?MM[J][I]:-MM[J][I];
                   20202:                }
                   20203:        }
                   20204:        return MM;
                   20205: }
                   20206:
                   20207: def newbmat(M,N,R)
                   20208: {
                   20209:        S  = newvect(M);
                   20210:        T  = newvect(N);
                   20211:        IM = length(R);
1.50      takayama 20212:        if(type(car(R))!=4 && M==N && M==IM){
                   20213:                for(RR=TR=[],I=0;I<M;I++){
                   20214:                        for(TR=[R[I]],J=0;J<I;J++) TR=cons(0,TR);
                   20215:                        RR=cons(TR,RR);
                   20216:                }
                   20217:                R=reverse(RR);
                   20218:        }
1.6       takayama 20219:        for(I = 0; I < IM; I++){
                   20220:                RI = R[I];
                   20221:                JM = length(RI);
                   20222:                for(J = 0; J < JM; J++){
                   20223:                        RIJ = RI[J];
                   20224:                        if(type(RIJ) == 6){
                   20225:                                S[I] = size(RIJ)[0];
                   20226:                                T[J] = size(RIJ)[1];
                   20227:                        }
                   20228:                }
                   20229:        }
                   20230:        for(I = K = 0; I < M; I++){
                   20231:                if(S[I] == 0)
                   20232:                        S[I] = 1;
                   20233:                K += S[I];
                   20234:        }
                   20235:        for(J = L = 0; J < N; J++){
                   20236:                if(T[J] == 0)
                   20237:                        T[J] = 1;
                   20238:                L += T[J];
                   20239:        }
                   20240:        M = newmat(K,L);
                   20241:        if(type(Null=getopt(null))>0){
                   20242:                for(I=0;I<K;I++){
                   20243:                        for(J=0;J<L;J++) M[I][J]=Null;
                   20244:                }
                   20245:        }
                   20246:        for(I0 = II = 0; II < IM; I0 += S[II++]){
                   20247:                RI = R[II];
                   20248:                JM = length(RI);
                   20249:                for(J0 = JJ = 0; JJ < JM; J0 += T[JJ++]){
                   20250:                        if((RIJ = RI[JJ]) == 0)
                   20251:                                continue;
                   20252:                        Type = type(RIJ);
                   20253:                        for(I = 0; I < S[II]; I++){
                   20254:                                for(J = 0; J < T[JJ]; J++){
                   20255:                                        if(Type == 6)
                   20256:                                                M[I0+I][J0+J] = RIJ[I][J];
                   20257:                                        else if(Type == 4 || Type == 5)
                   20258:                                                M[I0+I][J0+J] = (I>0)?RIJ[I]:RIJ[J];
                   20259:                                        else
                   20260:                                                M[I0+I][J0+J] = RIJ;
                   20261:                                }
                   20262:                        }
                   20263:                }
                   20264:        }
                   20265:        return M;
                   20266: }
                   20267:
                   20268: def unim(S)
                   20269: {
                   20270:        if(!Rand++) random(currenttime());
                   20271:        if(!isint(Wt=getopt(wt))||Wt<0||Wt>10) Wt=2;
                   20272:        if(!isint(Xa=getopt(abs)) || Xa<1)
                   20273:                Xa=9;
                   20274:        if((Xaa=Xa)>10) Xaa=10;
                   20275:        if(Xaa%2) Xaa++;
                   20276:        Xh=Xaa/2;
                   20277:        if(type(S0=SS=S)==4){
                   20278:                Int=(getopt(int)==1)?1:0;
                   20279:                U=[1,1,1,1,1,1,1,1,1,1,1,1,2,2,3,4];
                   20280:                M=newmat(S[0],S[1]);
                   20281:                SS=cdr(S);SS=cdr(SS);
                   20282:                if(Rk=length(SS)) L=SS;
                   20283:                else{
                   20284:                        L=[0];
                   20285:                        I=(S[0]>S[1])?S[1]:S[0];
                   20286:                        if(I<=2) return 0;
                   20287:                        if(!isint(Rk=getopt(rank))||Rk<1||Rk>S[0]||Rk>S[1])
                   20288:                                Rk=random()%(I-1)+2;
                   20289:                        for(I=1;I<Rk;){
                   20290:                                P=random()%(S[1]+Wt)-Wt;
                   20291:                                if(P<=0) P=1;
                   20292:                                if(findin(P,L)!=0){
                   20293:                                        L=cons(P,L);
                   20294:                                        I++;
                   20295:                                }
                   20296:                        }
                   20297:                }
                   20298:                L=ltov(qsort(L));
                   20299:                M[0][L[0]]=1;
                   20300:                for(I=1;I<Rk;I++){
                   20301:                        P=Int?1:U[random()%length(U)];
                   20302:                        if(P>Xa) P=Xa;
                   20303:                        M[I][L[I]]=(random()%2)?P:(-P);
                   20304:                }
                   20305:                for(I=0;I<Rk;I++){
                   20306:                        if(I!=0&&abs(M[I][L[I]])>1) M[K=random()%I][KK=L[I]]=1;
                   20307:                        I0=(I==0)?1:L[I]+1;
                   20308:                        I1=(I==Rk-1)?S[1]:L[I+1];
                   20309:                        for(J=I0;J<I1;J++){
                   20310:                                for(K=1;K<=Xa;K++){
                   20311:                                        P=random()%(I+1);
                   20312:                                        if((random()%2)==1) M[P][J]++;
                   20313:                                        else M[P][J]--;
                   20314:                                }
                   20315:                        }
                   20316:                }
                   20317:                S=M;
                   20318:                Res=(getopt(res)==1)?dupmat(S):0;
                   20319:        }
                   20320:        Conj=0;
                   20321:        if(type(S)<2){
                   20322:                if(S<2||S>20) return 0;
                   20323:                if(getopt(conj)==1){
                   20324:                        M=S+Wt;
                   20325:                        if(M>15) M=10;
                   20326:                        M0=floor((M-1)/2);
                   20327:                        for(R=[],I=0;I<S;I++) R=cons(random()%M-M0,R);
                   20328:                        R=qsort(R);
                   20329:                        M=diagm(S,R);
                   20330:                        if(getopt(diag)!=1){
                   20331:                                for(I=1;I<S;I++)
                   20332:                                        if(M[I-1][I-1]==M[I][I] && random()%2) M[I-1][I]=1;
                   20333:                        }
                   20334:                        if(M[0][0]==M[S-1][S-1]){
                   20335:                                for(I=1;I<S;I++) if(M[I-1][I]==1) break;
                   20336:                                if(I==S){
                   20337:                                        if(M[0][0]>0) M[0][0]--;
                   20338:                                        else M[S-1][S-1]++;
                   20339:                                }
                   20340:                        }
                   20341:                        if(getopt(res)==1) RR=diagm(S,[1]);
                   20342:                        S1=S;
                   20343:                        Res=dupmat(S=M);
                   20344:                        if(isint(I=getopt(int))&&I>1&&random()%I==0){
                   20345:                                K=S[0][0];L=K+1;
                   20346:                                for(I=1;I<S1;I++){
                   20347:                                        if(S[I][I]>L && S[I-1][I]==0 && (I==S1-1||S[I][I+1]==0)){
                   20348:                                                L=S[I][I];
                   20349:                                                if(RR){
                   20350:                                                        RR[I][I]=L-K;RR[0][I]=1;
                   20351:                                                }
                   20352:                                                S[0][I]=1;
                   20353:                                                if(!(random()%3)) break;
                   20354:                                        }
                   20355:                                }
                   20356:                                if(random()%3==0){
                   20357:                                        for(I=0;I<S1-1;I++){
                   20358:                                                if(iand(S[I][I],1)&&S[I][I+1]==1){
                   20359:                                                        for(J=I+2;J<S1&&S[I][J]==0;J++);
                   20360:                                                        if(J<S1) continue;
                   20361:                                                        for(J=I-1;J>=0&&S[J][I]==0;J--);
                   20362:                                                        if(J>=0) continue;
                   20363:                                                        S[I][I+1]=2;
                   20364:                                                        for(J=0;J<S1;J++) RR[I][J]*=2;
                   20365:                                                        break;
                   20366:                                                }
                   20367:                                        }
                   20368:                                }
                   20369:                        }
                   20370:                }else{
                   20371:                        M=diagm(S,[1]);
                   20372:                        S1=S;
                   20373:                }
                   20374:        }
                   20375:        if(type(S)==6){
                   20376:                M=dupmat(S);
                   20377:                S=size(S);
                   20378:                S1=S[1];S=S[0];
                   20379:                Nt=1;
                   20380:                if(getopt(conj)==1&&S==S1) Conj=1;
                   20381:        }
                   20382:        if(!isint(Ct=getopt(time)))
                   20383:                Ct=(S>3||S1>3)?100:200;
                   20384:        if(getopt(both)==1){
                   20385:                OL=delopt(getopt(),"both");
                   20386:                M=unim(mtranspose(M)|option_list=OL);
                   20387:                M=mtranspose(M);
                   20388:        }
                   20389:        Mx=20;
                   20390:        for(I=K=LL=0;I<Ct+Mx;I++){
                   20391:                P=random()%S;Q=random()%S;
                   20392:                if(3*K>Ct) T=random()%Xaa-Xh;
                   20393:                else if(5*K<Ct) T=random()%2-1;
                   20394:                else T=random()%4-2;
                   20395:                if(T>=0) T++;
                   20396:                if(P==Q) continue;
                   20397:                for(G=0,J=S1-1;J>=0;J--){
                   20398:                        if((H=abs(M[Q][J]+M[P][J]*T))>Xa&&(!Conj||J!=P)) break;
                   20399:                        if(K<Mx&&!Conj) G=igcd(G,H);
                   20400:                }
                   20401:                if(K<Mx && G>1) J=1;
                   20402:                if(J>0) continue;
                   20403:                if(J<0&&Conj==1){
                   20404:                        for(J=S1-1;J>=0;J--)
                   20405:                                if(J!=Q&&abs(M[J][P]-M[J][Q]*T)>Xa) break;
                   20406:                        if(J<0&&abs(M[Q][P]-M[Q][Q]*T+M[P][P]*T-M[P][Q]*T^2)>Xa) J=1;
                   20407:                        if(J<0&&M[P][P]==M[Q][Q]){
                   20408:                                LF=0;
                   20409:                                for(L=S1-1;J>=0;J--) if(L!=Q&&M[J][Q]!=0) LF++;
                   20410:                                for(L=S1-1;J>=0;J--) if(L!=P&&M[P][J]!=0) LF++;
                   20411:                                        if(!LF) J=1;
                   20412:                        }
                   20413:                }
                   20414:                if(J<0){
                   20415:                        for(J=S1-1;J>=0;J--)
                   20416:                                M[Q][J]+=M[P][J]*T;
                   20417:                        if(Conj==1)
                   20418:                                for(J=S1-1;J>=0;J--) M[J][P]-=M[J][Q]*T;
                   20419:                        if(RR) for(J=S1-1;J>=0;J--) RR[Q][J]+=RR[P][J]*T;
                   20420:                        K++;
                   20421:                }
                   20422:                if(K%5==0){
                   20423:                        if(!Nt) M=mtranspose(M);
                   20424:                        else if(!Conj&&K%2==0){
                   20425:                                for(F=0;F<S;F++){
                   20426:                                        if((V=lgcd(M[F]))>1){
                   20427:                                                for(L=0;L<S1;L++) M[F][L]/=V;
                   20428:                                        }
                   20429:                                }
                   20430:                        }
                   20431:                }
                   20432:                if(I>Ct){
                   20433:                        for(L=S-1;L>=0;L--){
                   20434:                                for(F=0,J=S1-1;J>=0;J--)
                   20435:                                        if(M[L][J]!=0) F++;
                   20436:                                if(F<2){
                   20437:                                        F=-1;break;
                   20438:                                }
                   20439:                                else F=0;
                   20440:                        }
                   20441:                        if(F<0 && LL++<5){
                   20442:                                I=(CT-CT%2)/2;K=1;
                   20443:                        }
                   20444:                        if(I>Ct) break;
                   20445:                }
                   20446:        }
                   20447:        if(RR){
                   20448:                for(I=F=0;I<S1;I++){
                   20449:                        V=Res[I][I];
                   20450:                        for(J=I+1;J<S1;J++){
                   20451:                                if(Res[J][J]!=V) break;
                   20452:                                for(LP=0;LP<2;LP++){
                   20453:                                        if(J==S1-1||Res[J][J+1]==0){
                   20454:                                                if(I==0||Res[I-1][I]==0){
                   20455:                                                        for(VL=VS=[],K=0;K<S1;K++){
                   20456:                                                                VL=cons(RR[K][J],VL);VS=cons(RR[K][I],VS);
                   20457:                                                        }
                   20458:                                                        VR=ldev(VL,VS);
                   20459:                                                        if(VR[0]){
                   20460:                                                                for(K=S1-1,VN=VR[1];K>=0;K--,VN=cdr(VN))
                   20461:                                                                        RR[K][J]=car(VN);
                   20462:                                                                F=1;
                   20463:                                                        }
                   20464:                                                }
                   20465:                                        }
                   20466:                                        K=I;I=J;J=K;
                   20467:                                }
                   20468:                        }
                   20469:                        if(F&&I==S1-1){
                   20470:                                F=0;I=-1;
                   20471:                        }
                   20472:                }
                   20473:                if(getopt(int)==1){
                   20474:                        N=mtranspose(M);
                   20475:                        for(F=I=0;I<S1;I++) if(lgcd(M[I])>1||lgcd(N[I])>1) F++;
                   20476:                        if(F){
                   20477:                                for(F=I=0;I<S1;I++){
                   20478:                                        if(Res[I][I]==-1) F=ior(F,1);
                   20479:                                        else if(Res[I][I]==1) F=ior(F,2);
                   20480:                                }
                   20481:                                C=0;
                   20482:                                if(!iand(F,1)) C=1;
                   20483:                                else if(!iand(F,2)) C=-1;
                   20484:                                if(C){
                   20485:                                        for(I=0;I<S1;I++){
                   20486:                                                M[I][I]+=C;Res[I][I]+=C;
                   20487:                                        }
                   20488:                                }
                   20489:                        }
                   20490:                }
                   20491:                if(getopt(rep)!=1){
                   20492:                        for(Lp=0;Lp<5;Lp++){
                   20493:                                F=(M==Res||abs(lmax(RR))>Xa*10||abs(lmin(RR))>Xa*10)?1:0;
                   20494:                                for(I=0;!F&&I<S1&&Lp<4;I++){
                   20495:                                        for(K=L=J=0;J<S1;J++){
                   20496:                                                if(M[I][J]) K++;
                   20497:                                                if(M[J][I]) L++;
                   20498:                                        }
                   20499:                                        if(K<2||L<2) F=1;
                   20500:                                }
                   20501:                                if(!F) break;
                   20502:                                R=unim(S0|option_list=cons(["rep",1],getopt()));
                   20503:                                M=R[0];Res=R[1];RR=R[3];
                   20504:                        }
                   20505:                }
                   20506:        }
                   20507:        if(Res==0) return M;
                   20508:        if(RR){
                   20509:                for(I=K=V=0;I<S1;I++){
                   20510:                        for(J=0;J<S1;J++){
                   20511:                        if(RR[J][I]>0) V++;
                   20512:                                else if(RR[J][I]<0) V--;
                   20513:                        }
                   20514:                        if(I<S1-1&&Res[I][I+1]!=0) continue;
                   20515:                        if(V<0){
                   20516:                                for(;K<=I;K++) RR=colm(RR,K,-1);
                   20517:                        }
                   20518:                        K=I+1;V=0;
                   20519:                }
                   20520:        }
                   20521:        if(getopt(rep)!=1){
                   20522:                if((F=getopt(dviout))==1){
                   20523:                        if(getopt(conj)==1){
                   20524:                                if(RR) show([Res,"=",myinv(RR),M,RR]|opt="spts0",str=1,lim=200);
                   20525:                        }else{
                   20526:                                if(type(Lim=getopt(lim))==1)
                   20527:                                         mtoupper(M,0|step=1,opt=7,dviout=1,pages=1,lim=Lim);
                   20528:                                else mtoupper(M,0|step=1,opt=7,dviout=1,pages=1);
                   20529:                        }
                   20530:                }else if(F==-1){
                   20531:                        if(getopt(conj)==1){
                   20532:                                if(RR) return ltotex([Res,"=",myinv(RR),M,RR]|opt="spts0",str=1,lim=200);
                   20533:                        }else{
                   20534:                                if(type(Lim=getopt(lim))==1)
                   20535:                                         return mtoupper(M,0|step=1,opt=7,pages=1,lim=Lim,dviout=-1);
                   20536:                                else return mtoupper(M,0|step=1,opt=7,pages=1,dviout=-1);
                   20537:                        }
                   20538:                }
                   20539:        }
                   20540:        if(RR==0) return[M,Res];
                   20541:        return [M,Res,myinv(RR),RR];
                   20542: }
                   20543:
                   20544: def pfrac(F,X)
                   20545: {
                   20546:        F = red(F);
                   20547:        FN = nm(F);
                   20548:        FD = dn(F);
                   20549:        if(mydeg(FD,X) == 0)
                   20550:                return [[F,1,1]];
                   20551:        R = rpdiv(FN,FD,X);
                   20552:        FN = R[0]/R[1];
                   20553:        R0 = R[2]/R[1];
                   20554:        FC = fctr(FD);
                   20555:        RT=[];
                   20556:        if(getopt(root)==2){
                   20557:                for(FE=[],FT=FC;FT!=[];FT=cdr(FT)){
                   20558:                        if(mydeg(P=car(FT)[0],X)==4 && vars(P)==[X] && pari(issquare,C=mycoef(P,4,X))){
                   20559:                                if((S=mycoef(P,3,X)/4/C)!=0) P=subst(P,X,X-S);
                   20560:                                if(mycoef(P,1,X)==0 && pari(issquare,C0=mycoef(P,0,X))){
                   20561:                                        C=sqrtrat(C);C0=sqrtrat(C0);C1=2*C*C0-mycoef(P,2,X);
                   20562:                                        if(C1>0){
                   20563:                                                FE=cons([C*(X+S)^2-C1^(1/2)*(X+S)+C0,car(FT)[1]],FE);
                   20564:                                                FE=cons([C*(X+S)^2+C1^(1/2)*(X+S)+C0,car(FT)[1]],FE);
                   20565:                                                RT=cons(C1,RT);
                   20566:                                                continue;
                   20567:                                        }
                   20568:                                }
                   20569:                        }
                   20570:                        FE=cons(car(FT),FE);
                   20571:                }
                   20572:                FC=reverse(FE);
                   20573:        }
                   20574:        N = Q = 0;
                   20575:        L = [];
                   20576:        for(I = length(FC)-1; I >= 0; I--){
                   20577:                if((D = mydeg(FC[I][0],X)) == 0)  continue;
                   20578:                for(K=1; K<=FC[I][1]; K++){
                   20579:                        for(J=P=0; J < D; J++){
                   20580:                                V = makev(["zz_",++N]);
                   20581:                                P = P*X + V;
                   20582:                                L = cons(V,L);
                   20583:                        }
                   20584:                        Q += P/(FC[I][0]^K);
                   20585:                        Q = red(Q);
                   20586:                }
                   20587:        }
                   20588:        L=reverse(L);
                   20589:        Q = nm(red(red(Q*FD)-FN));
                   20590:        Q = ptol(Q,X);
                   20591:        S = lsol(Q,L);
                   20592:        R = (R0==0)?[]:[[R0,1,1]];
                   20593:        for(N=0,I=length(FC)-1; I >= 0; I--){
                   20594:                if((D = mydeg(FC[I][0],X)) == 0)  continue;
                   20595:                for(K=1; K<=FC[I][1]; K++){
                   20596:                        for(P=J=0; J < D; N++,J++)
                   20597:                                P = P*X + S[N][1];
                   20598:                        if(P!=0) R = cons([P,FC[I][0],K],R);
                   20599:                }
                   20600:        }
                   20601:        for(;RT!=[];RT=cdr(RT)){
                   20602:                RTT=car(RT);
                   20603:                R=mtransbys(os_md.substblock,R,[RTT^(1/2),(RTT^(1/2))^2,RTT]);
                   20604:        }
                   20605:        TeX=getopt(TeX);
                   20606:        if((Dvi=getopt(dviout))==1||TeX==1){
                   20607:                V=strtov("0");
                   20608:                for(S=L=0,RR=R;RR!=[];RR=cdr(RR),L++){
                   20609:                        RT=car(RR);
                   20610:                        S+=(RT[0]/RT[1]^RT[2])*V^L;
                   20611:                }
                   20612:                if(TeX!=1) fctrtos(S|var=[V,""],dviout=1);
                   20613:                else return fctrtos(S|var=[V,""],TeX=3);
                   20614:        }
                   20615:        return reverse(R);
                   20616: }
                   20617:
                   20618: def cfrac(X,N)
                   20619: {
                   20620:        F=[floor(X)];
                   20621:        if(N<0){
                   20622:                Max=N=-N;
                   20623:        }
                   20624:        X-=F[0];
                   20625:        if(Max!=1)
                   20626:                M=mat([F[0],1],[1,0]);
                   20627:        for(;N>0 && X!=0;N--){
                   20628:                X=1/X;
                   20629:                F=cons(Y=floor(X),F);
                   20630:                X-=Y;
                   20631:                if(Max){
                   20632:                        M0=M[0][0];M1=M[1][0];
                   20633:                        M=M*mat([Y,1],[1,0]);
                   20634:                        if(M[0][0]>Max) return M0/M1;
                   20635:                }
                   20636:        }
                   20637:        return (Max==0)?reverse(F):M[0][0]/M[1][0];
                   20638: }
                   20639:
                   20640: def sqrt2rat(X)
                   20641: {
                   20642:        if(type(X)>3) return X;
                   20643:        X=red(X);
                   20644:        if(getopt(mult)==1){
                   20645:                for(V=vars(X);V!=[];V=cdr(V)){
                   20646:                        T=funargs(F=car(V));
                   20647:                        if(type(T)==4&&length(T)>1){
                   20648:                                Y=T[1];
                   20649:                                Z=sqrt2rat(Y);
                   20650:                                if(Y!=Z){
                   20651:                                        if(length(T)==2){
                   20652:                                                T0=T[0];
                   20653:                                                X=subst(X,F,T0(Z));
                   20654:                                        }else if(T[0]==pow)
                   20655:                                                X=subst(X,F,Y^T[2]);
                   20656:                                }
                   20657:                        }
                   20658:                }
                   20659:        }
                   20660:        for(V=vars(X);V!=[];V=cdr(V)){  /* r(x)^(1/2+n) -> r(x)^n*r(x)^(1/2) */
                   20661:                T=args(Y=car(V));
                   20662:                if(functor(Y)==pow&&T[1]!=1/2&&isint(T2=2*T[1])){
                   20663:                        if(iand(T2,1)){
                   20664:                                R=(T[0])^(1/2);T2--;
                   20665:                        }else R=1;
                   20666:                        R*=T[0]^(T2/2);
                   20667:                        X=red(subst(X,Y,R));
                   20668:                }
                   20669:        }
                   20670:        D=dn(X);N=nm(X);
                   20671:        if(imag(D)!=0){
                   20672:                N*=conj(D);
                   20673:                D*=conj(D);
                   20674:                return sqrt2rat(N/D);
                   20675:        }
                   20676:        for(V=vars(N);V!=[];V=cdr(V)){  /* (r(x)^(n/m))^k */
                   20677:                T=args(Y=car(V));
                   20678:                if(functor(Y)==pow&&(T[1]==0||(type(T[1])==1&&ntype(T[1])==0))){
                   20679:                        Dn=dn(T[1]);Nm=nm(T[1]);
                   20680:                        N=substblock(N,Y,Y^Dn,T[0]^Nm);
                   20681:                }
                   20682:        }
                   20683:        for(V=vars(D);V!=[];V=cdr(V)){
                   20684:                T=args(Y=car(V));
                   20685:                if(functor(Y)==pow&&(T[1]==0||(type(T[1])==1&&ntype(T[1])==0))){
                   20686:                        Dn=dn(T[1]);Nm=nm(T[1]);
                   20687:                        D=substblock(D,Y,Y^Dn,T[0]^Nm);
                   20688:                }
                   20689:        }
                   20690:        for(V=vars(D);V!=[];V=cdr(V)){
                   20691:                T=args(Y=car(V));
                   20692:                if(functor(Y)==pow&&T[1]==1/2&&mydeg(D,Y)==1){
                   20693:                        N*=mycoef(D,0,Y)-mycoef(D,1,Y)*Y;
                   20694:                        N=mycoef(N,0,Y)+mycoef(N,1,Y)*Y+mycoef(N,2,Y)*T[0];
                   20695:                        D=mycoef(D,0,Y)^2-mycoef(D,1,Y)^2*T[0];
                   20696:                        X=red(N/D);
                   20697:                        D=dn(X);N=nm(X);
                   20698:                        break;
                   20699:                }
                   20700:        }
                   20701:        X=red(N/D);
                   20702:        D=dn(X);N=nm(X);
                   20703:        for(V=vars(D);V!=[];V=cdr(V)){
                   20704:                T=args(Y=car(V));
                   20705:                if(functor(Y)==pow&&T[1]==1/2)
                   20706:                        D=substblock(D,T[0]^T[1],(T[0]^T[1])^2,T[0]);
                   20707:        }
                   20708:        for(V=vars(N);V!=[];V=cdr(V)){
                   20709:                T=args(Y=car(V));
                   20710:                if(functor(Y)==pow&&T[1]==1/2)
                   20711:                        N=substblock(N,T[0]^T[1],(T[0]^T[1])^2,T[0]);
                   20712:        }
                   20713:        for(V=vars(N);V!=[];V=cdr(V)){
                   20714:                T=args(Y=car(V));
                   20715:                if(functor(Y)==pow&&T[1]==1/2){
                   20716:                        Ag=T[0];
                   20717:                        R=S=1;
                   20718:                        An=fctr(nm(Ag));
                   20719:                        CA=An[0][0];
                   20720:                        if(CA<0){
                   20721:                                CA=-CA;R=-1;
                   20722:                        }
                   20723:                        if(type(I=sqrtrat(CA))<2) S=I;
                   20724:                        else R*=CA;
                   20725:                        for(An=cdr(An);An!=[];An=cdr(An)){
                   20726:                                Pw=car(An)[1];I=iand(Pw,1);
                   20727:                                if(I) R*=car(An)[0];
                   20728:                                if((Q=(Pw-I)/2)>0) S*=car(An)[0]^Q;
                   20729:                        }
                   20730:                        for(An=fctr(dn(Ag));An!=[];An=cdr(An)){
                   20731:                                Pw=car(An)[1];I=iand(Pw,1);
                   20732:                                if(I) R/=car(An)[0]^I;
                   20733:                                if((Q=(Pw-I)/2)>0) S/=car(An)[0]^Q;
                   20734:                        }
                   20735:                        if(S!=1) N=subst(N,Y,R^(1/2)*S);
                   20736:                }
                   20737:        }
                   20738:        for(V=vars(N);V!=[];V=cdr(V)){
                   20739:                T=args(Y=car(V));
                   20740:                if(functor(Y)==pow&&T[1]==1/2){
                   20741:                        C=mycoef(N,1,Y);
                   20742:                        for(VC=vars(C);VC!=[];VC=cdr(VC)){
                   20743:                                TC=args(YC=car(VC));
                   20744:                                if(functor(YC)==pow&&TC[1]==1/2){
                   20745:                                        Ag=red(T[0]*TC[0]);
                   20746:                                        R=S=1;
                   20747:                                        An=fctr(nm(Ag));
                   20748:                                        CA=An[0][0];
                   20749:                                        if(CA<0){
                   20750:                                                CA=-CA;R=-1;
                   20751:                                        }
                   20752:                                        if(type(I=sqrtrat(CA))<2) S=I;
                   20753:                                        else R*=CA;
                   20754:                                        for(An=cdr(An);An!=[];An=cdr(An)){
                   20755:                                                Pw=car(An)[1];I=iand(Pw,1);
                   20756:                                                if(I) R*=car(An)[0];
                   20757:                                                if((Q=(Pw-I)/2)>0) S*=car(An)[0]^Q;
                   20758:                                        }
                   20759:                                        for(An=fctr(dn(Ag));An!=[];An=cdr(An)){
                   20760:                                                Pw=car(An)[1];I=iand(Pw,1);
                   20761:                                                if(I) R/=car(An)[0]^I;
                   20762:                                                if((Q=(Pw-I)/2)>0) S/=car(An)[0]^Q;
                   20763:                                        }
                   20764:                                        CC=mycoef(C,1,YC);
                   20765:                                        N=N-CC*YC*Y+CC*R^(1/2)*S;
                   20766:                                }
                   20767:                        }
                   20768:                }
                   20769:        }
                   20770:        return red(N/D);
                   20771: }
                   20772:
                   20773: def cfrac2n(X)
                   20774: {
                   20775:        if(type(L=getopt(loop))==1&&L>0)
                   20776:                C=x;
                   20777:        else{
                   20778:                C=0;L=0;
                   20779:        }
                   20780:        if(L>1){
                   20781:                for(Y=[];L>1;L--){
                   20782:                        Y=cons(car(X),Y);
                   20783:                        X=cdr(X);
                   20784:                }
                   20785:                if(X!=[]){
                   20786:                        P=cfrac2n(X|loop=1);
                   20787:                        for(V=P,Y=reverse(Y);Y!=[];Y=cdr(Y))
                   20788:                                V=sqrt2rat(car(Y)+1/V);
                   20789:                        return V;
                   20790:                }else{
                   20791:                        C=0;X=reverse(Y);
                   20792:                }
                   20793:        }
                   20794:        for(V=C,X=reverse(X);X!=[];X=cdr(X)){
                   20795:                if(V!=0) V=1/V;
                   20796:                V+=car(X);
                   20797:        }
                   20798:        if(C!=0){
                   20799:                V=red(V);P=dn(V)*x-nm(V);
                   20800:                S=getroot(P,x|cpx=2);
                   20801:                T=map(eval,S);
                   20802:                V=(T[0]>0)?S[0]:S[1];
                   20803:        }
                   20804:        return V;
                   20805: }
                   20806:
                   20807: def s2sp(S)
                   20808: {
                   20809:        if(getopt(short)==1){
                   20810:                if(type(F=getopt(std))==1) S=s2sp(S|std=F);
                   20811:                if(type(S)!=7) S=s2sp(S);
                   20812:                L=strtoascii(S);
                   20813:                for(LS=[],F=C=0;L!=[];L=cdr(L)){
                   20814:                        if((G=car(L))!=F){
                   20815:                                LS=cons(G,LS);C=0;
                   20816:                        }else if(C<3){
                   20817:                                LS=cons(G,LS);
                   20818:                        }else if(C==3){
                   20819:                                LS=cdr(LS);LS=cdr(LS);
                   20820:                                LS=cons(94,LS);LS=cons(52,LS);
                   20821:                        }else if(C==9){
                   20822:                                LS=cdr(LS);LS=cons(97,LS);
                   20823:                        }else{
                   20824:                                K=car(LS);LS=cdr(LS);LS=cons(K+1,LS);
                   20825:                        }
                   20826:                        C++;F=G;
                   20827:                }
                   20828:                return asciitostr(reverse(LS));
                   20829:        }
                   20830:        if(type(F=getopt(std))==1){
                   20831:                F=(F>0)?1:-1;
                   20832:                if(type(S)==7) S=s2sp(S);
                   20833:                for(L=[];S!=[];S=cdr(S))
                   20834:                L=cons(os_md.msort(car(S),[-1,0]),L);
                   20835:                return os_md.msort(L,[F,2]);
                   20836:        }
                   20837:        if(type(S)==7){
                   20838:                S = strtoascii(S);
                   20839:                if(type(S) == 5) S = vtol(S);
                   20840:                for(N=0,R=TR=[]; S!=[]; S=cdr(S)){
                   20841:                        if(car(S)==45)      /* - */
                   20842:                                N=1;
                   20843:                        else if(car(S)==47) /* / */
                   20844:                                N=2;
                   20845:                        if(N>0){
                   20846:                                while(car(S)<48&&car(S)!=40) S=cdr(S);
                   20847:                        }
                   20848:                        if((T=car(S))>=48 && T<=57) TR=cons(T-48,TR);
                   20849:                        else if(T>=97) TR=cons(T-87,TR);
                   20850:                        else if(T>=65 && T<=90) TR=cons(T-29,TR);  /* A-Z */
                   20851:                        else if(T==44){
                   20852:                                R=cons(reverse(TR),R);
                   20853:                                TR=[];
                   20854:                        }else if(T==94){  /* ^ */
                   20855:                                S=cdr(S);
                   20856:                                if(car(S)==40){  /* ( */
                   20857:                                        S=cdr(S);
                   20858:                                        for(T=0; car(S)!=41 && S!=[]; S=cdr(S)){
                   20859:                                                V=car(S)-48;
                   20860:                                                if(V>=10) V-=39;
                   20861:                                                T=10*T+V;
                   20862:                                        }
                   20863:                                }else{
                   20864:                                        while(car(S)<48) S=cdr(S);
                   20865:                                        T=car(S)-48;
                   20866:                                        if(T>=10) T-=39;
                   20867:                                }
                   20868:                                while(--T>=1) TR=cons(car(TR),TR);
                   20869:                        }else if(T==40){   /* ( */
                   20870:                                S=cdr(S);
                   20871:                                if(N==1){
                   20872:                                        N=0; NN=1;
                   20873:                                }else NN=0;
                   20874:                                if(car(S)==45){  /* - */
                   20875:                                        S=cdr(S);
                   20876:                                        NN=1-NN;
                   20877:                                }
                   20878:                                for(I=0; I<2; I++){
                   20879:                                        for(V=0; (SS=car(S))!=41 && SS!=47 && S!=[]; S=cdr(S)){
                   20880:                                        T=SS-48;
                   20881:                                        if(T>=10) T-=39;
                   20882:                                                V=10*V+T;
                   20883:                                        }
                   20884:                                        if(NN==1){
                   20885:                                                V=-V; NN=0;
                   20886:                                        }
                   20887:                                        TR=cons(V,TR);
                   20888:                                        if(SS!=47) break;
                   20889:                                        else{
                   20890:                                                N=2; S=cdr(S);
                   20891:                                        }
                   20892:                                }
                   20893:                        }else if(T==60){
                   20894:                                for(V=[],S=cdr(S);S!=[]&&car(S)!=62;S=cdr(S))
                   20895:                                        V=cons(car(S),V);
                   20896:                                if(car(S)!=62) continue;
                   20897:                                TR=cons(eval_str(asciitostr(reverse(V))),TR);
                   20898:                        }else if(T<48) continue;
                   20899:                        if(N==1){
                   20900:                                T = car(TR);
                   20901:                                TR=cons(-T,cdr(TR));
                   20902:                                N=0;
                   20903:                        }else if(N==2){
                   20904:                                T=car(TR); TR=cdr(TR);
                   20905:                                TR=cons(car(TR)/T,cdr(TR));
                   20906:                                N=0;
                   20907:                        }
                   20908:                }
                   20909:                return reverse(cons(reverse(TR),R));
                   20910:        }else if(type(S)==4){
                   20911:                Num=getopt(num);
                   20912:                for(R=[]; ; ){
                   20913:                        if(type(TS=car(S))!=4) return;
                   20914:                        for(; TS!=[]; TS=cdr(TS)){
                   20915:                                V=car(TS);
                   20916:                                if(type(V)>1||(type(V)==1&&ntype(V)>0)){
                   20917:                                        V="<"+rtostr(V)+">";
                   20918:                                        R=append(reverse(strtoascii(V)),R);
                   20919:                                        continue;
                   20920:                                }
                   20921:                                if(dn(V)>1){
                   20922:                                        P=reverse(strtoascii(rtostr(V)));
                   20923:                                        R=append(P,cons(40,R));
                   20924:                                        R=cons(41,R);
                   20925:                                        continue;
                   20926:                                }
                   20927:                                if(V<0 && V>-10){
                   20928:                                        V=-V;
                   20929:                                        R=cons(45,R);
                   20930:                                }
                   20931:                                if(V<0 || V>35 || (V>9 && Num==1)){
                   20932:                                        P=reverse(strtoascii(rtostr(V)));
                   20933:                                        R=append(P,cons(40,R));
                   20934:                                        V=41;
                   20935:                                }else if(V<10) V+=48;
                   20936:                                else V+=87;
                   20937:                                R=cons(V,R);
                   20938:                        }
                   20939:                        if((S=cdr(S))==[]) break;
                   20940:                        R=cons(44,R);
                   20941:                }
                   20942:                return asciitostr(reverse(R));
                   20943:        }
                   20944:        return 0;
                   20945: }
                   20946:
                   20947: def sp2grs(M,A,L)
                   20948: {
                   20949:        MM = [];
                   20950:        T0 = 0;
                   20951:        Mat=getopt(mat);
                   20952:        if(Mat!=1) Mat=0;
                   20953:        if(type(M)==7) M=s2sp(M);
                   20954:        if((LM = length(M)) > 10 && type(A) < 4)
                   20955:                CK = 1;
                   20956:        Sft = (type(L)==1)?L:0;
                   20957:        if(type(L)==4 && length(L)>=3)
                   20958:                Sft = L[2];
                   20959:        if(Sft < 0){
                   20960:                T0 = 1;
                   20961:                Sft = -Sft-1;
                   20962:        }
                   20963:        for(I = LM-1; I >= 0; I--){
                   20964:                MI = M[I]; MN = [];
                   20965:                if(CK == 1 && length(MI) > 10){
                   20966:                        erno(1);
                   20967:                        return;
                   20968:                }
                   20969:                if(type(A) == 4)
                   20970:                        AA = rtostr(A[I]);
                   20971:                else
                   20972:                        AA = rtostr(A)+rtostr(I);
                   20973:                for(J = LM = length(MI)-1; J >= 0; J--){
                   20974:                        V = MI[J];
                   20975:                        if(type(V) > 3)
                   20976:                                V = V[0];
                   20977:                        if(T0 == 0 || I == 0)
                   20978:                                MN = cons([V, makev([AA,J+Sft])], MN);
                   20979:                        else{
                   20980:                                if(LM == 1)
                   20981:                                        MN = cons([V, (J==0)?0:makev([AA])], MN);
                   20982:                                else if(I == 1 && Mat == 0)
                   20983:                                        MN = cons([V, (J==length(MI)-1)?0:makev([AA,J+Sft])], MN);
                   20984:                                else
                   20985:                                        MN = cons([V, (J==0)?0:makev([AA,J])], MN);
                   20986:                        }
                   20987:                }
                   20988:                MM = cons(MN, MM);
                   20989:        }
                   20990:        if(type(L) == 4 && length(L) >= 2){
                   20991:                R = chkspt(MM|mat=Mat); /* R[3]: Fuchs */
                   20992:                AA = var(MM[L[0]-1][L[1]-1][1]);
                   20993:                if(AA==0)  AA=var(R[3]);
                   20994:                if(AA!=0 && (P = mycoef(R[3],1,AA))!=0){
                   20995:                         P = -mycoef(R[3], 0, AA)/P;
                   20996:                         MM = mysubst(MM,[AA,P]);
                   20997:                }
                   20998:        }
                   20999:        return MM;
                   21000: }
                   21001:
                   21002: def intpoly(F,X)
                   21003: {
                   21004:        if((T=ptype(F,X))<4){
                   21005:                if(T<3){        /* polynomial */
                   21006:                        if(type(C=getopt(cos))>0){
                   21007:                                V=vars(F);
                   21008:                                Z=makenewv(V);
                   21009:                                W=makenewv(cons(Z,V));
                   21010:                                Q=intpoly(F,X|exp=Z);
                   21011:                                Q=(subst(Q,Z,@i*C)*(Z+@i*W)+subst(Q,Z,-@i*C)*(Z-@i*W))/2;
                   21012:                                return [mycoef(Q,1,Z),mycoef(Q,1,W)];
                   21013:                        }
                   21014:                        if(type(C=getopt(sin))>0){
                   21015:                                Q=intpoly(F,X|cos=C);
                   21016:                                return [-Q[1],Q[0]];
                   21017:                        }
                   21018:                        if(type(C=getopt(log))>0){
                   21019:                                Q=intpoly(F,X);
                   21020:                                if(C[0]==0) return [Q,0];
                   21021:                                if(length(C)<3) C=[C[0],C[1],1];
                   21022:                                Q-=subst(Q,X,-C[1]/C[0]);
                   21023:                                if(iscoef(Q,os_md.israt)) Q=red(Q);
                   21024:                                if(C[2]==0) return [Q];
                   21025:                                S=subst(-Q*C[0]*C[2],X,X-C[1]/C[0]);
                   21026:                                for(R=0,D=mydeg(S,X);D>0;D--) R+=mycoef(S,D,X)*X^(D-1);
                   21027:                                R=subst(R,X,X+C[1]/C[0]);
                   21028:                                return cons(Q,intpoly(R,X|log=[C[0],C[1],C[2]-1]));
                   21029:                        }
                   21030:                        if(type(C=getopt(exp))>0){
                   21031:                                D = mydeg(F,X);
                   21032:                                for(P=Q=F/C;D>=0;D--){
                   21033:                                        Q=-mydiff(Q,X)/C;
                   21034:                                        P+=Q;
                   21035:                                }
                   21036:                                return P;
                   21037:                        }
                   21038:                        for(P=0,I=mydeg(F,X);I >= 0;I--)
                   21039:                                P += mycoef(F,I,X)*X^(I+1)/(I+1);
                   21040:                        return P;
                   21041:                }
                   21042:                R=pfrac(F,X|root=2);    /* rational */
                   21043:                for(P=0;R!=[];R=cdr(R)){
                   21044:                        if(type(V=getopt(dumb))==5){
                   21045:                                for(PF=[],RR=R;RR!=[];RR=cdr(RR))
                   21046:                                        PF=cons(RR[0][0]/RR[0][1]^RR[0][2],PF);
                   21047:                                PF=[cons(X,reverse(PF))];
                   21048:                                if(P) PF=cons([1,P],PF);
                   21049:                                V[0]=cons(PF,V[0]);
                   21050:                        }
                   21051:                        RT=car(R);
                   21052:                        if(mydeg(RT[1],X)==0) P+=intpoly(RT[0]*RT[2],X);
                   21053:                        else if((Deg=mydeg(RT[1],X))==1){
                   21054:                                if(RT[2]>1) P+=RT[0]*RT[1]^(1-RT[2])/(1-RT[2])/mycoef(RT[1],1,X);
                   21055:                                else P+=RT[0]*log(RT[1])/mycoef(RT[1],1,X);
                   21056:                                P=red(P);
                   21057:                        }else if(Deg==2){
                   21058:                                D1=diff(RT[1],X);C1=mycoef(D1,1,X);
                   21059:                                B=2*C1*mycoef(RT[1],0,X)-mycoef(RT[1],1,X)^2;  /* ax^2+bx+c => B=4ac-b^2 */
                   21060:                                B=sqrt2rat(B);
                   21061:                                N=RT[0];
                   21062:                                for(I=RT[2];I>0&&N!=0;I--){
                   21063:                                        C0=mycoef(N,1,X)/C1;N-=C0*D1;
                   21064:                                        if(C0){
                   21065:                                                if(I>1) P-=C0/RT[1]^(I-1)/(I-1);
                   21066:                                                else P+=C0*log(RT[1]);
                   21067:                                        }
                   21068:                                        if(I>1){
                   21069:                                                BB=B/C1;
                   21070:                                                P+=N*X/RT[1]^(I-1)/(I-1)/BB;
                   21071:                                                N*=(2*I-3)/(I-1)/BB;
                   21072:                                        }else{
                   21073:                                                if(type(BR=sqrtrat(B))>3){
                   21074:                                                        mycat(["Cannot obtain sqare root of ",B]);
                   21075:                                                        return [];
                   21076:                                                }
                   21077:                                                if(real(nm(BR))!=0){
                   21078:                                                        P+=(2*N/BR)*atan(sqrt2rat(D1/BR|mult=1));
                   21079:                                                }else{
                   21080:                                                        BR*=@i;BRI=sqrt2rat(1/BR);
                   21081:                                                        R1=(-mycoef(RT[1],1,X)+BR)/C1;
                   21082:                                                        R2=(-mycoef(RT[1],1,X)-BR)/C1;
                   21083:                                                        P+=N*BRI*log( /* sqrt2rat */((x-R1)/(x-R2)));
                   21084:                                                }
                   21085:                                        }
                   21086:                                        P=red(P);
                   21087:                                }
                   21088:                                P=sqrt2rat(P);
                   21089:                        }else{
                   21090:                                mycat(["Cannot get an indefinite integral of ",F]);
                   21091:                                return [];
                   21092:                        }
                   21093:                }
                   21094:                Q=simplog(P,X);
                   21095:                if(type(V)==5&&nmono(P)!=nmono(Q)) V[0]=cons([[1,red(P)]],V[0]);
                   21096:                return red(Q);
                   21097:        }
                   21098:        return [];
                   21099: }
                   21100:
                   21101: def fshorter(P,X)
                   21102: {
                   21103:        Q=sqrt2rat(P);
                   21104:        R=trig2exp(Q,X|inv=1);
                   21105:        if(str_len(fctrtos(R))<str_len(fctrtos(Q))) Q=R;
                   21106:        Var=pfargs(Q,X|level=1);
                   21107:        for(C=F=0,R=1,V=Var;V!=[];V=cdr(V)){
                   21108:                if(findin(car(V)[1],[cos,sin,tan])>=0){
                   21109:                        if(!C){
                   21110:                                F=car(V)[2];
                   21111:                        }else{
                   21112:                                R=red(car(V)[2]/F);
                   21113:                                if(type(R)!=1) break;
                   21114:                                F/=dn(R);
                   21115:                        }
                   21116:                        C++;
                   21117:                }
                   21118:        }
                   21119:        if(getopt(period)==1) return F;
                   21120:        if(!isint(Log=getopt(log))) Log=0;
                   21121:        if(V==[]&&F!=0){
                   21122:                if(iand(Log,1)){
                   21123:                        H=append(cdr(fctr(nm(Q))),cdr(fctr(dn(Q))));
                   21124:                        for(L=0;H!=[];H=cdr(H))
                   21125:                                L+=str_len(rtostr(car(H)[0]));
                   21126:                }else L=str_len(fctrtos(Q));
                   21127:                S=trig2exp(P,X);
                   21128:                for(T=[sin(F),tan(F),cos(F),sin(F/2),cos(F/2),tan(F/2)];T!=[];T=cdr(T)){
                   21129:                        R=trig2exp(S,X|inv=car(T));
                   21130:                        if(iand(Log,1)){
                   21131:                                H=append(cdr(fctr(nm(R))),cdr(fctr(dn(R))));
                   21132:                                for(K=0;H!=[];H=cdr(H))
                   21133:                                        K+=str_len(rtostr(car(H)[0]));
                   21134:                        }else K=str_len(fctrtos(R));
                   21135:                        if(K<L){
                   21136:                                Q=R;L=K;
                   21137:                        }
                   21138:                }
                   21139:        }
                   21140:        return Q;
                   21141: }
                   21142:
                   21143: def isshortneg(P)
                   21144: {
                   21145:        return(str_len(rtostr(P))>str_len(rtostr(-P)))?1:0;
                   21146: }
                   21147:
                   21148: def simplog(R,X)
                   21149: {
                   21150:        for(V=[],Var=pfargs(R,X);Var!=[];Var=cdr(Var)){
                   21151:                VT=car(Var);
                   21152:                if(VT[1]==log && ptype(R,VT[0])==2 && mydeg(R,VT[0])==1)
                   21153:                        V=cons([VT[0],VT[2],mycoef(R,1,VT[0])],V);
                   21154:        }
                   21155:        for(;V!=[];V=cdr(V)){
                   21156:                VT=car(V);
                   21157:                for(V2=cdr(V);V2!=[];V2=cdr(V2)){
                   21158:                        Dn=1;
                   21159:                        if((C=red(car(V2)[2]/VT[2]))!=1&&C!=-1){
                   21160:                                if(getopt(mult)==1&&type(C)==1&&ntype(C)==0){
                   21161:                                        Dn=dn(C);C*=Dn;
                   21162:                                }else continue;
                   21163:                        }
                   21164:                        Log=red(VT[1]^Dn*car(V2)[1]^(Dn*C));
                   21165:                        L=str_len(rtostr(dn(Log)))-str_len(rtostr(nm(Log)));
                   21166:                        if(L>0 || (L==0&&isshortneg(VT[2])) ){
                   21167:                                Dn=-Dn;Log=1/Log;
                   21168:                        }
                   21169:                        R=mycoef(R,0,VT[0]);R=mycoef(R,0,car(V2)[0]);
                   21170:                        return(R+VT[2]*log(Log)/Dn);
                   21171:                }
                   21172:        }
                   21173:        return R;
                   21174: }
                   21175:
                   21176: def integrate(P,X)
                   21177: {
                   21178:        Dvi=getopt(dviout);
                   21179:        if(type(I=getopt(I))==4){
                   21180:                if((R=integrate(P,X))==[]) II="?";
                   21181:                else if(type(I[0])>3||type(I[1])>3){
                   21182:                        R=subst(R,X,x);
                   21183:                        V=flim(R,I[0]);VV=flim(R,I[1]);
                   21184:                        if(V==""||VV=="") II="?";
                   21185:                        else if(type(V)==7||type(VV)==7){
                   21186:                                if(V==VV) II="?";
                   21187:                                else II=(VV=="+"||V=="-")?"\\infty":"-\\infty";
                   21188:                        }else{
                   21189:                                II=VV-V;
                   21190:                                if(II>10^10) II="\\infty";
                   21191:                                else if(II<-10^10) II="-\\infty";
                   21192:                        }
                   21193:                }else{
                   21194:                        V=subst(R,X,I[1])-subst(R,X,I[0]);
                   21195:                        VV=myval(V);
                   21196:                        II=(type(VV)>=2||ntype(VV)<1)?VV:evalred(V);
                   21197:                }
                   21198:                if(type(Dvi)!=1) return II;
                   21199:                I=ltov(I);
                   21200:                for(J=0;J<2;J++){
                   21201:                        if(type(I[J])>3){
                   21202:                                if(type(I[J])==4&&length(I[J])>1) I[J]=I[J][1];
                   21203:                                else I[J]=(J==0)?"-\\infty":"\\infty";
                   21204:                        }
                   21205:                        if(type(I[J])<4) I[J]=my_tex_form(I[J]);
                   21206:                }
                   21207:                S=(type(II)==7)?II:my_tex_form(II);
                   21208:                S="\\int_{"+I[0]+"}^{"+I[1]+"}"+monototex(P)+"\\,d"+my_tex_form(X)+"&="+S;
                   21209:                if(Dvi==1) dviout(texbegin("align",S));
                   21210:                return S;
                   21211:        }
                   21212:        if(isint(Dvi)==1){
                   21213:                if(Dvi==2||getopt(dumb)==-1){
                   21214:                        V=newvect(1);V[0]=[];
                   21215:                }else V=0;
                   21216:                if((RR=integrate(P,X|dumb=V))==[]) return R;
                   21217:                S=fshorter(RR,X);
                   21218:                VV=[X];
                   21219:                if(V!=0){
                   21220:                        R=cons([[1,RR]],V[0]);
                   21221:                        if(S!=RR) R=cons([[1,RR=S]],R);
                   21222:                        for(V=FR=[];R!=[];R=cdr(R))
                   21223:                                if(car(R)!=FR) V=cons(FR=car(R),V);
1.21      takayama 21224:                        Var=varargs(V|all=2);
1.6       takayama 21225:                        for(S0=[x0,x1,x2,x3],S=[t,s,u,v,w];S0!=[]&&S!=[];){
                   21226:                                if(findin(car(S0),Var)<0){
                   21227:                                        S0=cdr(S0); continue;
                   21228:                                }
                   21229:                                if(findin(car(S),Var)>=0){
                   21230:                                        S=cdr(S); continue;
                   21231:                                }
                   21232:                                V=subst(V,[car(S0),car(S)]);S0=cdr(S0);S=cdr(S);
                   21233:                        }
                   21234:                        if(Dvi==-2) return V;
                   21235:                        S1="\\,dx&";
                   21236:                }else{
                   21237:                        V=[[],[[1,RR=S]]];
                   21238:                        S1="\\,dx";
                   21239:                }
                   21240:                if(type(P)>2){
                   21241:                        if(type(nm(P))<2){
                   21242:                                P=P*dx;S1=V?"&":"";
                   21243:                        }
                   21244:                        S=fctrtos(P|TeX=2,lim=0);SV0=my_tex_form(P);
                   21245:                        if(str_len(SV0)<str_len(S)) S=SV0;
                   21246:                }else S=monototex(P);
                   21247:                if(Dvi!=-2) S="\\int "+S+S1;
                   21248:                else S="";
                   21249:                for(L=[],V=cdr(V);V!=[];V=cdr(V)){
                   21250:                        CL=car(V);S0=["="];     /* a line */
                   21251:                        for(FL=0;CL!=[];CL=cdr(CL),FL++){
                   21252:                                CT=car(CL);                     /* a term */
                   21253:                                if((Y=CT[0])==0){       /* a variable */
                   21254:                                        CT=cdr(CT);
                   21255:                                        if(length(CT)>2) CT=cdr(CT);
                   21256:                                        S0=["\\qquad(",CT[0],"=",CT[1],")"];
                   21257:                                        break;
                   21258:                                }else{
                   21259:                                        for(FT=0,S2=[],CT=cdr(CT);CT!=[];CT=cdr(CT),FT++){
                   21260:                                        SV=fctrtos(car(CT)|TeX=2,lim=0);SV0=my_tex_form(car(CT));
                   21261:                                                if(str_len(SV0)<str_len(SV)) SV=SV0;
                   21262:                                                if(FL||FT||(F&&type(Y)<2)) SV=minustos(SV);
                   21263:                                                S2=append(["+",SV],S2);
                   21264:                                        }
                   21265:                                        S2=reverse(cdr(S2));
                   21266:                                        if(type(Y)>1){
                   21267:                                                if(length(S2)>1){
                   21268:                                                        S1="\\int\\left(";S3="\\right)\\,d";
                   21269:                                                }else{
                   21270:                                                        S1="\\int";S3="\\,d";
                   21271:                                                }
                   21272:                                                S2=cons(S1,append(S2,[S3,Y]));
                   21273:                                                if(findin(Y,VV)<0) VV=cons(Y,VV);
                   21274:                                        }
                   21275:                                        if(FL) S0=append(S0,cons("+",S2));
                   21276:                                        else S0=append(S0,S2);
                   21277:                                }
                   21278:                        }
                   21279:                        L=append([S0],L);
                   21280:                };
                   21281:                V=pfargs(RR,X|level=1);
                   21282:                for(Var=[];V!=[];V=cdr(V)) Var=cons(car(V)[0],Var);
                   21283:                Var=reverse(Var);
                   21284:                if(!isint(J=getopt(frac))) J=0;;
                   21285:                if(!iand(J,4)&&(!iand(J,2)||length(Var)==1)&&(iand(J,8)==8||ptype(RR,Var)==2)){
                   21286:                        F=1;
                   21287:                        if(iand(J,1)){
                   21288:                                K=str_len(fctrtos(RR));
                   21289:                                I=str_len(fctrtos(RR|var=Var));
                   21290:                                if(I>=K) F=0;
                   21291:                        }
                   21292:                        if(F){
                   21293:                                V=[fctrtos(RR|var=Var,TeX=2)];
                   21294:                                if(Dvi!=-2) V=cons("=",V);
                   21295:                                if(length(L)>0) L=cdr(L);
                   21296:                                L=append([V],L);
                   21297:                        }
                   21298:                }else if(ptype(RR,X)==2){
                   21299:                        L=cdr(L);
                   21300:                        V=[fctrtos(RR|var=X,TeX=2)];
                   21301:                        if(Dvi!=-2) V=cons("=",V);
                   21302:                        L=append([V],L);
                   21303:                }
                   21304:                S=texket(S+ltotex(reverse(L)|opt=["cr","spts0"],str=1));
                   21305:                if(getopt(log)!=1){
                   21306:                        for(V=[];VV!=[];VV=cdr(VV))
                   21307:                                V=cons(strtoascii(my_tex_form(car(VV))),V);
                   21308:                        S1=strtoascii("\\log");
                   21309:                        for(F=1;F;){    /* log(log(x)) */
                   21310:                                F=FT=0;
                   21311:                                S0=strtoascii(S);       /* log(x)  ->  log|x| */
                   21312:                                L=length(S0);
                   21313:                                S2=str_tb(0,0);
                   21314:                                for(I=0;;){
                   21315:                                        if(I>=L||(J=str_str(S0,S1|top=I+FT))<0){
                   21316:                                                S=str_tb(0,S2)+str_cut(S0,I,100000);
                   21317:                                                break;
                   21318:                                        }
                   21319:                                        if((K=str_str(S0,40|top=J+4))<0
                   21320:                                                ||(K!=J+4&&K!=J+9)||(N=str_pair(S0,K+1,40,41))<0){
                   21321:                                                FT=J-I+4;continue;
                   21322:                                        }
                   21323:                                        FT=0;
                   21324:                                        if(str_str(S0,V|top=K+1,end=N-1)[0]<0) S2=str_tb(str_cut(S0,I,N),S2);
                   21325:                                        else{
                   21326:                                        /* log(a) -> log(a) */
                   21327:                                                F=1;
                   21328:                                                if(N<L-1&&S0[N+1]==94){         /* log(x)^2 -> (log|x|)^2 */
                   21329:                                                        S2=str_tb([str_cut(S0,I,J-1),"\\left(",str_cut(S0,J,K-1),
                   21330:                                                        "|",str_cut(S0,K+1,N-1),"|\\right)"],S2);
                   21331:                                                }
                   21332:                                                else S2=str_tb([str_cut(S0,I,K-1),"|",str_cut(S0,K+1,N-1),"|"],S2);
                   21333:                                        }
                   21334:                                        I=N+1;
                   21335:                                }
                   21336:                        }
                   21337:                }
                   21338:                if(Dvi>0){
                   21339:                        dviout(texbegin("align*",S));
                   21340:                        return 1;
                   21341:                }
                   21342:                return S;
                   21343:        }       /* end of dviout */
                   21344:        SM=["Cannot integrate",P,"at present"];
                   21345:        P=sqrt2rat(P|mult=1);
                   21346:        Dumb2=1;Dumb3=0;W=newvect(1);W[0]=[];
                   21347:        if(type(Dumb=getopt(dumb))==5){
                   21348:                Dumb2=Dumb3=Dumb;D2=W;
                   21349:        }else if(!isint(Dumb)) Dumb=0;
                   21350:        if(Dumb==-1){
                   21351:                Dumb2=Dumb3=-1;
                   21352:        }
                   21353:        if(type(Dumb)!=5) D2=Dumb2;
                   21354:        if(!isint(Mul=getopt(mult))) Mul=0;
                   21355:        else Mul++;
                   21356:        if(type(VAR=getopt(var))!=4) VAR=[];
                   21357:        if(type(P)>4) return [];
                   21358:        if(iand(T=ptype(P=red(P),X),63)>3||Mul>4){
                   21359:                if(Dumb!=1) mycat(SM);
                   21360:                return [];
                   21361:        }
                   21362:        if(Dumb==-1) mycat(["integrate", P]);
                   21363:        else if(type(Dumb)==5) Dumb[0]=cons([[X,P]],Dumb[0]);
                   21364:        if(T<4 && (T<3||iscoef(P,os_md.israt))){
                   21365:                if(Dumb==-1) mycat(["rational function",P]);
                   21366:                else if(type(Dumb)==5) Dumb[0]=cons([[X,P]],Dumb[0]);
                   21367:                return intpoly(P,X|dumb=Dumb);  /* rational function */
                   21368:        }
                   21369:        Var=pfargs(P,X);
                   21370:        for(F=0,VV=Var;VV!=[];VV=cdr(VV)){
                   21371:                        /* p(x)*log(x^2-1), @e^x,  a^x, f(x)^(m/n) etc.->simplify */
                   21372:                V=car(VV);
                   21373:                if(V[1]==log && (T=ptype(V[2],X))>1 && T<4){
                   21374:                        if(mydeg(dn(V[2]),X)>0||mydeg(nm(V[2]),X)>1){
                   21375:                                FC=pfctr(V[2],X);RV=1;
                   21376:                                if(length(FC)>2){
                   21377:                                        RR=0;RV=1;
                   21378:                                        if((F0=car(FC)[0])!=1){
                   21379:                                                if(type(F0)!=1 && F0<0){
                   21380:                                                        for(FT=cdr(FT);FT!=[];FT=cdr(FT)){
                   21381:                                                                if(iand(car(FT)[1],1)){
                   21382:                                                                        RV=-1;F0=-F0;break;
                   21383:                                                                }
                   21384:                                                        }
                   21385:                                                }
                   21386:                                        }
                   21387:                                        if(F0!=1) RR=log(F0);
                   21388:                                        for(FC=cdr(FC);FC!=[];FC=cdr(FC)){
                   21389:                                                if(RV==-1&&iand(car(FC)[1],1)==1){
                   21390:                                                        RR+=car(FC)[1]*log(-car(FC)[0]);
                   21391:                                                        RV=1;
                   21392:                                                }else
                   21393:                                                        RR+=car(FC)[1]*log(car(FC)[0]);
                   21394:                                        }
                   21395:                                        P=subst(P,V[0],RR);
                   21396:                                        F=1;
                   21397:                                }
                   21398:                        }
                   21399:                        F=1;
                   21400:                }else if(V[1]==pow){
                   21401:                        if(ptype(V[2],X)==1){
                   21402:                                F=1;
                   21403:                                if(V[2]==@e){   /* @e^(f(x)) */
                   21404:                                        P=subst(P,V[0],exp(V[3]));
                   21405:                                }else P=subst(P,V[0],exp(log(V[2])*V[3]));
                   21406:                        }else if(type(V[3])<=1 && ntype(V[3])==0){      /* r(x)^(m/n) */
                   21407:                                if((Pw=floor(V[3]))!=0){
                   21408:                                        R=V[2]^Pw;
                   21409:                                        if((PF=V[3]-Pw)!=0) R*=V[2]^PF;
                   21410:                                        P=subst(P,V[0],R);
                   21411:                                        F=1;
                   21412:                                        V=[V[2]^PF,V[1],V[2],PF];
                   21413:                                }
                   21414:                                if(ptype(nm(V[2]),X)<2&&V[3]>0){        /* (1/p(x))^(m/n) */
                   21415:                                        P=subst(P,V[0],V[2]*red(1/V[2])^(1-V[3]));
                   21416:                                        F=0;VV=cons(0,Var=pfargs(P,X));continue;
                   21417:                                }
                   21418:                                if(ptype(V[2],X)<4&&(K=dn(V[3]))>1){
                   21419:                                        V2=red(V[2]);
                   21420:                                        DN=mydeg(nm(V2),X);DD=mydeg(dn(V2),X);
                   21421:                                        if(DN+DD>1){
                   21422:                                                VF=pfctr(V2,X);
                   21423:                                                R=car(VF)[0]^(car(VF)[1]);RR=0;
                   21424:                                                for(VF=cdr(VF);VF!=[];VF=cdr(VF)){
                   21425:                                                        TV=car(VF);TM=TV[1];
                   21426:                                                        while(abs(TM)>=K){
                   21427:                                                                RR=1;
                   21428:                                                                if(TM>0){
                   21429:                                                                        TM-=K;
                   21430:                                                                        RR*=TV[0]^nm(V[3]);
                   21431:                                                                }else{
                   21432:                                                                        TM+=K;
                   21433:                                                                        RR/=TV[0]^nm(V[3]);
                   21434:                                                                }
                   21435:                                                        }
                   21436:                                                        if(TM!=0) R*=TV[0]^TM;
                   21437:                                                }
                   21438:                                                if(RR){
                   21439:                                                        P=subst(P,V[0],RR*red(R)^(V[3]));F=1;
                   21440:                                                        F=0;VV=cons(0,Var=pfargs(P,X));continue;
                   21441:                                                }
                   21442:                                        }
                   21443:                                }
                   21444:                        }
                   21445:                }
                   21446:        }
                   21447:        if(F){
                   21448:                P=sqrt2rat(P|mult=1);
                   21449:                Var=pfargs(P=red(P),X);T=ptype(P,X);
                   21450:                if(T<4 && (T<3||iscoef(P,os_md.israt))){
                   21451:                        if(Dumb==-1) mycat(["rational function",P]);
                   21452:                        else if(type(Dumb)==5){
                   21453:                                Dumb[0]=cons([[X,P]],Dumb[0]);
                   21454:                                return intpoly(P,X|dumb=Dumb3);
                   21455:                        }
                   21456:                        return intpoly(P,X);    /* rational function */
                   21457:                }
                   21458:        }
                   21459: #if 1
                   21460:        for(P0=P,V=pfargs(P,X|level=1);V!=[];V=cdr(V))  /* P:tan(x) -> P0:sin(x)/cos(x) */
                   21461:                if(car(V)[1]==tan) P0=red(subst(P0,car(V)[0],sin(car(V)[2])/cos(car(V)[2])));
                   21462:        if(iand(ptype(P0,X),128)){                                              /* (log f)'=f'/f */
                   21463:                for(Df=cdr(fctr(dn(P0)));Df!=[];Df=cdr(Df)){
                   21464:                        if(!iand(ptype(car(Df)[0],X),64)) continue;
                   21465:                        Q=car(Df)[0]^(car(Df)[1]);QQ=red(dn(P0)/Q);
                   21466:                        DQ=red(diff(Q,X)*QQ);
                   21467:                        if(type(C=DQ/nm(P0))<2&&C!=0){
                   21468:                                PP=0;DN=[1];
                   21469:                        }else for(DN=cdr(fctr(DQ));DN!=[];DN=cdr(DN)){
                   21470:                                Y=car(DN)[0];
                   21471:                                if(!iand(ptype(Y,X),64)||(I=mydeg(nm(P0),Y))!=mydeg(DQ,Y)
                   21472:                                  || ptype((C=red(mycoef(nm(P0),I,Y)/mycoef(DQ,I,Y))),X)>1||C==0) continue;
                   21473:                                PP=red(P0-C*diff(Q,X)/Q);
                   21474:                                if(nmono(P0)>nmono(PP)) break;
                   21475:                        }
                   21476:                        if(DN!=[]){
                   21477:                                R=C*log(Q);
                   21478:                                if(PP==0){
                   21479:                                        if(P!=P0&&type(Dumb)==5) Dumb[0]=cons([[X,P0]],Dumb[0]);
                   21480:                                        return R;
                   21481:                                }
                   21482:                                W[0]=[];
                   21483:                                S=integrate(PP,X|dumb=D2);
                   21484:                                if(S!=[]){
                   21485:                                        if(type(Dumb)==5){
                   21486:                                                Dumb[0]=cons([[X,red(P0-PP),PP]],Dumb[0]);
                   21487:                                                TD=W[0];
                   21488:                                                for(W0=[],TD=reverse(TD);TD!=[];TD=cdr(TD)){
                   21489:                                                        if(car(TD)[0][0]){
                   21490:                                                                WL=cons([1,R],car(TD));
                   21491:                                                                Dumb[0]=cons(WL,Dumb[0]);
                   21492:                                                        }
                   21493:                                                        else Dumb[0]=cons(car(TD),Dumb[0]);
                   21494:                                                }
                   21495:                                        }
                   21496:                                        return red(R+S);
                   21497:                                }
                   21498:                        }
                   21499:                }
                   21500:        }
                   21501: #endif
                   21502:        if((length(Var)==1||getopt(exe)==1) &&  /* p(x)*atan(q(x))^m+r(x), etc */
                   21503:          findin((VT=car(Var))[1],[atan,asin,acos,log])>=0 && ptype(P,VT[0])==2 &&
                   21504:                (VT[1]!=log||(T!=65&&T!=66)||mydeg(VT[2],X)!=1)){ /* exclude x*log(x+1)^2 */
                   21505:                for(R=0,D=mydeg(P,VT[0]);D>=0;D--){
                   21506:                        Q=S=mycoef(P,D,VT[0]);
                   21507:                        if(S){
                   21508:                                if(D>0){
                   21509:                                        if((Q=integrate(S,X|mult=Mul))==[]) return Q;
                   21510:                                }else{
                   21511:                                        W[0]=[];
                   21512:                                        if((Q=integrate(S,X|dumb=D2,var=VAR,mult=Mul))==[]) return Q;
                   21513:                                        if(type(Dumb)==5){
                   21514:                                                TD=W[0];
                   21515:                                                for(W0=[],TD=reverse(TD);TD!=[];TD=cdr(TD)){
                   21516:                                                        if(car(TD)[0][0]){
                   21517:                                                                WL=cons([1,R],car(TD));
                   21518:                                                                Dumb[0]=cons(WL,Dumb[0]);
                   21519:                                                        }
                   21520:                                                        else Dumb[0]=cons(car(TD),Dumb[0]);
                   21521:                                                }
                   21522:                                                if(car(Dumb[0])!=[[1,R],[1,Q]])
                   21523:                                                        Dumb[0]=cons([[1,R,Q]],Dumb[0]);
                   21524:                                        }
                   21525:                                        return red(R+Q);
                   21526:                                }
                   21527:                        }else if(D>0) continue;
                   21528:                        if(D==0){
                   21529:                                if(Q!=0&&type(Dumb)==5) Dumb[0]=cons([[1,R,Q]],Dumb[0]);
                   21530:                                return red(Q+R);
                   21531:                        }
                   21532:                        R0=Q*VT[0]^D;
                   21533:                        P=(P0=P)-S*VT[0]^D-Q*diff(VT[0]^D,X);
                   21534:                        if(mydeg(P,VT[0])>=D){          /* (x+1)*log(x)/x^2 */
                   21535:                                if(mydeg(P,VT[0])==D &&
                   21536:                                  ptype(C=red(mycoef(P,D,VT[0])/diff(VT[0],X)),VT[0])<2){
                   21537:                                        P=P0-(S*VT[0]^D+Q*diff(VT[0]^D,X)+C*diff(VT[0]^(D+1),X)/(D+1));
                   21538:                                        R0+=C*VT[0]^(D+1)/(D+1);
                   21539:                                }else{
                   21540:                                        P=P0;
                   21541:                                        if(Dumb!=1) mycat(SM);
                   21542:                                        return [];
                   21543:                                }
                   21544:                        }
                   21545:                        if(type(Dumb)==5){
                   21546:                                if(P) Dumb[0]=cons([R?[1,R,R0]:[1,R0],[X,P]],Dumb[0]);
                   21547:                                else if(R!=0) Dumb[0]=cons([[1,R,R0]],Dumb[0]);
                   21548:                        }
                   21549:                        R+=R0;
                   21550:                }
                   21551:        }
                   21552:        if(length(Var)==1 && (VT=car(Var))[1]==pow && mydeg(P,VT[0])==1 && (PT=ptype(VT[2],X))<4){
                   21553:                PR=mycoef(P,0,VT[0]);
                   21554:                if(RR!=0){
                   21555:                        RR=integrate(RR,X|dumb=Dumb3,var=Var);
                   21556:                        if(RR==[]) return RR;
                   21557:                }
                   21558:                PW=VT[3];
                   21559:                if((D=mydeg(nm(V2=VT[2]),X))==2&&PT==2){        /* f(x)*(ax^2+bx+c)^(m/2)+r(x) */
                   21560:                        if(isint(2*PW)){
                   21561:                                C2=mycoef(V20=V2,2,X);F=1;
                   21562:                                if((C21=sqrtrat(C2))==[]) return [];
                   21563:                                if(imag(C21)!=0){
                   21564:                                        if(real(C21)!=0) return [];
                   21565:                                        C21=C21/@i;F=-1;
                   21566:                                }
                   21567:                                if(type(C21)>3) return [];
                   21568:                                P=subst(P,X,X/C21);VT=mysubst(VT,[X,X/C21]);V2=VT[2];
                   21569:                                C1=mycoef(V2,1,X)/F/2;
                   21570:                                if(C1!=0){
                   21571:                                        P=subst(P,X,X-C1);VT=mysubst(VT,[X,X-C1]);V2=VT[2];
                   21572:                                }
                   21573:                                C0=mycoef(V2,0,X);
                   21574:                                if((C01=sqrtrat(C0))==[]) return [];
                   21575:                                if(imag(nm(C01))!=0){
                   21576:                                        if(real(nm(C01))!=0) return [];
                   21577:                                        C01=C01/@i;G=-1;
                   21578:                                }else G=1;
                   21579:                                if(type(C01)>3||(F==-1&&G==-1)) return [];
                   21580:                                Y=makenewv([P,VAR]|var=x);
                   21581:                                if(F==-1){                              /* (c^2-x^2)^(1/2) */
                   21582:                                        Q=subst(P,VT[0],(C01*cos(Y))^(2*PW),X,YX=C01*sin(Y))
                   21583:                                                *C01*cos(Y)/C21;
                   21584:                                        SY=(C21*X+C1);CY=V20;YY=asin(sqrt2rat((C21*X+C1)/C01|mult=1));
                   21585:                                }else if(G==-1){                /* (x^2-c^2)^(1/2) */
                   21586:                                        Q=subst(P,VT[0],(C01*sin(Y)/cos(Y))^(2*PW),X,YX=C01/cos(Y))
                   21587:                                                *C01*sin(Y)/cos(Y)^2/C21;
                   21588:                                        SY=V20;CY=1/(C21*X+C1);YY=acos(sqrt2rat(C01*(C21*X+C1)|mult=1));
                   21589:                                }else{  /* (x^2+c^2)^(1/2) */
                   21590:                                        Q=subst(P,VT[0],(C01/cos(Y))^(2*PW),X,YX=C01*sin(Y)/cos(Y))
                   21591:                                                *C01/cos(Y)^2/C21;
                   21592:                                        CY=V20; YY=atan(sqrt2rat((C21*X+C1)/C01|mult=1));
                   21593:                                }
                   21594:                                if(Dumb==-1) mycat([C21*X+C1,"=",YX]);
                   21595:                                else if(type(Dumb)==5) Dumb[0]=cons([[0,Y,C21*X+C1,YX]],Dumb[0]);
                   21596:                                Q=sqrt2rat(Q);
                   21597:                                QQ=red(substblock(nm(Q),sin(Y),sin(Y)^2,1-cos(Y)^2)
                   21598:                                        /substblock(dn(Q),sin(Y),sin(Y)^2,1-cos(Y)^2));
                   21599:                                if(cmpsimple(QQ,Q|comp=2)<0) Q=QQ;
                   21600:                                QQ=red(substblock(nm(Q),cos(Y),cos(Y)^2,1-sin(Y)^2)
                   21601:                                        /substblock(dn(Q),cos(Y),cos(Y)^2,1-sin(Y)^2));
                   21602:                                if(cmpsimple(QQ,Q|comp=2)<0) Q=QQ;
                   21603:                                if((Q=integrate(Q,Y|dumb=Dumb2,var=cons(X,Var)))==[]) return [];
                   21604:                                Q=trig2exp(Q,Y|inv=cos(Y));
                   21605:                                for(V=vars(Q);V!=[];V=cdr(V)){
                   21606:                                        FA=funargs(car(V));
                   21607:                                        if(type(FA)==4&&FA[0]==log){
                   21608:                                                QQ=trig2exp(FA[1],Y|inv=cos(Y));
                   21609:                                                Q=mycoef(Q,0,car(V))+mycoef(Q,1,car(V))*log(QQ);
                   21610:                                        }
                   21611:                                }
                   21612:                                if(type(Dumb)==5) Dumb[0]=cons([[1,Q]],Dumb[0]);
                   21613:                                if(F==-1) Q=subst(Q,sin(Y),SY/C01,cos(Y),CY^(1/2)/C01,Y,YY);
                   21614:                                else if(G==-1){
                   21615:                                        Q=red(subst(Q,sin(Y),SY^(1/2)*cos(Y)/C01));
                   21616:                                        Q=red(subst(Q,cos(Y),C01*CY,Y,YY));
                   21617:                                }else{
                   21618:                                        Q=red(subst(Q,sin(Y),(C21*X+C1)*cos(Y)/C01));
                   21619:                                        Nm=substblock(nm(Q),cos(Y),C01^2/CY,cos(Y)^2);
                   21620:                                        Nm=subst(Nm,cos(Y),C01/CY^(1/2));
                   21621:                                        Dn=substblock(dn(Q),cos(Y),C01^2/CY,cos(Y)^2);
                   21622:                                        Dn=subst(Dn,cos(Y),C01/CY^(1/2));
                   21623:                                        Q=red(subst(Nm/Dn,Y,YY));
                   21624:                                }
                   21625:                                if(findin(Y,vars(Q))>=0) return [];
                   21626:                                for(R=[],Var=vars(Q);Var!=[];Var=cdr(Var)){
                   21627:                                        VT=funargs(V=car(Var));
                   21628:                                        if(type(VT)==4&&VT[0]==log&&ptype(VT[1],X)>60&&mydeg(Q,V)==1)
                   21629:                                                R=cons([mycoef(Q,1,V),V],R);
                   21630:                                }
                   21631:                                if(length(R)==2 && (R[0][0]==R[1][0]||R[0][0]+R[1][0]==0)){
                   21632:                                        R0=args(R[0][1])[0];R1=args(R[1][1])[0];
                   21633:                                        if(R[0][0]==R[1][0]) S=R0*R1;
                   21634:                                        else S=R1/R0;
                   21635:                                        Q=mycoef(Q,0,R[0][1]);Q=mycoef(Q,0,R[1][1]);
                   21636:                                        Q+=R[1][0]*log(red(S));
                   21637:                                }
                   21638:                                for(Var=vars(Q);Var!=[];Var=cdr(Var)){
                   21639:                                        VT=funargs(car(Var));
                   21640:                                        if(type(VT)==4&&VT[0]==log&&ptype(VT[1],X)>60){
                   21641:                                                S=trig2exp(VT[1],X|inv=cos(X),arc=1);
                   21642:                                                if(ptype(dn(S),X)<2 && mydeg(Q,car(Var))==1
                   21643:                                                  && ptype(mycoef(Q,1,car(Var)),X)<2){
                   21644:                                                        S=nm(S);
                   21645:                                                        SF=fctr(S);
                   21646:                                                        S/=SF[0][0];
                   21647:                                                }
                   21648:                                                if(cmpsimple(S,-S)>0) S=-S;
                   21649:                                                Q=subst(Q,car(Var),log(S));
                   21650:                                        }
                   21651:                                }                                       /*  x/(1-x^2)^(1/2)  */
                   21652:                                if(type(Q=red(Q+RR))==2&&type(Dumb)!=5) Q-=cterm(Q);
                   21653:                                if(Dumb==-1) mycat(["->",Q]);
                   21654:                                else if(type(Dumb)==5) Dumb[0]=cons([[1,Q]],Dumb[0]);
                   21655:                                return Q;
                   21656:                        }
                   21657:                }else if(D==1 && mydeg(Dn=dn(V2),X)<2 && type(PW)==1 && ntype(PW)==0 &&
                   21658:                  (V2!=X||ptype(mycoef(P,1,VT[0]),X)>2)){  /* p(x)((ax+b)/(cx+d))^(m/n) */
                   21659:                        PN=nm(PW);PD=dn(PW);
                   21660:                        Y=makenewv([P,VAR]|var=x);Q=Y^PD*Dn-nm(V2);F=-mycoef(Q,0,X)/mycoef(Q,1,X);
                   21661:                        Q=red(subst(P,VT[0],Y^PN,X,F)*diff(F,Y));
                   21662:                        if(Dumb==-1) mycat([Y,"=",V2^(1/PD)]);
                   21663:                        else if(type(Dumb)==5) Dumb[0]=cons([[0,Y,V2^(1/PD)]],Dumb[0]);
                   21664:                        if((Q=integrate(Q,Y|dumb=Dumb3,var=cons(X,Var)))==[]) return [];
                   21665:                        Q=red(Q);
                   21666:                        QN=subst(substblock(nm(Q),Y,Y^PD,V2),Y,V2^(1/PD));
                   21667:                        QD=subst(substblock(dn(Q),Y,Y^PD,V2),Y,V2^(1/PD));
                   21668:                        Q=red(QN/QD+RR);
                   21669:                        if(Dumb==-1) mycat(["->",Q]);
                   21670:                        else if(type(Dumb)==5) Dumb[0]=cons([[1,Q]],Dumb[0]);
                   21671:                        return Q;
                   21672:                }
                   21673:        }else if(length(Var)==2 &&              /* r(x,(ax+b)^(1/2),(cx+d)^(1/2)) */
                   21674:                (VT=car(Var))[1]==pow && ptype(VT[2],X)==1 && mydeg(VT[2],X)==1 && VT[3]==1/2 &&
                   21675:          (VS=car(car(Var)))[1]==pow && ptype(VS[2],X)==1 && mydeg(VS[2],X)==1 && VS[3]==1/2){
                   21676:                Y=makenewv([P,VAR]|var=x);R=(Y^2-myceof(VS[0],0,X))/(C=mycoef(VS[0],1,X));
                   21677:                if(Dumb==-1) mycat([Y,"=",VS[0]]);
                   21678:                else if(type(Dumb)==5) Dumb[0]=cons([[0,Y,VD[0]]],Dumb[0]);
                   21679:                R=integrate(subst(P,VS[0],Y,X,R)*2*Y/C,Y|dumb=Dumb3,var=cons(X,Var));
                   21680:                if(R!=[]){
                   21681:                        R=subst(substblock(R,Y,VS[0],Y^2),Y,VS[0]);
                   21682:                        if(Dumb==-1) mycat(["->",R]);
                   21683:                        else if(type(Dumb)==5) Dumb[0]=cons([[1,R]],Dumb[0]);
                   21684:                }
                   21685:                return R;
                   21686:        }
                   21687:        if(T==65||T==66){       /* polynomial including sin, exp etc */
                   21688:                for(F=0,VT=Var;VT!=[];VT=cdr(VT)){
                   21689:                        VTT=car(VT);
                   21690:                        if(ptype(VTT[2],X)>2||mydeg(VTT[2],X)>1) F=ior(F,256); /* compos. or rat. or nonlin. */
                   21691:                        K=findin(VTT[1],[cos,sin,tan,exp,log,pow]);
                   21692:                        F=ior(F,2^(K+1)); /* 1:other,2:cos,4:sin,8:tan,16:exp,32:log,64:pow */
                   21693:                        if((Deg=mydeg(P,VTT[0]))>1&&K!=4) F=ior(F,1024);        /* nonlinear */
                   21694:                        if(K==5 && (ptype(VTT[3],X)!=0 || VTT[2]!=x||Deg>1)) F=ior(F,8192); /* pow */
                   21695:                        for(;Deg>0;Deg--){ /* coef */
                   21696:                                if(ptype(mycoef(P,Deg,VTT[0]),X)>2){
                   21697:                                        if(K==4||K==5) F=ior(F,2048);  /* exp, log */
                   21698:                                        else F=ior(F,4096);
                   21699:                                }
                   21700:                        }
                   21701:                }
                   21702:                if(!iand(F,1+8+64+256+512+2048+8192)){  /* cos,sin,exp,log^n,x^c */
                   21703:                        if(iand(F,1024+4096)&&!iand(F,32+64)){ /* cos,sin,exp */
                   21704:                                if(type(Dumb)==5){
                   21705:                                        S=trig2exp(P,X|inv=1);
                   21706:                                        if(P!=S) Dumb[0]=cons([[X,S]],Dumb[0]);
                   21707:                                }
                   21708:                                R=integrate(trig2exp(P,X),X);
                   21709:                                if(R!=[]) S=trig2exp(R,X|inv=1);
                   21710:                                R=fshorter(S,X);
                   21711:                                if(type(Dumb)==5&&R!=S){
                   21712:                                        Dumb[0]=cons([[1,S]],Dumb[0]);
                   21713:                                }
                   21714:                                return R;
                   21715:                        }
                   21716:                        for(R=0,VT=Var;VT!=[];VT=cdr(VT)){
                   21717:                                CV=car(VT);
                   21718:                                C0=mycoef(CV[2],0,X);C1=mycoef(CV[2],1,X);
                   21719:                                Q=mycoef(P,1,CV[0]);
                   21720:                                if(CV[1]==sin||CV[1]==cos){
                   21721:                                        TR=(CV[1]==sin)?intpoly(Q,X|sin=C1):intpoly(Q,X|cos=C1);
                   21722:                                        R+=TR[0]*cos(CV[2])+TR[1]*sin(CV[2]);
                   21723:                                }else if(CV[1]==exp){
                   21724:                                        QT=exp(CV[2]);
                   21725:                                        for(V2=vars(C1);V2!=[];V2=cdr(V2)){  /* exp(2*log(a)*x) => a^(2*x) */
                   21726:                                                if(vtype(VA=car(V2))==2&&functor(VA)==log){
                   21727:                                                        if(ptype(C1,VA)!=2||mydeg(C1,VA)==1&&mycoef(C1,0,VA)==0){
                   21728:                                                                QT=args(VA)[0]^(red(C1/VA)*X);
                   21729:                                                                if(C0!=0) QT*=exp(C0);
                   21730:                                                                break;
                   21731:                                                        }
                   21732:                                                }
                   21733:                                        }
                   21734:                                        R+=intpoly(Q,X|exp=C1)*QT;
                   21735:                                }else if(CV[1]==pow)
                   21736:                                        R+=intpoly(Q,X|pow=CV[2])*x^CV[2];
                   21737:                                else if(CV[1]==log){
                   21738:                                        for(Deg=mydeg(P,CV[0]);Deg>0; Deg--){
                   21739:                                                Q=mycoef(P,Deg,CV[0]);
                   21740:                                                TR=intpoly(Q,X|log=[C1,C0,Deg]);
                   21741:                                                for(I=0;TR!=[];I++,TR=cdr(TR)){
                   21742:                                                        if(I==Deg) R+=car(TR)-subst(car(TR),X,0);
                   21743:                                                        else R+=car(TR)*CV[0]^(Deg-I);
                   21744:                                                }
                   21745:                                        }
                   21746:                                }
                   21747:                                P=mycoef(P,0,CV[0]);
                   21748:                        }
                   21749:                        R+=intpoly(P,X);
                   21750:                        return R;
                   21751:                }
                   21752:        }
                   21753:        for(K=0,VX=[],VT=Var;VT!=[];VT=cdr(VT)){                /*  contain only both pow and trig */
                   21754:                VTT=car(VT);
                   21755:                if(findin(VTT[1],[cos,sin,tan])>=0){
                   21756:                        if(ptype(VTT[2],X)!=2||mydeg(VTT[2],X)!=1) break;
                   21757:                        VX=cons(VTT,VX);
                   21758:                }else if(VTT[1]==pow) K=1;
                   21759:                else break;
                   21760:        }
                   21761:        if(VT==[]&&K==1&&VX!=[]){
                   21762:                D=VX[0][2];
                   21763:                if(VX[0][1]==tan) D*=2;
                   21764:                for(VT=cdr(VX);VT!=[];VT=cdr(VT)){
                   21765:                        K=VT[0][2]/D;
                   21766:                        if(VT[0][1]==tan) K*=2;
                   21767:                        if(type(K)!=1||ntype(K)!=0) break;
                   21768:                        D/=dn(K);
                   21769:                }
                   21770:                if(VT==[]){
                   21771:                        Y=makenewv([P,VAR]|var=x);
                   21772:                        for(Q=P,VT=VX;VT!=[];VT=cdr(VT)){
                   21773:                                VTT=car(VT);
                   21774:                                if(VTT[1]==cos||VTT[1]==sin){
                   21775:                                        VV=trig2exp(VTT[0],X|inv=cos(D));
                   21776:                                        VV=subst(VV,cos(D),(1-Y^2)/(1+Y^2),sin(D),2*Y/(Y^2+1));
                   21777:                                }else if(VTT[1]==tan){
                   21778:                                        VV=trig2exp(VTT[0],X|inv=tan(D/2));
                   21779:                                        VV=subst(VV,tan(D),Y);
                   21780:                                }
                   21781:                                Q=subst(Q,VTT[0],VV);
                   21782:                        }
                   21783:                        Q*=2/(Y^2+1);
                   21784:                        if(diff(Q,X)==0){
                   21785:                                if(Dumb==-1) mycat([Y,"=",tan(D/2)]);
                   21786:                                else if(type(Dumb)==5) Dumb[0]=cons([[0,Y,tan(D/2)]],Dumb[0]);
                   21787:                                R=integrate(Q,Y|dumb=Dumb2,var=cons(X,Var));
                   21788:                                if(R!=[]){
                   21789:                                        if(Dumb==-1) mycat(["->",R]);
                   21790:                                        else if(type(Dumb)==5) Dumb[0]=cons([[1,R]],Dumb[0]);
                   21791:                                        return sqrt2rat(subst(R,Y,tan(D/2))|mult=1);
                   21792:                                }
                   21793:                        }
                   21794:                }
                   21795:        }
                   21796:        if(T>65||iand(F,8)){    /* rational for functions or tan */
                   21797:                if(findin(X,vars(P))<0){
                   21798:                        for(XV=XE=0,VT=Var;VT!=[];VT=cdr(VT)){
                   21799:                                VTT=car(VT);
                   21800:                                if(mydeg(VTT[2],X)!=1) break;
                   21801:                                if(VTT[1]==cos||VTT[1]==sin||VTT[1]==tan){
                   21802:                                        K=red(VTT[2]/X);
                   21803:                                        if(type(K)>1||ntype(K)>0) break;
                   21804:                                        if(XV==0) XV=K;
                   21805:                                        else XV/=dn(K/XV);
                   21806:                                        if(VTT[1]==tan) P=red(subst(P,VTT[0],sin(VTT[2])/cos(VTT[2])));
                   21807:                                }else if(VTT[1]==exp){
                   21808:                                        K=red(VTT[2]/X);
                   21809:                                        if(type(K)>1||ntype(K)>0) break;
                   21810:                                        if(XE==0) XE=K;
                   21811:                                        else XE/=dn(K/XE);
                   21812:                                }else break;
                   21813:                        }
                   21814:                        if(VT==[]&&XE*XV==0){
                   21815:                                if(XE){
                   21816:                                        if(XE<0) XE=-XE;
                   21817:                                        Y=makenewv([P,VAR]|var=x);
                   21818:                                        for(F=0,VT=Var;VT!=[];VT=cdr(VT),F++){
                   21819:                                                VTT=car(VT);C=red(VTT[2]/X/XE);
                   21820:                                                P=subst(P,VTT[0],Y^C);
                   21821:                                                if(!F){
                   21822:                                                        if(Dumb==-1) mycat([Y^C,"=",VTT[0]]);
                   21823:                                                        else if(type(Dumb)==5) Dumb[0]=cons([[0,Y^C,VTT[0]]],Dumb[0]);
                   21824:                                                }
                   21825:                                        }
                   21826:                                        P/=XE*Y;
                   21827:                                        Q=integrate(P,Y|dumb=Dumb3,var=cons(X,VAR));
                   21828:                                        if(Q==[]) return [];
                   21829:                                        Q=subst(Q,Y,exp(XE*X));
                   21830:                                        Q=trig2exp(Q,X);
                   21831:                                        if(Dumb==-1) mycat(["->",Q]);
                   21832:                                        else if(type(Dumb)==5) Dumb[0]=cons([[1,Q]],Dumb[0]);
                   21833:                                        return Q;
                   21834:                                }
                   21835:                                P=trig2exp(nm(P),X|inv=cos(XV*X))/trig2exp(dn(P),X|inv=cos(XV*X));
                   21836:                                Y=makenewv([P,VAR]|var=x);
                   21837:                                Q=red(subst(P,sin(XV*X),Y*cos(XV*X)));
                   21838:                                Q=substblock(nm(Q),cos(XV*X),cos(XV*X)^2,1/(Y^2+1))/
                   21839:                                  (substblock(dn(Q),cos(XV*X),cos(XV*X)^2,1/(Y^2+1))*(Y^2+1));
                   21840:                                Q=red(Q);
                   21841:                                if(ptype(Q,X)<2){
                   21842:                                        XV*=2;P=Q;
                   21843:                                }else{
                   21844:                                        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);
                   21845:                                        P=red(P);
                   21846:                                }
                   21847:                                if(Dumb==-1){
                   21848:                                        mycat([Y,"=",tan(XV*X/2)]);
                   21849:                                        mycat(["integrate",P]);
                   21850:                                }else if(type(Dumb)==5) Dumb[0]=cons([[Y,P]],cons([[0,Y,tan(XV*X/2)]],Dumb[0]));
                   21851:                                R=intpoly(P,Y|dumb=Dumb);
                   21852:                                if(R==[]) return R;
                   21853:                                if(Dumb==-1) mycat(["->",R]);
                   21854:                                else if(type(Dumb)==5) Dumb[0]=cons([[1,R]],Dumb[0]);
                   21855:                                for(Log=1,K=0,Var=pfargs(RR=R,Y);Var!=[];Var=cdr(Var)){
                   21856:                                        VTT=car(Var);
                   21857:                                        if(VTT[1]==log){
                   21858:                                                C=mycoef(R,1,VTT[0]);
                   21859:                                                VT2=VTT[2];
                   21860:                                                if(K==0){
                   21861:                                                        K=C;Log=VT2;
                   21862:                                                        if(K<0){
                   21863:                                                                K=-K;Log=1/Log;
                   21864:                                                        }
                   21865:                                                }else{
                   21866:                                                        if((V=red(C/K))<0){
                   21867:                                                                VT2=1/VT2;V=-V;
                   21868:                                                        }
                   21869:                                                        if(type(V)>1||ntype(V)>0){
                   21870:                                                                Log=1;break;
                   21871:                                                        }
                   21872:                                                        if(isint(V)) Log*=VT2^V;
                   21873:                                                        else{
                   21874:                                                                D=dn(V);K/=D;
                   21875:                                                                Log=Log^D*VT2^nm(V);
                   21876:                                                        }
                   21877:                                                }
                   21878:                                                RR=mycoef(RR,0,VTT[0]);
                   21879:                                        }
                   21880:                                }
                   21881:                                if(Log!=1){
                   21882:                                        R=RR;
                   21883:                                        if(type(Dumb)==5){
                   21884:                                                if(RR) Dumb[0]=cons([[1,K*log(Log),RR]],Dumb[0]);
                   21885:                                                else Dumb[0]=cons([[1,K*log(Log)]],Dumb[0]);
                   21886:                                        }
                   21887:                                        Log=red(subst(red(Log),Y,sin(XV*X/2)/cos(XV*X/2)));
                   21888:                                        Log=fshorter(Log,X|log=1);      /* log(cos(2*x)+1)=-2*log(cos(x)) */
                   21889:                                        Nm=fctr(nm(Log));
                   21890:                                        for(T=[];Nm!=[];Nm=cdr(Nm)){
                   21891:                                                if(ptype(car(Nm)[0],X)>1) T=cons(car(Nm),T);
                   21892:                                        }
                   21893:                                        Nm=fctr(dn(Log));
                   21894:                                        for(;Nm!=[];Nm=cdr(Nm)){
                   21895:                                                if(ptype(car(Nm)[0],X)>1) T=cons([car(Nm)[0],-car(Nm)[1]],T);
                   21896:                                        }
                   21897:                                        for(I=0,Nm=T;T!=[];T=cdr(T)){
                   21898:                                                if(I=0) I=abs(car(T)[1]);
                   21899:                                                else I=igcd(I,car(T)[1]);
                   21900:                                        }
                   21901:                                        for(Log=1;Nm!=[];Nm=cdr(Nm)) Log*=car(Nm)[0]^(car(Nm)[1]/I);
                   21902:                                        K*=I;
                   21903:                                        if(cmpsimple(nm(Log),dn(Log))<0){
                   21904:                                                K=-K;Log=red(1/Log);
                   21905:                                        }
                   21906:                                        Log=K*log(Log);
                   21907:                                        if(type(Dumb)==5){
                   21908:                                                if(RR) Dumb[0]=cons([[1,Log,RR]],Dumb[0]);
                   21909:                                                else Dumb[0]=cons([[1,Log]],Dumb[0]);
                   21910:                                        }
                   21911:                                }else Log=0;
                   21912:                                for(Atan=0,Var=pfargs(RR=R,Y);Var!=[];Var=cdr(Var)){
                   21913:                                        VTT=car(Var);
                   21914:                                        if(VTT[1]==atan){
                   21915:                                                W=subst(VTT[2],Y,sin(XV*X/2)/cos(XV*X/2));
                   21916:                                                W=trig2exp(W,X|inv=1);
                   21917:                                                V2=funargs(dn(W));
                   21918:                                                if(type(V2)==4&&length(V2)==2){
                   21919:                                                        V3=V2[1]*mycoef(R,1,VTT[0]);
                   21920:                                                        Z=0;
                   21921:                                                        if(V2[0]==cos)
                   21922:                                                                Z=red(W*cos(V2[1])/sin(V2[1]));
                   21923:                                                        else if(V2[0]==sin){
                   21924:                                                                Z=red(W*sin(V2[1])/cos(V2[1]));
                   21925:                                                                V3=-V3;
                   21926:                                                        }
                   21927:                                                        if(Z==1){
                   21928:                                                                Atan+=V3;W=0;
                   21929:                                                        }else if(Z==-1){
                   21930:                                                                Atan-=V3;W=0;
                   21931:                                                        }
                   21932:                                                }
                   21933:                                                R0=mycoef(R,0,VTT[0]);
                   21934:                                                if(W!=0) Atan+=subst(R-R0,VTT[0],atan(W));      /* atan(W); */
                   21935:                                                R=R0;
                   21936:                                        }
                   21937:                                }
                   21938:                                if(R!=0){
                   21939:                                        R=subst(R,Y,sin(XV*X/2)/cos(XV*X/2));
                   21940:                                        R=red(R);
                   21941:                                        R=trig2exp(nm(R),X|inv=1)/trig2exp(dn(R),X|inv=1);
                   21942:                                }
                   21943:                                if(type(Dumb)==5){
                   21944:                                        F=0;WL=[];
                   21945:                                        if(R){
                   21946:                                                WL=cons(R,WL);
                   21947:                                                F++;
                   21948:                                        }
                   21949:                                        if(Atan){
                   21950:                                                WL=cons(Atan,WL);
                   21951:                                                F++;
                   21952:                                        }
                   21953:                                        if(Log){
                   21954:                                                WL=cons(Log,WL);
                   21955:                                                F++;
                   21956:                                        }
                   21957:                                        WL=cons(1,WL);
                   21958:                                        if(F>1) Dumb[0]=cons([WL],Dumb[0]);
                   21959:                                }
                   21960:                                R=red(R+Log+Atan);
                   21961:                                if(Dumb==-1) mycat(["->",R]);
                   21962:                                else if(type(Dumb)==5) Dumb[0]=cons([[1,R]],Dumb[0]);
                   21963:                                return fshorter(R,X);
                   21964:                        }
                   21965:                }
                   21966:        }
                   21967:        VT=pfargs(Q=P,X|level=1);
                   21968:        V=(iand(ptype(P,X),7)<3)?[X]:[];
                   21969:        for(;VT!=[];VT=cdr(VT))
                   21970:                if(ptype(P,car(VT)[0])<3) V=cons(car(VT)[0],V);
                   21971:        if(length(V)>0){                /* 1/x+tan(x)+... etc.: sums */
                   21972:                for(R=0;V!=[];V=cdr(V)){
                   21973:                        T=mycoef(Q,0,car(V));
                   21974:                        W[0]=[];
                   21975:                        S=integrate(TD=red(Q-T),X|dumb=D2,mult=Mul,exe=1);
                   21976:                        if(S==[]) continue;
                   21977:                        if(type(Dumb)==5){
                   21978:                                WL=0;
                   21979:                                if(T!=0) WL=[[X,TD,T]];
                   21980:                                if(R!=0) WL=cons([1,R],WL);
                   21981:                                if(WL) Dumb[0]=cons(WL,Dumb[0]);
                   21982:                                TD=W[0];
                   21983:                                if(R!=0||T!=0){
                   21984:                                        for(W0=[],TD=reverse(TD);TD!=[];TD=cdr(TD)){
                   21985:                                                if(car(TD)[0][0]){
                   21986:                                                        WL=(!T)?[]:[[X,T]];
                   21987:                                                        WL=append(car(TD),WL);
                   21988:                                                        if(R!=0) WL=cons([1,R],WL);
                   21989:                                                }else WL=car(TD);
                   21990:                                                Dumb[0]=cons(WL,Dumb[0]);
                   21991:                                        }
                   21992:                                }else Dumb[0]=append(TD,Dumb[0]);
                   21993:                        }
                   21994:                        R+=S;Q=T;
                   21995:                        if(!Q) return red(R);
                   21996:                }
                   21997:                W[0]=[];
                   21998:                if(P!=Q&&type(S=integrate(Q,X|dumb=D2,mult=Mul))<4){
                   21999:                        RR=red(R+S);
                   22000:                        if(type(Dumb)==5){
                   22001:                                TD=W[0];
                   22002:                                for(W0=[],TD=reverse(TD);TD!=[];TD=cdr(TD)){
                   22003:                                        if(car(TD)[0][0]){
                   22004:                                                WL=cons([1,R],car(TD));
                   22005:                                                Dumb[0]=cons(WL,Dumb[0]);
                   22006:                                        }
                   22007:                                        else Dumb[0]=append(TD,Dumb[0]);
                   22008:                                }
                   22009:                                if(nmono(R)+nmono(S)!=nmono(RR)) Dumb[0]=cons([[1,R,S]],Dumb[0]);
                   22010:                        }
                   22011:                        return RR;
                   22012:                }
                   22013:        }
                   22014:        if(Dumb!=1) mycat(SM);
                   22015:        return [];
                   22016: }
                   22017:
                   22018: def fimag(P)
                   22019: {
                   22020:        for(V=vars(P);V!=[];V=cdr(V)){
                   22021:                Q=[];
                   22022:                if(vtype(VF=car(V))==2){
                   22023:                        VAA=args(VF);
                   22024:                        if(VAA==[]) continue;
                   22025:                        VA=sqrt2rat(VAA[0]);
                   22026:                        if(functor(VF)==exp){
                   22027:                                if(imag(VA)!=0){
                   22028:                                        R=(real(VA)!=0)?exp(real(VA)):1;
                   22029:                                        Q=subst(P,VF,R*(cos(imag(VA))+sin(imag(VA))*@i));
                   22030:                                }
                   22031:                        }else if(functor(VF)==pow){
                   22032:                                VA=sqrt2rat(VAA[1]);
                   22033:                                if(imag(VA)!=0){
                   22034:                                        R=(real(VA)!=0)?VAA[0]^(real(VA)):1;
                   22035:                                        L=(VAA[0]!=@e)?log(VAA[0]):1;
                   22036:                                        Q=subst(P,VAA[0]^(VAA[1]),R*(cos(L*imag(VA))+sin(L*imag(VA))*@i));
                   22037:                                }else if(VAA[1]!=(V0=fimag(VA)))
                   22038:                                        Q=subst(P,VAA[0]^(VAA[1]),VAA[0]^(V0));
                   22039:                        }
                   22040:                        V0=VA;
                   22041:                        if(length(VAA)==1&&(VAA[0]!=V0||VA!=(V0=fimag(VA))))
                   22042:                                Q=subst(P,VF,subst(VF,VAA[0],V0));
                   22043:                }
                   22044:                if(Q!=[]&&P!=Q){
                   22045:                        P=Q;V=cons(0,vars(P));
                   22046:                }
                   22047:        }
                   22048:        return P;
                   22049: }
                   22050:
                   22051:
                   22052: def trig2exp(P,X)
                   22053: {
                   22054:        if(iand(ptype(P,X),128)){
                   22055:                OL=getopt();
                   22056:                Nm=trig2exp(nm(P),X|option_list=OL);
                   22057:                Dn=trig2exp(dn(P),X|option_list=OL);
                   22058:                R=red(Nm/Dn);
                   22059:                if(getopt(arc)==1) return sqrt2rat(R);
                   22060:        }
                   22061:        if((Inv=getopt(inv))==1||type(Inv)==2){
                   22062:                for(VT=T=vars(P);T!=[];T=cdr(T)){
                   22063:                        if(findin(functor(car(T)),[cos,sin,tan])>=0){
                   22064:                                P=trig2exp(P,X);VT=vars(P);break;
                   22065:                        }
                   22066:                }
                   22067:                for(;VT!=[];VT=cdr(VT)){
                   22068:                        if(functor(CT=car(VT))==exp){
                   22069:                                if((Re=real(args(CT)[0]))!=0){
                   22070:                                        if(isint(Re)) S=@e^Re;
                   22071:                                        else S=exp(Re);
                   22072:                                }else S=1;
                   22073:                                if((Im=imag(args(CT)[0]))!=0){
                   22074:                                        Q=nm(Im);Q=mycoef(Q,mydeg(Q,X),X);
                   22075:                                        if(-Q>Q) S*=cos(-Im)-@i*sin(-Im);
                   22076:                                        else S*=cos(Im)+@i*sin(Im);
                   22077:                                }
                   22078:                                P=subst(P,CT,S);
                   22079:                        }
                   22080:                }
                   22081:                P=red(P);
                   22082:                U=vars(Inv);
                   22083:                if(length(U)!=1||((F=functor(car(U)))!=sin&&F!=cos&&F!=tan)) return P;
                   22084:                XX=args(car(U))[0];
                   22085:                if(mydeg(XX,X)!=1) return P;
                   22086:                if(!isvar(XX)) P=subst(P,X,(X-mycoef(XX,0,X))/mycoef(XX,1,X));
                   22087:                for(VT=vars(P);VT!=[];VT=cdr(VT)){
                   22088:                        if(vtype(CT=car(VT))<2) continue;
                   22089:                        TX=args(CT)[0];
                   22090:                        if(mydeg(TX,X)!=1) continue;
                   22091:                        if(!isint(C1=mycoef(TX,1,X))) continue;
                   22092:                        if((C0=mycoef(TX,0,X))==0){
                   22093:                                CC=1;CS=0;
                   22094:                        }else if(vars(C0)==[@pi]){
                   22095:                                CC=myval(cos(C0));
                   22096:                                if(CC!=0&&type(CC)==1&&ntype(CC)!=0){
                   22097:                                        CC=cos(C0);CS=sin(C0);
                   22098:                                }else CS=myval(sin(C0));
                   22099:                        }else{
                   22100:                                CC=cos(C0);CS=sin(C0);
                   22101:                        }
                   22102:                        K=C1;
                   22103:                        if(K<0) K=-K;
                   22104:                        for(CC1=0,I=K;I>=0;I-=2) CC1+=(-1)^((K-I)/2)*binom(K,I)*cos(X)^I*sin(X)^(K-I);
                   22105:                        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);
                   22106:                        if(C1<0) CS1=-CS1;
                   22107:                        if((TF=functor(CT))==cos) P=subst(P,cos(TX),CC1*CC-CS1*CS);
                   22108:                        else if(TF==sin) P=subst(P,sin(TX),CS1*CC+CC1*CS);
                   22109:                }
                   22110:                if(F==sin)
                   22111:                        P=substblock(P,cos(X),cos(X)^2,1-sin(X)^2);
                   22112:                else{
                   22113:                        P=substblock(P,sin(X),sin(X)^2,1-cos(X)^2);
                   22114:                        if(F==tan){
                   22115:                                P=subst(P,sin(X),cos(X)*tan(X));
                   22116:                                P=substblock(P,cos(X),cos(X)^2,1/(tan(X)^2+1));
                   22117:                        }
                   22118:                }
                   22119:                if(!isvar(XX)) P=subst(P,X,XX);
                   22120:
                   22121:                if(getopt(arc)==1){
                   22122:                        for(VT=vars(P);VT!=[];VT=cdr(VT)){
                   22123:                                FA=funargs(car(VT));
                   22124:                                if(type(FA)==4&&(FA[0]==cos||FA[0]==sin)&&ptype(FA[1],X)>60){
                   22125:                                        VTT=vars(FA[1]);
                   22126:                                        if(type(FA[1])!=2||length(VTT)!=1) break;
                   22127:                                        FB=funargs(VTT[0]);
                   22128:                                        if(type(FB)!=4||(FF=findin(FB[0],[asin,acos,atan]))<0) break;
                   22129:                                        if(!isint(2*(C=mycoef(FA[1],1,VTT[0])))||mycoef(FA[1],0,VTT[0])!=0) break;
                   22130:                                        if(C==1/2){
                   22131:                                                if(FF==1){
                   22132:                                                        U=(FA[0]==cos)?(1+FB[1])/2:(1-FB[1])/2;
                   22133:                                                        P=subst(P,car(VT),red(U)^(1/2));
                   22134:                                                }else if(FF==2){
                   22135:                                                        if(FA[0]==sin){
                   22136:                                                                FB1=red(FB[1]);
                   22137:                                                                Nm=nm(FB1);CC=fctr(Nm)[0][0];Dn=dn(FB1);
                   22138:                                                                if(CC<0) CC=-CC;
                   22139:                                                                Nm/=CC;Dn/=CC;
                   22140:                                                                NN=Nm^2+Dn^2;
                   22141:                                                                P=subst(P,car(VT),((NN)^(1/2)-Dn)/Nm*cos(FA[1]));
                   22142:                                                        }
                   22143:                                                }
                   22144:                                                P=red(P);
                   22145:                                        }else if(C==1){
                   22146:                                                if(FF==1){
                   22147:                                                        if(FA[0]==cos) P=subst(P,car(VT),FB[1]);
                   22148:                                                        else P=subst(P,car(VT),(1-FB[1])^(1/2));
                   22149:                                                }else if(FF==0){
                   22150:                                                        if(FA[0]==sin) P=subst(P,car(VT),FB[1]);
                   22151:                                                        else P=subst(P,car(VT),(1-FB[1])^(1/2));
                   22152:                                                }
                   22153:                                                P=red(P);
                   22154:                                        }
                   22155:                                }
                   22156:                        }
                   22157:                        P=sqrt2rat(P);
                   22158:                }
                   22159:                return red(P);
                   22160:        }
                   22161:        Var=pfargs(P,X);
                   22162:        for(VT=Var;VT!=[];VT=cdr(VT)){
                   22163:                CT=car(VT);
                   22164:                if(CT[1]==cos)
                   22165:                        P=subst(P,CT[0],exp(CT[2]*@i)/2+exp(-CT[2]*@i)/2);
                   22166:                else if(CT[1]==sin)
                   22167:                        P=subst(P,CT[0],exp(-CT[2]*@i)*@i/2-exp(CT[2]*@i)*@i/2);
                   22168:                else if (CT[1]==tan)
                   22169:                        P=subst(P,CT[0],(exp(-CT[2]*@i)*@i-exp(CT[2]*@i)*@i)/(exp(CT[2]*@i)+exp(-CT[2]*@i)));
                   22170:                else if(CT[1]==pow){
                   22171:                        if(ptype(CT[2],X)>1) continue;
                   22172:                        if(CT[2]==@e) P=subst(P,CT[0],exp(CT[3]));
                   22173:                        else P=subst(P,CT[0],exp(log(CT[2])*exp(CT[3])));
                   22174:                }
                   22175:        }
                   22176:        P=red(P);
                   22177:        for(PP=1,Lp=(dn(P)==1)?1:0;Lp<2;Lp++){
                   22178:                PP=1/PP;
                   22179:                U=(Lp==0)?dn(P):nm(P);
                   22180:                if(U==1) continue;
                   22181:                Var=vars(U);
                   22182:                for(R=[],VT=Var;VT!=[];VT=cdr(VT))
                   22183:                        if(functor(car(VT))==exp) R=cons(car(VT),R);
                   22184:                RR=os_md.terms(U,R);
                   22185:                for(Q=0,RRT=RR;RRT!=[];RRT=cdr(RRT)){
                   22186:                        for(S=0,CT=cdr(car(RRT)),CR=R,UT=U;CR!=[];CR=cdr(CR),CT=cdr(CT)){
                   22187:                                UT=mycoef(UT,car(CT),car(CR));S+=car(CT)*args(car(CR))[0];
                   22188:                        }
                   22189:                        if(S==0) Q+=UT;
                   22190:                        else Q+=UT*exp(S);
                   22191:                }
                   22192:                PP*=Q;
                   22193:        }
                   22194:        return PP;
                   22195: }
                   22196:
                   22197: def powsum(N)
                   22198: {
                   22199:        if (N < 0) return 0;
                   22200:        if (N == 0) return x;
                   22201:        P = intpoly(N*powsum(N-1),x);
                   22202:        C = subst(P,x,1);
                   22203:        return P+(1-C)*x;
                   22204: }
                   22205:
                   22206: def bernoulli(N)
                   22207: {
                   22208:        return mydiff(powsum(N),x) - N*x^(N-1);
                   22209: }
                   22210:
                   22211: /* linfrac01([x,y]) */
1.77      takayama 22212: /* (x_0,x_1,x_2,x_3,...,x_{q+3})=(x,0,1,y_1,...,y_q,\infty)
1.6       takayama 22213:
                   22214:        T=0   (x_2,x_1,x_3,x_4,...)
                   22215:        T=-j  (x_1,x_2,..,x_{j-1},x_{j+1},x_j,x_{j+2},...)
                   22216:        T=1   (1-x_1,1-x_2,1-x_3,1-x_4,...)
                   22217:        T=2   (1/x_1,1/x_2,1/x_3,1/x_4,...)
1.77      takayama 22218:        T=3   (1/x_1,x_2/x_1,x_3/x_1,x_4/x_1,...)
1.78      takayama 22219:     ...
1.6       takayama 22220: */
                   22221: def lft01(X,T)
                   22222: {
1.77      takayama 22223:        S=0;
1.6       takayama 22224:        if(type(X)==4){
1.77      takayama 22225:                if(type(car(X))==4){
                   22226:                        S=X[1];X=car(X);
                   22227:                }
1.6       takayama 22228:                K=length(X);
                   22229:                if(K>=1) D=1;
                   22230:        }
                   22231:        if(D==0) return 0;
1.77      takayama 22232:        if(type(T)==4&&(length(T)==K+3||length(T)==2)){
                   22233:                for(U=[],I=K+2;I>=0;I--) U=cons(I,U);
                   22234:                if(length(T)==2) T=mperm(U,[T],0);
                   22235:                L=sexps(T);
                   22236:                for(R=[X,S];L!=[];L=cdr(L)){
                   22237:                        if(!(I=car(L))) I=4;
                   22238:                        /* else if(I==1) I=1; */
                   22239:                        else if(I==2) I=5;
                   22240:                        else if(I==K+1) I=6;
                   22241:                        else if(I>2) I=2-I;
                   22242:                        R=lft01(R,I);
1.6       takayama 22243:                }
                   22244:                return R;
                   22245:        }
1.77      takayama 22246:        if(!S) S=getopt(tr);
                   22247:        if(type(S)==4&&length(S)==K+3){
                   22248:                D=2;
                   22249:        }else if(S==1) for(S=[],I=K+2;I>=0;I--) S=cons(I,S);
                   22250:        else S=0;
                   22251:        if(T<=0){  /* y_i <-> y_{i+1}, y_0=x=x_0, y_i=x_{i+2} */
                   22252:                R=mperm(X,[[-T,1-T]],0);
                   22253:                if(S){
                   22254:                        if(!T) S=mperm(S,[[0,3]],0);
                   22255:                        else   S=mperm(S,[[2-T,3-T]],0); /* : J J=3,...,K; */
                   22256:                        R=[R,S];
1.6       takayama 22257:                }
                   22258:                return R;
1.77      takayama 22259:        }else if(T==1){ /* (x_1=0, x_2=1) : 1 */
                   22260:                for(R=[];X!=[];X=cdr(X)) R=cons(1-car(X),R);
                   22261:                if(S) S=mperm(S,[[1,2]],0);
                   22262:        }else if(T==2){ /* (x_1=0, x_{K+2}=infty) */
                   22263:                for(R=[]; X!=[]; X=cdr(X)) R=cons(red(1/car(X)),R);
                   22264:                if(S) S=mperm(S,[[1,K+2]],0);
                   22265:        }else if(T==3){ /* (x_0=x, x_2=1) */
                   22266:                T=car(X);
                   22267:                for(R=[red(1/T)],X=cdr(X); X!=[]; X=cdr(X)) R=cons(red(car(X)/T),R);
                   22268:                if(S) S=mperm(S,[[0,2]],0);
                   22269:        }else if(T==4){ /* (x_0=x,x_1=0) : 0 */
                   22270:                T=car(X);
                   22271:                for(R=[red(T/(T-1))],X=cdr(X); X!=[]; X=cdr(X)) R=cons(red((T-car(X))/(T-1)),R);
                   22272:                if(S) S=mperm(S,[[0,1]],0);
                   22273:        }else if(T==5){ /* (x_2=1,x_3=y) : 2 */
                   22274:                T=X[1];
                   22275:                for(R=[1/T,red(X[0]/T)],X=cdr(cdr(X));X!=[]; X=cdr(X)) R=cons(red(car(X)/T),R);
                   22276:                if(S) S=mperm(S,[[2,3]],0);
                   22277:        }else if(T==6){ /* (x_{K+1}=y_{K-1}, x_{K+2}=infty) : K+1 */
                   22278:                T=X[K-1];
                   22279:                for(R=[];length(X)>1;X=cdr(X)) R=cons(red(car(X)*(1-T)/(car(X)-T)),R);
                   22280:                R=cons(1-T,R);
                   22281:                if(S) S=mperm(S,[[K+1,K+2]],0);
                   22282:        }else if(T==7){ /* x_2=1 <-> x_{K+2}=infty */
                   22283:                for(R=[];X!=[];X=cdr(X)) R=cons(red(car(X)/(car(X)-1)),R);
                   22284:                if(S) S=mperm(S,[[2,K+2]],0);
                   22285:        }else return 0;
                   22286:        R=reverse(R);
                   22287:        return S?[R,S]:R;
1.6       takayama 22288: }
                   22289:
                   22290: def linfrac01(X)
                   22291: {
1.77      takayama 22292:        if(type(X)==4){
                   22293:                K=length(X)-2;
                   22294:                if(type(car(X))==4){
                   22295:                        for(U=[],I=K+4;I>=0;I--) U=cons(I,U);
                   22296:                        X=[car(X),U];
                   22297:                }else U=0;
1.6       takayama 22298:        }
                   22299:        if(K>3 && getopt(over)!=1) return(-1);
                   22300:        II=(K==-1)?3:4;
                   22301:        for(CC=C=1,L=[X]; C!=0; CC+=C){
                   22302:                for(F=C,C=0,R=L; F>0; R=cdr(R), F--){
                   22303:                        P=car(R);
                   22304:                        for(I=-K; I<II; I++){
                   22305:                                S=lft01(P,I);
                   22306:                                if(findin(S,L) < 0){
                   22307:                                        C++; L=cons(S,L);
                   22308:                                }
                   22309:                        }
                   22310:                }
                   22311:        }
1.77      takayama 22312:        return reverse(L);
1.6       takayama 22313: }
                   22314:
                   22315:
                   22316: def varargs(P)
                   22317: {
1.21      takayama 22318:        if((All=getopt(all))!=1&&All!=2) All=0;
1.6       takayama 22319:        V=vars(P);
                   22320:        for(Arg=FC=[];V!=[];V=cdr(V)){
1.21      takayama 22321:                if(vtype(CV=car(V))==0&&All!=0){
1.6       takayama 22322:                        Arg=lsort([CV],Arg,0);
                   22323:                }
                   22324:                if(vtype(CV)!=2) continue;
                   22325:                if(findin(F=functor(CV),FC)<0) FC=cons(F,FC);
                   22326:                for(AT=vars(args(CV));AT!=[];AT=cdr(AT)){
                   22327:                        if(vtype(X=car(AT))<2){
                   22328:                                if(findin(X,Arg)<0) Arg=cons(X,Arg);
                   22329:                        }else if(vtype(X)==2){
                   22330:                                R=varargs(X);
                   22331:                                if(R[1]!=[]){
                   22332:                                        Arg=lsort(R[1],Arg,0);
                   22333:                                        FC=lsort(R[0],FC,0);
                   22334:                                }
                   22335:                        }
                   22336:                }
                   22337:        }
1.21      takayama 22338:        Arg=reverse(Arg);
                   22339:        return (All==2)?Arg:[reverse(FC),Arg];
1.6       takayama 22340: }
                   22341:
                   22342: def pfargs(P,X)
                   22343: {
                   22344:        if(type(L=getopt(level))!=1) L=0;
                   22345:        for(Var=[],V=vars(P);V!=[];V=cdr(V)){
                   22346:                if(vtype(car(V))==2){
                   22347:                        VT=funargs(car(V));
                   22348:                        if(length(VT)>1){
                   22349:                                if(L<2 &&(ptype(VT[1],X)>1 || (length(VT)>2 && ptype(VT[2],X)>1)))
                   22350:                                        Var=cons(cons(car(V),VT),Var);
                   22351:                                if(L!=1 && (R=pfargs(VT[1],X|level=L-1))!=[]) Var=append(R,Var);
                   22352:                        }
                   22353:                }
                   22354:        }
                   22355:        return reverse(Var);
                   22356: }
                   22357:
                   22358: def ptype(P,L)
                   22359: {
                   22360:        if((T=type(P))<2 || T>3) return T;
                   22361:        if(type(L)!=4)  L=[L];
                   22362:        F=0;
                   22363:        if(lsort(L,varargs(dn(P))[1],2)!=[]) F=128;
                   22364:        if(lsort(L,varargs(nm(P))[1],2)!=[]) F+=64;
                   22365:        if(lsort(L,vars(dn(P)),2)!=[]) return F+3;
                   22366:        return (lsort(L,vars(nm(P)),2)==[])?(F+1):(F+2);
                   22367: }
                   22368:
                   22369: def nthmodp(X,N,P)
                   22370: {
                   22371:        X=X%P;
                   22372:        for(Z=1;;){
                   22373:                if((W=iand(N,1))==1)    Z=(Z*X)%P;
                   22374:                if((N=(N-W)/2)<=0)      return Z;
                   22375:                X=irem(X*X,P);
                   22376:        }
                   22377: }
                   22378:
                   22379: def issquaremodp(X,P)
                   22380: {
                   22381:        N=getopt(power);
                   22382:        if(!isint(N)) N=2;
                   22383:        if(P<=1 || !isint(P) || !pari(ispsp,P) || !isint(X) || !isint(N) || N<1){
                   22384:                errno(0);
                   22385:                return -2;
                   22386:        }
                   22387:        M=(P-1)/igcd(N,P-1);
                   22388:        if((X%=P) == 0) return 0;
                   22389:     if(X==1 || M==P-1) return 1;
                   22390:        return (nthmodp(X,M,P)==1)?1:-1;
                   22391: }
                   22392:
                   22393: def iscoef(P,F)
                   22394: {
                   22395:        if(P==0) return 1;
                   22396:        if(type(P)==1) return F(P);
                   22397:        if(type(P)==2) {
                   22398:                X=var(P);
                   22399:                for(I=deg(P,X); I>=0; I--){
                   22400:                        if(!iscoef(mycoef(P,I,X),F)) return 0;
                   22401:                }
                   22402:        }else if(type(P)==3){
                   22403:                if(!iscoef(nm(P),F)||!iscoef(dn(P),F)) return 0;
                   22404:        }else if(type(P)==4){
                   22405:                for(;P!=[];P=cdr(P)) if(!iscoef(P,F)) return 0;
                   22406:        }else if(type(P)>4 && type(P)<7) return iscoef(m2l(PP),F);
                   22407:        else return 0;
                   22408:        return 1;
                   22409: }
                   22410:
                   22411: def rootmodp(X,P)
                   22412: {
                   22413:        X%=P;
                   22414:        if(X==0)        return [0];
                   22415:        N=getopt(power);
                   22416:        PP=pari(factor,P);
                   22417:        P0=PP[0][0]; P1=PP[0][1];
                   22418:        P2=pari(phi,P);
                   22419:        if(!isint(N)) N=2;
                   22420:        N%=P2;
                   22421:        if(P0==2 || size(PP)[0]>1){
                   22422:                for(I=1,R=[]; I<P2; I++)
                   22423:                        if(nthmodp(I,N,P)==X)   R=cons(I,R);
                   22424:                return qsort(R);
                   22425:        }
                   22426:        Y=primroot(P);
                   22427:        if(Y==0) return 0;
                   22428:        Z=nthmodp(Y,N,P);
                   22429:        G=igcd(N,P2);
                   22430:        P3=P2/G;
                   22431:        for(I=0, W=1; I<P3;I++){
                   22432:                if(W==X)        break;
                   22433:                W=(W*Z)%P;
                   22434:        }
                   22435:        if(I==P3) return [];
                   22436:        W=nthmodp(Y,I,P);
                   22437:        Z=nthmodp(Y,P3,P);
                   22438:        for(I=0,R=[];;){
                   22439:                R=cons(W,R);
                   22440:                if(++I>=G) break;
                   22441:                W=(W*Z)%P;
                   22442:        }
                   22443:        return qsort(R);
                   22444: }
                   22445:
                   22446: def primroot(P)
                   22447: {
                   22448:        PP=pari(factor,P);
                   22449:        P0=PP[0][0]; P1=PP[0][1];
                   22450:        S=size(PP);
                   22451:        if(S[0]>1 || !isint(P) || P0<=2){
                   22452:                print("Not odd prime(power)!");
                   22453:                return 0;
                   22454:        }
                   22455:        if(isint(Ind=getopt(ind))){
                   22456:                Ind %= P;
                   22457:                if(Ind<=0 || igcd(Ind,P)!=1 || (Z=primroot(P))==0){
                   22458:                        print("Not exist!");
                   22459:                        return 0;
                   22460:                }
                   22461:                P2=P0^(P1-1)*(P0-1);
                   22462:                for(I=1,S=1; I<P2; I++)
                   22463:                        if((S = (S*Z)%P) == Ind)        return I;
                   22464:                return 0;
                   22465:        }
                   22466:        if(getopt(all)==1){
                   22467:                I=primroot(P);
                   22468:                P2=P0^(P1-1)*(P0-1);
                   22469:                for(L=[],J=1; J<P2; J++){
                   22470:                        if(P1>1 && igcd(P0,J)!=1) continue;
                   22471:                        if(igcd(P0-1,J)!=1) continue;
                   22472:                        L=cons(nthmodp(I,J,P),L);
                   22473:                }
                   22474:                return qsort(L);
                   22475:        }
                   22476:        if(PP[0][1]>1){
                   22477:                I=primroot(P0);
                   22478:                P2=P0^(P1-2)*(P0-1);
                   22479:                if(nthmodp(I,P2,P)==1)  I+=P0;
                   22480:                return I;
                   22481:        }
                   22482:        F=pari(factor,P-1);
                   22483:        SF=size(F)[0];
                   22484:        for(I=2; I<P; I++){
                   22485:                for(J=0; J<SF; J++)
                   22486:                        if(nthmodp(I,(P-1)/F[J][0],P)==1) break;
                   22487:                if(J==SF) return I;
                   22488:        }
                   22489: }
                   22490:
                   22491: def rabin(P,X)
                   22492: {
                   22493:        for(M=0,Q=P-1;iand(Q,1)==0;M++,Q/=2);
                   22494:        Z=nthmodp(X,Q,P);
                   22495:        for(N=M;M>0&&Z!=1&&Z!=P-1;M--,Z=(Z*Z)%P);
                   22496:        return (M<N&&(M==0||Z==1))?0:1;
                   22497: }
                   22498:
                   22499: def powprimroot(P,N)
                   22500: {
                   22501:        if(P<3) P=3;
                   22502:        FE=getopt(exp);
                   22503:        if(FE!=1) FE=0;
                   22504:        if((Log=getopt(log))==1||Log==2) FE=-1;
                   22505:        else if(Log==3){
                   22506:                FE=-2;
                   22507:                for(PP=1, L0=["$r$","$p/a$"];;){
                   22508:                        PP=pari(nextprime,PP+1);
                   22509:                        if(PP>=P) break;
                   22510:                        L0=cons(PP, L0);
                   22511:                }
                   22512:                L0=reverse(L0);
                   22513:        }
                   22514:        if(FE==0) All=getopt(all);
                   22515:        for(I=0, PP=P, LL=[]; I<N; I++,PP++){
                   22516:                PP=pari(nextprime,PP);
                   22517:                if(All==1){
                   22518:                        PR=primroot(PP|all=1);
                   22519:                        LL=cons(cons(PP,PR),LL);
                   22520:                        continue;
                   22521:                }
                   22522:                PR=primroot(PP);
                   22523:                if(FE==-2){                                     /* log=3 */
                   22524:                        LT=cdr(L0);LT=cdr(L0);
                   22525:                        for(L=[PP];LT!=[];LT=cdr(LT))
                   22526:                                L=cons(primroot(PP|ind=car(LT)),L);
                   22527:                        LL=cons(reverse(L),LL);
                   22528:                        if(I<N-1) L0=append(L0,[PP]);
                   22529:                }else if(FE){
                   22530:                        for(J=1, L=[PP], K=1; J<PP; J++){
                   22531:                                if(FE==-1){                     /* log=1,2 */
                   22532:                                        K=primroot(PP|ind=J);
                   22533:                                        if(K==0 && Log==2) K=PP-1;
                   22534:                                }
                   22535:                                else K=(K*PR)%PP;       /* exp=1 */
                   22536:                                L=cons(K,L);
                   22537:                        }
                   22538:                        LL=cons(reverse(L),LL);
                   22539:                }else
                   22540:                        LL=cons([PP,PR],LL);    /* default */
                   22541:        }
                   22542:        LL=reverse(LL);
                   22543:        if(!FE) return LL;
                   22544:        PP--;
                   22545:        if(FE==-2)      return append(LL,[L0]);
                   22546:        for(I=1,L=["$p$"];I<PP; I++)    L=cons(I,L);
                   22547:        return cons(reverse(L),LL);
                   22548: }
                   22549:
                   22550: def ntable(F,II,D)
                   22551: {
                   22552:        F=f2df(F|opt=-1);
                   22553:        Df=getopt(dif);
1.16      takayama 22554:        Str=getopt(str);
1.6       takayama 22555:        if(Df!=1) Df=0;
1.16      takayama 22556:        L=[];
                   22557:        if(type(D)==4){
                   22558:                if(type(II[0])==4){
                   22559:                        T1=II[0][1]-II[0][0];T2=II[1][1]-II[1][0];
                   22560:                        for(L0=[],I=0;I<D[0];I++){
                   22561:                                for(R=[],J=0;J<D[1];J++)
                   22562:                                        R=cons(myf2eval(F,II[0][0]+I*T1/D[0],II[1][0]+J*T2/D[1]),R);
                   22563:                                L=cons(reverse(R),L);L0=cons(II[0][0]+I*T1/D[0],L0);
                   22564:                        }
                   22565:                }else{
                   22566:                        for(T=II[1]-II[0],L0=[],I=0;I<D[0];I++){
                   22567:                                for(R=[],J=0;J<D[1];J++)
                   22568:                                        R=cons(myfdeval(F,II[0]+I*T/D[0]+J*T/D[0]/D[1]),R);
                   22569:                                L=cons(reverse(R),L);L0=cons(II[0]+I*T/D[0],L0);
                   22570:                        }
                   22571:                }
                   22572:                L=reverse(L);L0=reverse(L0);
                   22573:                if(type(Str)==4){
                   22574:                        L0=mtransbys(os_md.sint,L0,[Str[0]]|str=1,zero=0);
                   22575:                        L=mtransbys(os_md.sint,L,[Str[1]]|str=1,zero=0);
                   22576:                        if(Df==1){
                   22577:                                for(DT=[],RT=L,I=0;RT!=[];){
                   22578:                                        for(LT=[],TT=car(RT);TT!=[];TT=cdr(TT)){
                   22579:                                                VV=car(TT);
                   22580:                                                if((J=str_char(VV,0,"."))>=0){
                   22581:                                                        if(J==0) VV=str_cut(VV,1,10000);
                   22582:                                                        else VV=str_cut(VV,0,J-1)+str_cut(VV,J+1,10000);
                   22583:                                                }
                   22584:                                                V1=eval_str(VV);
                   22585:                                                if(I++) LT=cons(V1-V0,LT);
                   22586:                                                V0=V1;
                   22587:                                        }
                   22588:                                        DT=cons(LT,DT);
                   22589:                                        if((RT=cdr(RT))==[]){
                   22590:                                                VE=rint(myfdeval(F,II[1])*10^Str[1]);
                   22591:                                                DT=cons([VE-V0],DT);
                   22592:                                        }
                   22593:                                }
                   22594:                                for(I=0,D=[],TT=DT;TT!=[];TT=cdr(TT)){
                   22595:                                        if(!I++) V=car(TT)[0];
                   22596:                                        else{
                   22597:                                                T1=reverse(cons(V,car(TT)));
                   22598:                                                V=car(T1);
                   22599:                                                if(length(TT)>1) T1=cdr(T1);
                   22600:                                                D=cons(T1,D);
                   22601:                                        }
                   22602:                                }
                   22603:                                for(DD=[],TT=D;TT!=[];TT=cdr(TT))
                   22604:                                DD=cons([os_md.lmin(car(TT)),os_md.lmax(car(TT))],DD);
                   22605:                                DD=reverse(DD);
                   22606:                                L=lsort(L,DD,"append");
                   22607:                        }
                   22608:                }
                   22609:                L=lsort(L,L0,"cons");
                   22610:                if(type(Top=getopt(top))==4||getopt(TeX)==1){
                   22611:                        if(type(Top)==4){
                   22612:                                K=length(L[0])-length(Top);
                   22613:                                if(K>0&&K<4){
                   22614:                                        if(K>1){
                   22615:                                                Top=append(Top,["",""]);
                   22616:                                                K-=2;
                   22617:                                        }
                   22618:                                        if(K) Top=cons("",Top);
                   22619:                                }
                   22620:                                L=cons(Top,L);
                   22621:                        }
                   22622:                        if(type(H=getopt(hline))!=4) H=[0,1,z];
                   22623:                        if(type(V=getopt(vline))!=4) V=[0,1,(DF)?z-2:z];
                   22624:                        if(type(T=getopt(title))!=7) Out=ltotex(L|opt="tab",hline=H,vline=V);
                   22625:                        else Out=ltotex(L|opt="tab",hline=H,vline=V,title=T);
                   22626:                        if(Df) Out=str_subst(Out,"\\hline","\\cline{1-"+rtostr(length(L[0])-2)+"}");
                   22627:                        return Out;
                   22628:                }
                   22629:                return L;
                   22630:        }
1.6       takayama 22631:        for(L=[],I=0;I<=D;I++){
                   22632:                X=II[0]+I*T/D;
                   22633:                L=cons([X,myfdeval(F,X)],L);
                   22634:        }
                   22635:        if(Df==1){
                   22636:                for(LD=[],LL=L;LL!=[];LL=cdr(LL)){
                   22637:                        if(LD==[]) LD=cons([car(LL)[0],car(LL)[1],0],LD);
                   22638:                        else LD=cons([car(LL)[0],car(LL)[1],abs(car(LL)[1]-car(LD)[1])],LD);
                   22639:                }
                   22640:                L=reverse(LD);
                   22641:        }
1.16      takayama 22642:        if(type(Str)==4){
1.6       takayama 22643:                if(length(Str)==1) Str=[Str[0],Str[0]];
1.16      takayama 22644:                if(Df==1 && length(Str)==2) Str=[Str[0],Str[1],Str[1]];
1.6       takayama 22645:                for(S=Str,Str=[];S!=[];S=cdr(S)){
                   22646:                        if(type(car(S))!=4) Str=cons([car(S),3],Str);
                   22647:                        else Str=cons(car(S),Str);
                   22648:                }
                   22649:                Str=reverse(Str);
                   22650:                for(LD=[],LL=L;LL!=[];LL=cdr(LL)){
                   22651:                        for(K=[],J=length(Str); --J>=0; )
                   22652:                                K=cons(sint(car(LL)[J],Str[J][0]|str=Str[J][1]),K);
                   22653:                        LD=cons(K,LD);
                   22654:                }
                   22655:                L=LD;
                   22656:        }else
                   22657:                L=reverse(L);
                   22658:        if(type(M=getopt(mult))==1){
                   22659:                Opt=[["opt","tab"],["vline",[[0,2+Df]]],["width",-M]];
                   22660:                if(type(T=getopt(title))==7)
                   22661:                        Opt=cons(["title",T],Opt);
                   22662:                if(type(Tp=getopt(top))==4)
                   22663:                        Opt=cons(["top",Tp],Opt);
                   22664:                L=ltotex(L|option_list=Opt);
                   22665:        }
                   22666:        return L;
                   22667: }
                   22668:
                   22669: def distpoint(L)
                   22670: {
                   22671:        L=m2l(L|flat=1);
                   22672:        if(getopt(div)==5) Div=5;
                   22673:        else Div=10;
                   22674:        V=newvect(100/Div);
                   22675:     for(LT=L,LL=[],N=0; LT!=[]; LT=cdr(LT)){
                   22676:                if(type(K=car(LT))>1||K<0){
                   22677:                        N++; continue;
                   22678:                }
                   22679:                LL=cons(K,LL);
                   22680:                T=idiv(K,Div);
                   22681:                if(Div==10 && T>=9) T=9;
                   22682:                else if(Div==5 && T>=19) T=19;
                   22683:                V[T]++;
                   22684:        }
                   22685:        V=vtol(V);
                   22686:        if((Opt=getopt(opt))=="data") return V;
                   22687:        Title=getopt(title);
                   22688:        OpList=[["opt","tab"]];
                   22689:        if(type(Title=getopt(title)) == 7)
                   22690:                        OpList=cons(["title",Title],OpList);
                   22691:        if(Opt=="average"){
                   22692:                T=isMs()?["平均点","標準偏差","最低点","最高点","受験人数"]:
                   22693:                ["average","deviation","min","max","examinees"];
                   22694:                L=average(LL);
                   22695:                L=[sint(L[0],1),sint(L[1],1),L[3],L[4],L[2]];
                   22696:                if(N>0){
                   22697:                        T=append(T,[isMs()?"欠席者":"absentees"]);L=append(L,[N]);
                   22698:                }
                   22699:                OpList=cons(["align","c"],OpList);
                   22700:                return ltotex([T,L]|option_list=OpList);
                   22701:        }
                   22702:
                   22703:        if(getopt(opt)=="graph"){
                   22704:                Mul=getopt(size);
                   22705:                if(Div==5){
                   22706:                        V0=["00","05","10","15","20","25","30","35","40","45","50","55",
                   22707:                        "60","65","70","75","80","85","90","95"];
                   22708:                        if(type(Mul)!=4){
                   22709:                                Size = (TikZ)?[12,3,1/2,0.2]:[120,30,1/2,2];
                   22710:                        }
                   22711:                }else{
                   22712:                        V0=["00-","10-","20-","30-","40-","50-","60-","70-","80-","90-"];
                   22713:                        if(type(Mul)!=4){
                   22714:                                Size = (TikZ)?[8,3,1/2,0.2]:[80,30,1/2,2];
                   22715:                        }
                   22716:                }
                   22717:                return ltotex([V,V0]|opt="graph",size=Size);
                   22718:        }
                   22719:        if(Div==5)
                   22720:                V0=["00--04","05--09","10--14","15--19", "20--24", "25--29", "30--34", "35-39",
                   22721:                "40--44", "45--49","50--54", "55--59","60--64", "65--69",
                   22722:                "70--74", "75--79","80--84", "85--89","90--94", "95--100"];
                   22723:        else
                   22724:                V0=["00--09","10--19","20--29","30--39","40--49","50--59","60--69",
                   22725:                "70--79","80--89","90--100"];
                   22726:        Title=getopt(title);
                   22727:        return ltotex([V0,V]|option_list=OpList);
                   22728: }
                   22729:
                   22730: def keyin(S)
                   22731: {
1.46      takayama 22732:        mycat0(S,0);
1.6       takayama 22733:        purge_stdin();
                   22734:        S=get_line();
                   22735:        L=length(S=strtoascii(S));
                   22736:        if(L==0) return "";
                   22737:        return str_cut(S,0,L-2);
                   22738: }
                   22739:
                   22740: def init() {
1.16      takayama 22741:        LS=["DIROUT","DVIOUTA","DVIOUTB","DVIOUTH","DVIOUTL","TeXLim","TeXEq","TikZ",
1.6       takayama 22742:                "XYPrec","XYcm","Canvas"];
                   22743:        if(!access(get_rootdir()+"/help/os_muldif.dvi")||!access(get_rootdir()+"/help/os_muldif.pdf"))
                   22744:                mycat(["Put os_muldif.dvi and os_muldif.pdf in", get_rootdir()+(isMs()?"\\help.":"/help.")]);
                   22745:        if(!isMs()){
                   22746:                DIROUT="%HOME%/asir/tex";
                   22747:                DVIOUTA=str_subst(DVIOUTA,[["\\","/"],[".bat",".sh"]],0);
                   22748:                DVIOUTB=str_subst(DVIOUTB,[["\\","/"],[".bat",".sh"]],0);
                   22749:                DVIOUTL=str_subst(DVIOUTL,[["\\","/"],[".bat",".sh"]],0);
                   22750:                DVIOUTH="%ASIRROOT%/help/os_muldif.pdf";
                   22751:        }
                   22752:        Home=getenv("HOME");
                   22753:        if(type(Home)!=7)       Home="";
                   22754:        for(Id=-7, F=Home; Id<-1;){
                   22755:                G = F+"/.muldif";
                   22756:                if(access(G)) Id = open_file(G);
                   22757:                else Id++;
                   22758:                if(Id==-6)              F+="/asir";
                   22759:                else if(Id==-5) F=get_rootdir();
                   22760:                else if(Id==-4) F+="/bin";
                   22761:                else if(Id==-3) F=get_rootdir()+"/lib-asir-contrib";
                   22762:        }
                   22763:        if(Id>=0){
                   22764:                while((S=get_line(Id))!=0){
1.18      takayama 22765:                        if(type(P=str_str(S,LS))==4 && (P0=str_char(S,P[1]+4,"="))>0){
1.6       takayama 22766:                                if(P[0]<5){
                   22767:                                        P0=str_chr(S,P0+1,"\"");
                   22768:                                        if(P0>0){
                   22769:                                                for(P1=P0;(P2=str_char(S,P1+1,"\""))>0; P1=P2);
                   22770:                                                if(P1>P0+1){
                   22771:                                                        SS=str_cut(S,P0+1,P1-1);
                   22772:                                                        SS=str_subst(SS,["\\\\","\\\""],["\\","\""]);
                   22773:                                                        if(P[0]==0)                     DIROUT=SS;
                   22774:                                                        else if(P[0]==1)        DVIOUTA=SS;
                   22775:                                                        else if(P[0]==2)        DVIOUTB=SS;
                   22776:                                                        else if(P[0]==3)        DVIOUTH=SS;
                   22777:                                                        else if(P[0]==4)        DVIOUTL=SS;
                   22778:                                                }
                   22779:                                        }
                   22780:                                        if(P0<0 || P1<P0+2) mycat(["Error!  Definiton of", LS[P[0]],
                   22781:                                                "in .muldif"]);
                   22782:                                }else{
                   22783:                                        SV=eval_str(str_cut(S,P0+1,str_len(S)-1));
1.16      takayama 22784:                                        if(P[0]==5)                     TeXLim=SV;
                   22785:                                        else if(P[0]==6)        TeXEq=SV;
                   22786:                                        else if(P[0]==7)        TikZ=SV;
                   22787:                                        else if(P[0]==8)        XYPrec=SV;
                   22788:                                        else if(P[0]==9)        XYcm=SV;
1.18      takayama 22789:                                        else if(P[0]==10)       Canvas=SV;
1.6       takayama 22790:                                }
                   22791:                        }
                   22792:                }
                   22793:                close_file(Id);
                   22794:        }
                   22795:        chkfun(1,0);
                   22796: }
                   22797:
                   22798: #ifdef USEMODULE
                   22799: endmodule;
                   22800: os_md.init()$
                   22801: #else
                   22802: init()$
                   22803: #endif
                   22804:
                   22805: end$

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