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

1.74    ! takayama    1: /* $OpenXM: OpenXM/src/asir-contrib/packages/src/os_muldif.rr,v 1.73 2020/09/30 05:07:55 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.72      takayama    9:  *          Toshio Oshima (Nov. 2007 - Sep. 2020)
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$
                     88: localf sord$
                     89: localf vprod$
                     90: localf dvangle$
                     91: localf dvprod$
                     92: localf dnorm$
1.71      takayama   93: localf dext$
1.6       takayama   94: localf mulseries$
                     95: localf pluspower$
                     96: localf vtozv$
                     97: localf dupmat$
                     98: localf matrtop$
                     99: localf mytrace$
                    100: localf mydet$
1.71      takayama  101: localf permanent$
1.6       takayama  102: localf mperm$
                    103: localf mtranspose$
                    104: localf mtoupper$
                    105: localf mydet2$
                    106: localf myrank$
                    107: localf meigen$
                    108: localf transm$
                    109: localf vgen$
                    110: localf mmc$
                    111: localf lpgcd$
                    112: localf mdivisor$
                    113: localf mdsimplify$
                    114: localf m2mc$
                    115: localf easierpol$
                    116: localf paracmpl$
                    117: localf mykernel$
                    118: localf myimage$
                    119: localf mymod$
                    120: localf mmod$
                    121: localf ladd$
1.71      takayama  122: localf lsub$
1.6       takayama  123: localf lchange$
                    124: localf llsize$
                    125: localf llbase$
1.60      takayama  126: localf llget$
1.6       takayama  127: localf lsort$
1.44      takayama  128: localf rsort$
1.22      takayama  129: localf lpair$
1.6       takayama  130: localf lmax$
                    131: localf lmin$
                    132: localf lgcd$
                    133: localf llcm$
                    134: localf ldev$
                    135: localf lsol$
                    136: localf lnsol$
                    137: localf l2p$
                    138: localf m2v$
                    139: localf lv2m$
                    140: localf m2lv$
                    141: localf s2m$
                    142: localf c2m$
                    143: localf m2diag$
                    144: localf myinv$
                    145: localf madjust$
                    146: localf mpower$
                    147: localf mrot$
                    148: localf texlen$
                    149: localf isdif$
1.69      takayama  150: localf isfctr$
1.6       takayama  151: localf fctrtos$
                    152: localf texlim$
                    153: localf fmult$
                    154: localf radd$
                    155: localf getel$
                    156: localf ptol$
                    157: localf rmul$
                    158: localf mtransbys$
1.58      takayama  159: localf trcolor$
1.61      takayama  160: localf mcolor$
1.6       takayama  161: localf drawopt$
                    162: localf execdraw$
                    163: localf execproc$
                    164: localf myswap$
                    165: localf mysubst$
                    166: localf evals$
                    167: localf myval$
                    168: localf myeval$
                    169: localf mydeval$
                    170: localf myfeval$
                    171: localf myf2eval$
                    172: localf myf3eval$
                    173: localf myfdeval$
                    174: localf myf2deval$
                    175: localf myf3deval$
                    176: localf myexp$
                    177: localf mycos$
                    178: localf mysin$
                    179: localf mytan$
                    180: localf myarg$
                    181: localf myasin$
                    182: localf myacos$
                    183: localf myatan$
                    184: localf mylog$
1.57      takayama  185: localf nlog$
1.6       takayama  186: localf mypow$
1.13      takayama  187: localf scale$
1.71      takayama  188: localf iceil$
1.6       takayama  189: localf arg$
                    190: localf sqrt$
                    191: localf gamma$
                    192: localf lngamma$
                    193: localf digamma$
                    194: localf dilog$
                    195: localf zeta$
                    196: localf eta$
                    197: localf jell$
                    198: localf frac$
                    199: localf erfc$
1.20      takayama  200: localf orthpoly$
                    201: localf schurpoly$
1.6       takayama  202: localf fouriers$
                    203: localf todf$
                    204: localf f2df$
                    205: localf df2big$
                    206: localf compdf$
                    207: localf fzero$
                    208: localf fmmx$
                    209: localf flim$
                    210: localf fcont$
                    211: localf fresidue$
                    212: localf mmulbys$
                    213: localf appldo$
                    214: localf appledo$
                    215: localf muldo$
                    216: localf jacobian$
                    217: localf hessian$
                    218: localf wronskian$
                    219: localf adj$
                    220: localf laplace1$
                    221: localf laplace$
                    222: localf mce$
                    223: localf mc$
                    224: localf rede$
                    225: localf ad$
                    226: localf add$
                    227: localf vadd$
                    228: localf addl$
                    229: localf cotr$
                    230: localf rcotr$
                    231: localf muledo$
                    232: localf mulpdo$
                    233: localf transpdosub$
                    234: localf transpdo$
                    235: localf translpdo$
                    236: localf rpdiv$
                    237: localf mygcd$
                    238: localf mylcm$
                    239: localf sftpexp$
                    240: localf applpdo$
                    241: localf tranlpdo$
                    242: localf divdo$
                    243: localf qdo$
                    244: localf sqrtdo$
                    245: localf ghg$
                    246: localf ev4s$
                    247: localf b2e$
                    248: localf sftpow$
                    249: localf sftpowext$
                    250: localf polinsft$
                    251: localf pol2sft$
                    252: localf polroots$
1.70      takayama  253: localf sgnstrum$
                    254: localf polstrum$
                    255: localf polrealroots$
                    256: localf polradiusroot$
1.6       takayama  257: localf fctri$
                    258: localf binom$
                    259: localf expower$
                    260: localf seriesHG$
                    261: localf seriesMc$
                    262: localf seriesTaylor$
1.27      takayama  263: localf mulpolyMod$
1.46      takayama  264: localf solveEq$
1.70      takayama  265: localf res0$
                    266: localf eqs2tex$
1.45      takayama  267: localf baseODE$
1.70      takayama  268: localf baseODE0$
1.26      takayama  269: localf taylorODE$
1.6       takayama  270: localf evalred$
                    271: localf toeul$
                    272: localf fromeul$
                    273: localf sftexp$
                    274: localf fractrans$
                    275: localf soldif$
                    276: localf chkexp$
                    277: localf sqrtrat$
                    278: localf getroot$
                    279: localf expat$
                    280: localf polbyroot$
                    281: localf polbyvalue$
                    282: localf pcoef$
1.58      takayama  283: localf pmaj$
1.6       takayama  284: localf prehombf$
                    285: localf prehombfold$
                    286: localf sub3e$
                    287: localf fuchs3e$
                    288: localf okubo3e$
                    289: localf eosub$
                    290: localf even4e$
                    291: localf odd5e$
                    292: localf extra6e$
                    293: localf rigid211$
                    294: localf solpokuboe$
                    295: localf stoe$
                    296: localf dform$
                    297: localf polinvsym$
                    298: localf polinsym$
                    299: localf tohomog$
                    300: localf substblock$
                    301: localf okuboetos$
                    302: localf heun$
                    303: localf fspt$
                    304: localf abs$
1.20      takayama  305: localf sgn$
1.6       takayama  306: localf calc$
                    307: localf isint$
                    308: localf israt$
                    309: localf iscrat$
                    310: localf isalpha$
                    311: localf isnum$
                    312: localf isalphanum$
1.8       takayama  313: localf isdecimal$
1.6       takayama  314: localf isvar$
                    315: localf isyes$
                    316: localf isall$
                    317: localf iscoef$
                    318: localf iscombox$
                    319: localf sproot$
                    320: localf spgen$
1.53      takayama  321: localf spbasic$
1.6       takayama  322: localf chkspt$
                    323: localf cterm$
                    324: localf terms$
                    325: localf polcut$
                    326: localf redgrs$
                    327: localf cutgrs$
                    328: localf mcgrs$
                    329: localf mc2grs$
                    330: localf mcmgrs$
1.38      takayama  331: localf spslm$
1.6       takayama  332: localf anal2sp$
                    333: localf delopt$
                    334: localf str_char$
                    335: localf str_pair$
                    336: localf str_cut$
                    337: localf str_str$
                    338: localf str_subst$
                    339: localf str_times$
                    340: localf str_tb$
                    341: localf strip$
                    342: localf i2hex$
                    343: localf sjis2jis$
                    344: localf jis2sjis$
                    345: localf s2os$
                    346: localf l2os$
                    347: localf r2os$
                    348: localf s2euc$
                    349: localf s2sjis$
                    350: localf r2ma$
                    351: localf evalma$
1.73      takayama  352: localf evalcoord$
                    353: localf readTikZ$
1.6       takayama  354: localf ssubgrs$
                    355: localf verb_tex_form$
                    356: localf tex_cuteq$
                    357: localf my_tex_form$
                    358: localf texket$
                    359: localf smallmattex$
                    360: localf divmattex$
                    361: localf dviout0$
                    362: localf myhelp$
                    363: localf isMs$
1.55      takayama  364: localf getline$
1.6       takayama  365: localf showbyshell$
                    366: localf readcsv$
                    367: localf tocsv$
                    368: localf getbyshell$
                    369: localf show$
                    370: localf dviout$
                    371: localf rtotex$
                    372: localf mtotex$
                    373: localf ltotex$
                    374: localf texbegin$
                    375: localf texcr$
                    376: localf texsp$
                    377: localf getbygrs$
                    378: localf mcop$
                    379: localf shiftop$
1.56      takayama  380: localf shiftPfaff;
1.6       takayama  381: localf conf1sp$
1.34      takayama  382: localf confexp$
1.36      takayama  383: localf confspt$
1.50      takayama  384: localf mcvm$
1.44      takayama  385: localf s2csp$
1.38      takayama  386: localf partspt$
1.6       takayama  387: localf pgen$
                    388: localf diagm$
                    389: localf mgen$
                    390: localf madj$
                    391: localf newbmat$
                    392: localf unim$
                    393: localf pfrac$
                    394: localf cfrac$
                    395: localf cfrac2n$
                    396: localf sqrt2rat$
                    397: localf s2sp$
                    398: localf sp2grs$
                    399: localf fimag$
                    400: localf trig2exp$
                    401: localf intpoly$
                    402: localf integrate$
1.22      takayama  403: localf rungeKutta$
1.6       takayama  404: localf simplog$
                    405: localf fshorter$
                    406: localf isshortneg$
                    407: localf intrat$
                    408: localf powsum$
                    409: localf bernoulli$
                    410: localf lft01$
                    411: localf linfrac01$
                    412: localf nthmodp$
                    413: localf issquaremodp$
                    414: localf rootmodp$
                    415: localf rabin$
                    416: localf primroot$
                    417: localf varargs$
                    418: localf ptype$
                    419: localf pfargs$
1.58      takayama  420: localf regress$
1.6       takayama  421: localf average$
1.23      takayama  422: localf tobig$
1.6       takayama  423: localf sint$
                    424: localf frac2n$
1.58      takayama  425: localf openGlib$
1.6       takayama  426: localf xyproc$
                    427: localf xypos$
                    428: localf xyput$
                    429: localf xybox$
                    430: localf xyline$
                    431: localf xylines$
                    432: localf xycirc$
                    433: localf xybezier$
                    434: localf lbezier$
                    435: localf draw_bezier$
                    436: localf tobezier$
                    437: localf velbezier$
                    438: localf ptbezier$
                    439: localf cutf$
                    440: localf fsum$
                    441: localf fint$
                    442: localf periodicf$
                    443: localf cmpf$
                    444: localf areabezier$
                    445: localf saveproc$
1.57      takayama  446: localf xyplot$
1.63      takayama  447: localf xyaxis$
1.6       takayama  448: localf xygraph$
                    449: localf xy2graph$
1.22      takayama  450: localf addIL$
1.19      takayama  451: localf xy2curve$
1.18      takayama  452: localf xygrid$
1.6       takayama  453: localf xyarrow$
                    454: localf xyarrows$
                    455: localf xyang$
                    456: localf xyoval$
1.33      takayama  457: localf xypoch$
1.72      takayama  458: localf xycircuit$
1.70      takayama  459: localf ptline$
1.6       takayama  460: localf ptcommon$
1.71      takayama  461: localf ptcontain$
1.6       takayama  462: localf ptcopy$
                    463: localf ptaffine$
                    464: localf ptlattice$
                    465: localf ptpolygon$
                    466: localf ptwindow$
1.70      takayama  467: localf ptconvex$
1.6       takayama  468: localf ptbbox$
1.71      takayama  469: localf darg$
                    470: localf dwinding$
1.6       takayama  471: localf lninbox$
                    472: localf ptcombezier$
                    473: localf ptcombz$
                    474: localf lchange$
                    475: localf init$
                    476: localf powprimroot$
                    477: localf distpoint$
                    478: localf ntable$
                    479: localf keyin$
                    480: localf mqsub$
                    481: localf msort$
                    482: #else
                    483: extern Muldif.rr$
                    484: extern TeXEq$
                    485: extern TeXLim$
1.70      takayama  486: extern TeXPages$
1.6       takayama  487: extern DIROUT$
1.16      takayama  488: extern DIROUTD$
1.6       takayama  489: extern DVIOUTL$
                    490: extern DVIOUTA$
                    491: extern DVIOUTB$
                    492: extern DVIOUTH$
                    493: extern DVIOUTF$
                    494: static LCOPT$
                    495: static COLOPT$
                    496: static LPOPT$
                    497: static LFOPT$
                    498: extern TikZ$
                    499: extern ErMsg$
                    500: extern FLIST$
                    501: extern IsYes$
                    502: extern XYPrec$
                    503: extern XYcm$
                    504: extern TikZ$
                    505: extern XYLim$
1.70      takayama  506: extern TeXPages$
1.6       takayama  507: extern Canvas$
                    508: extern ID_PLOT$
                    509: extern Rand$
                    510: extern LQS$
1.57      takayama  511: extern SV=SVORG$
1.6       takayama  512: #endif
                    513: static S_Fc,S_Dc,S_Ic,S_Ec,S_EC,S_Lc$
1.16      takayama  514: static S_FDot$
1.6       takayama  515: extern AMSTeX$
1.58      takayama  516: extern Glib_math_coordinate$
                    517: extern Glib_canvas_x$
                    518: extern Glib_canvas_y$
1.73      takayama  519: Muldif.rr="00200928"$
1.6       takayama  520: AMSTeX=1$
                    521: TeXEq=5$
                    522: TeXLim=80$
1.70      takayama  523: TeXPages=20$
1.6       takayama  524: TikZ=0$
                    525: XYcm=0$
                    526: XYPrec=3$
                    527: XYLim=4$
                    528: Rand=0$
                    529: DIROUT="%HOME%\\tex"$
                    530: DVIOUTL="%ASIRROOT%\\bin\\risatex0.bat"$
                    531: DVIOUTA="%ASIRROOT%\\bin\\risatex.bat"$
                    532: DVIOUTB="%ASIRROOT%\\bin\\risatex1%TikZ%.bat"$
                    533: DVIOUTH="start dviout -2 -hyper=0x90 \"%ASIRROOT%\\help\\os_muldif.dvi\" #%LABEL%"$
                    534: DVIOUTF=0$
                    535: LCOPT=["red","green","blue","yellow","cyan","magenta","black","white","gray"]$
                    536: COLOPT=[0xff,0xff00,0xff0000,0xffff,0xffff00,0xff00ff,0,0xffffff,0xc0c0c0]$
                    537: LPOPT=["above","below","left","right"]$
                    538: LFOPT=["very thin","thin","dotted","dashed"]$
1.45      takayama  539: SVORG=["x","y","z","w","u","v","p","q","r","s"]$
1.6       takayama  540: Canvas=[400,400]$
                    541: LQS=[[1,0]]$
                    542:
                    543: ErMsg = newvect(3,[
                    544:  "irregal argument", /* 0 */
                    545:  "too big size",     /* 1 */
                    546:  "irregal option"    /* 2 */
                    547: ])$
                    548: FLIST=0$
                    549: IsYes=[]$
                    550: ID_PLOT=-1$
                    551:
                    552: def erno(N)
                    553: {
                    554:        /* extern ErMsg; */
                    555:        print(ErMsg[N]);
                    556: }
                    557:
                    558: def chkfun(Fu, Fi)
                    559: {
                    560:        /* extern FLIST; */
                    561:        /* extern Muldif.rr; */
                    562:
                    563:        if(type(Fu) <= 1){
                    564:                if(Fu==1)
                    565:                        mycat(["Loaded os_muldif Ver.", Muldif.rr, "(Toshio Oshima)"]);
                    566:                else
                    567:                        mycat(["Risa/Asir Ver.", version()]);
                    568:                return 1;
                    569:        }
                    570:        if(type(FLIST) < 4)
                    571:                FLIST = flist();
                    572:        if(type(Fu) == 4){
                    573:                for(; Fu != [] ;Fu = cdr(Fu))
                    574:                        if(chkfun(car(Fu),Fi) == 0) return 0;
                    575:                return 1;
                    576:        }
                    577:        if(findin(Fu, FLIST) >= 0)
                    578:                return 1;
                    579:        FLIST = flist();
                    580:        if(findin(Fu, FLIST) >= 0)
                    581:                return 1;
                    582:        if(type(Fi)==7){
                    583:                mycat0(["load(\"", Fi,"\") -> try again!\n"],1);
                    584:                load(Fi);
                    585:        }
                    586:        return 0;
                    587: /*
                    588:        if(type(Fi) == 7)
                    589:                Fi = [Fi];
                    590:        for( ; Fi != []; Fi = cdr(Fi))
                    591:                load(car(Fi));
                    592:        FLIST = flist();
                    593:        return (findin(Fu,FLIST)>=0)?1:0;
                    594: */
                    595: }
                    596:
                    597: def makev(L)
                    598: {
                    599:        S = "";
                    600:        Num=getopt(num);
                    601:        while(length(L) > 0){
                    602:                VL = car(L); L = cdr(L);
                    603:                if(type(VL) == 7)
                    604:                        S = S+VL;
                    605:                else if(type(VL) == 2 || VL < 10)
                    606:                        S = S+rtostr(VL);
                    607:                else if(VL<46 && Num!=1)
                    608:                        S = S+asciitostr([VL+87]);
                    609:                else
                    610:                        S = S+rtostr(VL);
                    611:        }
                    612:        return strtov(S);
                    613: }
                    614:
                    615: def makenewv(L)
                    616: {
                    617:        if((V=getopt(var))<2) V="z_";
                    618:        else if(isvar(V)) V=rtostr(V);
                    619:        if(type(N=getopt(num))!=1) N=0;
1.21      takayama  620:        Var=varargs(L|all=2);
1.6       takayama  621:        for(XX=[],I=J=0;;I++){
                    622:                X=strtov(V+rtostr(I));
                    623:                if(findin(X,Var)<0){
                    624:                        XX=cons(X,XX);
                    625:                        if(++J>N) return X;
                    626:                        else if(J==N)  return reverse(XX);
                    627:                }
                    628:        }
                    629: }
                    630:
                    631: def shortv(P,L)
                    632: {
                    633:        V=vars(P);
                    634:        if(type(T=getopt(top))==2) T=strtoascii(rtostr(T))[0]-87;
                    635:        else T=10;
                    636:        for(;L!=[];L=cdr(L)){
                    637:                for(J=0;J<36;J++){
                    638:                        if(findin(X=makev([car(L),J]|num=1),V)>=0){
                    639:                                while(findin(Y=makev([T]),V)>=0) T++;
                    640:                                if(T>35) return P;
                    641:                                P=subst(P,X,Y);
                    642:                                T++;
                    643:                        }else if(J>0) break;
                    644:                }
                    645:        }
                    646:        return P;
                    647: }
                    648:
                    649: def vweyl(L)
                    650: {
                    651:        if(type(L) == 4){
                    652:                if(length(L) == 2)
                    653:                        return L;
                    654:                else
                    655:                        return [L[0],makev(["d",L[0]])];
                    656:        }
                    657:        /* else if(type(L)<2) return L; */
                    658:        return [L,makev(["d", L])];
                    659: }
                    660:
                    661: def mycat(L)
                    662: {
                    663:        if(type(L) != 4){
                    664:                print(L);
                    665:                return;
                    666:        }
                    667:        Opt = getopt(delim);
                    668:        Del = (type(Opt) >= 0)?Opt:" ";
                    669:        Opt = getopt(cr);
                    670:        CR = (type(Opt) >= 0)?0:1;
                    671:        while(L != []){
                    672:                if(Do==1)
                    673:                        print(Del,0);
                    674:                print(car(L),0);
                    675:                L=cdr(L);
                    676:                Do = 1;
                    677:        }
                    678:        if(CR) print("");
1.46      takayama  679:        else print("",2);
1.6       takayama  680: }
                    681:
1.9       takayama  682: def fcat(S,X)
                    683: {
                    684:        if(type(S)!=7){
1.18      takayama  685:                if(type(DIROUTD)!=7){
                    686:                        DIROUTD=str_subst(DIROUT,["%HOME%","%ASIRROOT%","\\"],
                    687:                                [getenv("HOME"),get_rootdir(),"/"])+"/";
                    688:                        if(isMs()) DIROUTD=str_subst(DIROUTD,"/","\\"|sjis=1);
                    689:                }
1.16      takayama  690:                T="fcat";
                    691:                if(S>=2&&S<=9) T+=rtostr(S);
                    692:                T=DIROUTD+T+".txt";
                    693:                if(S==-1) return T;
                    694:                if(S!=0&&access(T)) remove_file(T);
                    695:                S=T;
1.9       takayama  696:        }
1.19      takayama  697:        R=output(S);
1.9       takayama  698:        print(X);
                    699:        output();
1.16      takayama  700:        if(getopt(exe)==1) shell("\""+S+"\"");
1.19      takayama  701:        return R;
1.9       takayama  702: }
                    703:
1.6       takayama  704: def mycat0(L,T)
                    705: {
                    706:        Opt = getopt(delim);
                    707:        Del = (type(Opt) >= 0)?Opt:"";
1.20      takayama  708:        if(type(L)!=4) L=[L];
1.6       takayama  709:        while(L != []){
                    710:                if(Do==1)
                    711:                        print(Del,0);
                    712:                print(car(L),0);
                    713:                L=cdr(L);
                    714:                Do = 1;
                    715:        }
                    716:        if(T) print("");
1.46      takayama  717:        else print("",2);
1.6       takayama  718: }
                    719:
                    720: def findin(M,L)
                    721: {
                    722:        if(type(L)==4){
                    723:                for(I = 0; L != []; L = cdr(L), I++)
                    724:                        if(car(L) == M) return I;
                    725:        }else if(type(L)==5){
                    726:                K=length(L);
                    727:                for(I = 0; I < K; I++)
                    728:                        if(L[I] == M) return I;
                    729:        }else return -2;
                    730:        return -1;
                    731: }
                    732:
                    733: def countin(S,M,L)
                    734: {
1.10      takayama  735:        Step=getopt(step);
                    736:        if(type(Step)==1){
                    737:                N=(Step>0)?Step:-Step;
1.7       takayama  738:                if(type(L)==5) L=vtol(L);
                    739:                L=qsort(L);
                    740:                while(car(L)<S&&L!=[]) L=cdr(L);
                    741:                S+=M;
1.10      takayama  742:                for(R=[],C=I=0;L!=[];){
                    743:                        if(car(L)<S||(Step>0&&car(L)==S)){
1.7       takayama  744:                                C++;
                    745:                                L=cdr(L);
                    746:                        }else{
                    747:                                R=cons(C,R);C=0;S+=M;
1.10      takayama  748:                                if(N>1&&++I>=N) break;
1.7       takayama  749:                        }
                    750:                }
                    751:                if(C>0) R=cons(C,R);
1.10      takayama  752:                if(N>1&&(N-=length(R))>0) while(N-->0) R=cons(0,R);
1.7       takayama  753:                return reverse(R);
                    754:        }
1.6       takayama  755:        if(type(L)==4){
                    756:                for(N=0; L!=[]; L=cdr(L))
                    757:                        if(car(L)>=S && car(L)<=M) N++;
                    758:        }else if(type(L)==5){
                    759:                K=length(L);
                    760:                for(I = 0; I < K; I++)
                    761:                        if(L[I]>=S && L[I]<=M) N++;
                    762:        }else return -2;
                    763:        return N;
                    764: }
                    765:
                    766: def mycoef(P,N,X)
                    767: {
                    768:        if(type(P)<3 && type(N)<3)
                    769:                return coef(P,N,X);
                    770:        if(type(P) >= 4)
                    771: #ifdef USEMODULE
                    772:                return map(os_md.mycoef,P,N,X);
                    773: #else
                    774:                return map(mycoef,P,N,X);
                    775: #endif
                    776:        if(type(N)==4){
                    777:                for(;N!=[];N=cdr(N),X=cdr(X))
                    778:                        P=mycoef(P,car(N),car(X));
                    779:                return P;
                    780:        }
                    781:        if(deg(dn(P), X) > 0){
                    782:                P = red(P);
                    783:                if(deg(dn(P), X) > 0)
                    784:                        return 0;
                    785:        }
                    786:        return red(coef(nm(P),N,X)/dn(P));
                    787: }
                    788:
                    789: def mydiff(P,X)
                    790: {
                    791:        if(X == 0)
                    792:                return 0;
                    793:        if(type(P)<3 && type(X)<3)
                    794:                return diff(P,X);
                    795:        if(type(P) >= 4)
                    796: #ifdef USEMODULE
                    797:                return map(os_md.mydiff,P,X);
                    798: #else
                    799:                return map(mydiff,P,X);
                    800: #endif
                    801:        if(type(X)==4){
                    802:                for(;X!=[];X=cdr(X)) P=mydiff(P,car(X));
                    803:                return P;
                    804:        }
1.19      takayama  805:        if(ptype(dn(P),X)<2)
1.6       takayama  806:                return red(diff(nm(P),X)/dn(P));
                    807:        return red(diff(P,X));
                    808: }
                    809:
                    810: def myediff(P,X)
                    811: {
                    812:        if(X == 0)
                    813:                return 0;
                    814:        if(type(P) < 3)
                    815:                 return ediff(P,X);
                    816:        if(type(P) >= 4)
                    817: #ifdef USEMODULE
                    818:                return map(os_md.myediff,P,X);
                    819: #else
                    820:                return map(myediff,P,X);
                    821: #endif
                    822:        if(deg(dn(P),X) == 0)
                    823:                return red(ediff(nm(P),X)/dn(P));
                    824:        return red(X*diff(P,X));
                    825: }
                    826:
1.56      takayama  827: def mypdiff(P,L)
                    828: {
                    829:        if(type(P)>3) return map(os_md.mypdiff,P,L);
                    830:        for(Q=0;L!=[];L=cdr(L)){
                    831:                Q+=mydiff(P,car(L))*L[1];
                    832:                L=cdr(L);
                    833:        }
                    834:        return red(Q);
                    835: }
                    836:
1.57      takayama  837: def pTaylor(S,X,N)
1.56      takayama  838: {
1.57      takayama  839:        if(!isvar(T=getopt(time))) T=t;
                    840:        if(type(S)<4) S=[S];
                    841:        if(type(X)<4) X=[X];
                    842:        if(findin(T,varargs(S|all=2))>=0){
                    843:                S=cons(z_z,S);X=cons(z_z,X);FT=1;
                    844:        }else FT=0;
                    845:        LS=length(S);
                    846:        FR=(getopt(raw)==1)?1:0;
                    847:        if(!FR) R=newvect(LS);
1.56      takayama  848:        else R=R1=[];
1.57      takayama  849:        for(L=[],I=0,TS=S,TX=X;I<LS;I++,TS=cdr(TS),TX=cdr(TX)){
                    850:                if(!FR) R[I]=car(TX)+car(TS)*T;
1.56      takayama  851:                else{
1.57      takayama  852:                        R=cons(car(TX),R);R1=cons(car(TS),R1);
1.56      takayama  853:                }
1.57      takayama  854:                L=cons(car(TS),cons(car(TX),L));
1.56      takayama  855:        }
1.57      takayama  856:        L=reverse(L);
                    857:        if(FR) R=[reverse(R1),reverse(R)];
1.56      takayama  858:        for(K=M=1;N>1;N--){
                    859:                S=mypdiff(S,L);
                    860:                K*=++M;
                    861:                for(TS=S,I=0,R1=[];TS!=[];TS=cdr(TS),I++){
1.57      takayama  862:                        if(!FR) R[I]+=car(TS)*t^M/K;
1.56      takayama  863:                        else R1=cons(car(TS)/K,R1);
                    864:                }
1.57      takayama  865:                if(FR) R=cons(reverse(R1),R);
1.56      takayama  866:        }
1.57      takayama  867:        if(FT){
                    868:                if(!FR){
1.56      takayama  869:                        S=newvect(LS-1);
                    870:                        for(I=1;I<LS;I++) S[I-1]=R[I];
                    871:                }else{
                    872:                        for(S=[];R!=[];R=cdr(R)){
                    873:                                S=cons(cdr(car(R)),S);
                    874:                        }
                    875:                        R=S;
                    876:                }
                    877:                R=subst(S,z_z,0);
                    878:        }
1.57      takayama  879:        return (FR&&!FT)?reverse(R):R;
1.56      takayama  880: }
                    881:
1.6       takayama  882: def m2l(M)
                    883: {
                    884:        if(type(M) < 4)
                    885:                return [M];
                    886:        if(type(M) == 4){
                    887:                if(type(car(M))==4 && getopt(flat)==1){
                    888:                        for(MM = []; M!=[]; M=cdr(M))
                    889:                                MM = append(MM,car(M));
                    890:                        return MM;
                    891:                }
                    892:                return M;
                    893:        }
                    894:        if(type(M) == 5)
                    895:                return vtol(M);
                    896:        S = size(M);
                    897:        for(MM = [], I = S[0]-1; I >= 0; I--)
                    898:                MM = append(vtol(M[I]), MM);
                    899:        return MM;
                    900: }
                    901:
                    902: def mydeg(P,X)
                    903: {
1.56      takayama  904:        if(type(P) < 3 && type(X)==2)
1.6       takayama  905:                return deg(P,X);
1.56      takayama  906:        II=(type(X)==4)?-100000:-1;
1.6       takayama  907:        Opt = getopt(opt);
                    908:        if(type(P) >= 4){
                    909:                S=(type(P) == 6)?size(P)[0]:0;
                    910:                P = m2l(P);
1.56      takayama  911:                for(I = 0, Deg = -100000; P != []; P = cdr(P), I++){
                    912:                        if( (DT = mydeg(car(P),X)) == -2&&type(X)!=4)
1.6       takayama  913:                                return -2;
                    914:                        if(DT > Deg){
                    915:                                Deg = DT;
                    916:                                II = I;
                    917:                        }
                    918:                }
                    919:                return (Opt==1)?([Deg,(S==0)?II:[idiv(II,S),irem(II,S)]]):Deg;
                    920:        }
                    921:        P = red(P);
1.56      takayama  922:        if(type(X)==2){
                    923:                if(deg(dn(P),X) == 0)
                    924:                        return deg(nm(P),X);
                    925:        }else{
                    926:                P=nm(red(P));
                    927:                for(D=-100000,I=deg(P,X[1]);I>=0;I--){
                    928:                        if(TP=mycoef(P,I,X[1])){
                    929:                                TD=mydeg(TP,X[0])-I;
                    930:                                if(D<TD) D=TD;
                    931:                        }
                    932:                }
                    933:                return D;
                    934:        }
1.6       takayama  935:        return -2;
                    936: }
                    937:
                    938: def pfctr(P,X)
                    939: {
                    940:        P=red(P);
                    941:        if((T=ptype(P,X))>3) return [];
                    942:        if(T==3){
                    943:                G=pfctr(dn(P),X);
                    944:                F=pfctr(nm(P),X);
                    945:                R=[[car(F)[0]/car(G)[0],1]];
                    946:                for(F=cdr(F);F!=[];F=cdr(F)) R=cons(car(F),R);
                    947:                for(G=cdr(G);G!=[];G=cdr(G)) R=cons([car(G)[0],-car(G)[1]],R);
                    948:                return reverse(R);
                    949:        }
                    950:        F=fctr(nm(P));
                    951:        for(R=[],C=1/dn(P);F!=[];F=cdr(F))
                    952:                if(mydeg(car(F)[0],X)>0) R=cons(car(F),R);
                    953:        else C*=car(F)[0]^car(F)[1];
                    954:        return cons([C,1],reverse(R));
                    955: }
                    956:
                    957: def mymindeg(P,X)
                    958: {
                    959:        if(type(P) < 3)
                    960:                return mindeg(P,X);
                    961:        II = -1;T=60;
                    962:        Opt = getopt(opt);
                    963:        if(type(P) >= 4){
                    964:                S=(type(P) == 6)?size(P)[0]:0;
                    965:                P = m2l(P);
                    966:                for(I = 0, Deg = -3; P != []; P = cdr(P), I++){
                    967:                        if(car(P) == 0)
                    968:                                continue;
                    969:                        if( (DT = mydeg(car(P),X)) == -2)
                    970:                                return -2;
                    971:                        if(DT < Deg || Deg == -3){
                    972:                                if(DT==0){
                    973:                                        if(type(car(P))>=T) continue;
                    974:                                        T=type(car(P));
                    975:                                }
                    976:                                Deg = DT;
                    977:                                II = I;
                    978:                        }
                    979:                }
                    980:                return (Opt==1)?([Deg,(S==0)?II:[idiv(II,S),irem(II,S)]]):Deg;
                    981:        }
                    982:        P = red(P);
                    983:        if(deg(dn(P),X) == 0)
                    984:                return mindeg(nm(P),X);
                    985:        return -2;
                    986: }
                    987:
                    988: def m1div(M,N,L)
                    989: {
                    990:        L = (type(L) <= 3)?[0,L]:vweyl[L];
                    991:        DX = L[1]; X = L[0];
                    992:        if(mydeg(N,DX) != 0)
                    993:                return 0;
                    994:        DD = mydeg(M,DX);
                    995:        MM = M;
                    996:        while( (Deg=mydeg(MM,DX)) > 0){
                    997:                MC = mycoef(MM,Deg,DX)*DX^(Deg-1);
                    998:                MS = radd(MC, MS);
                    999:                MM = radd(MM, muldo(MC,radd(-DX,N),L));
                   1000:  }
                   1001:  return [MM, MS];
                   1002: }
                   1003:
                   1004:
                   1005: def mulsubst(F,L)
                   1006: {
                   1007:        N = length(L);
                   1008:        if(N == 0)
                   1009:                return F;
                   1010:        if(type(L[0])!=4)       L=[L];
1.46      takayama 1011:        if(getopt(lpair)==1||(type(L[0])==4&&length(L[0])>2)) L=lpair(L[0],L[1]);
1.6       takayama 1012:        if(getopt(inv)==1){
                   1013:                for(R=[];L!=[];L=cdr(L)) R=cons([car(L)[1],car(L)[0]],R);
                   1014:                L=reverse(R);
                   1015:        }
                   1016:        if(length(L)==1)        return mysubst(F,L);
                   1017:        L1 = newvect(N);
                   1018:        for(J = 0; J < N ; J++)
                   1019:                L1[J] = uc();
                   1020:        L2 = newvect(N);
                   1021:        for(J = 0; J < N; J++){
                   1022:                S = L[J][1];
                   1023:                for(I = 0; I < N; I++)
                   1024:                        S = mysubst(S,[L[I][0],L1[I]]);
                   1025:                L2[J] = S;
                   1026:        }
                   1027:        for(J = 0; J < N; J++)
                   1028:                F = mysubst(F, [L[J][0],L2[J]]);
                   1029:        for(J = 0; J < N; J++)
                   1030:                F = mysubst(F, [L1[J],L[J][0]]);
                   1031:        return F;
                   1032: }
                   1033:
                   1034: def cmpsimple(P,Q)
                   1035: {
                   1036:        T = getopt(comp);
                   1037:        if(P == Q)
                   1038:                return 0;
                   1039:        D = 0;
                   1040:        if(type(T) < 0)
                   1041:                T = 7;
                   1042:        if(iand(T,1))
                   1043:                D = length(vars(P)) - length(vars(Q));
                   1044:        if(!D && iand(T,2))
                   1045:                D = nmono(P) - nmono(Q);
                   1046:        if(!D && iand(T,4))
                   1047:                D = str_len(rtostr(P)) - str_len(rtostr(Q));
                   1048:        if(!D){
                   1049:                 if(P > Q) D++;
                   1050:                 else D--;
                   1051:        }
                   1052:        return D;
                   1053: }
                   1054:
                   1055: def simplify(P,L,T)
                   1056: {
                   1057:        if(type(P) > 3)
                   1058: #ifdef USEMODULE
                   1059:                return map(os_md.simplify,P,L,T);
                   1060: #else
                   1061:                return map(simplify,P,L,T);
                   1062: #endif
                   1063:        if(type(L[0]) == 4){
                   1064:                if(length(L[0]) > 1)
                   1065: #if USEMODULE
                   1066:                        return fmult(os_md.simplify,P,L,[T]);
                   1067: #else
                   1068:                        return fmult(simplify,P,L,[T]);
                   1069: #endif
                   1070:                L = L[0];
                   1071:        }
                   1072:        if(type(Var=getopt(var)) == 4 && Var!=[]){
                   1073:                if(type(P) == 3)
                   1074:                        return simplify(nm(P),P,L,T|var=Var)/simplify(dn(P),P,L,T|var=Var);
                   1075:                V = car(Var);
                   1076:                if((I = mydeg(P,V)) > 0){
                   1077:                        Var = cdr(Var);
                   1078:                        for(Q=0; I>=0 ; I--)
                   1079:                                Q += simplify(mycoef(P,I,V), L, T|var=Var)*V^I;
                   1080:                        return Q;
                   1081:                }
                   1082:        }
                   1083:        if(length(L) == 1){
                   1084:                L = car(L);
                   1085:                for(V = vars(L); V != []; V = cdr(V)){
                   1086:                        VT = car(V);
                   1087:                        if(deg(L,VT) != 1) continue;
                   1088:                        P = simplify(P, [VT, -red(coef(L,0,VT)/coef(L,1,VT))], T);
                   1089:                }
                   1090:                return P;
                   1091:        }
                   1092:        Q = mysubst(P,[L[0],L[1]]);
                   1093:        return (cmpsimple(P,Q|comp=T) <= 0)?P:Q;
                   1094: }
                   1095:
                   1096: def monotos(P)
                   1097: {
                   1098:        if(nmono(P) <= 1)
                   1099:                return rtostr(P);
                   1100:        return "("+rtostr(P)+")";
                   1101: }
                   1102:
                   1103:
                   1104: def monototex(P)
                   1105: {
                   1106:        Q=my_tex_form(P);
                   1107:        if(nmono(P)<2 && (getopt(minus)!=1 || str_str(Q,"-"|top=0,end=0)<0))
                   1108:                return Q;
                   1109:        return "("+Q+")";
                   1110: }
                   1111:
                   1112: def minustos(S)
                   1113: {
                   1114:        if(str_str(S,"-"|top=0,end=0)<0) return S;
                   1115:        return "("+S+")";
                   1116: }
                   1117:
                   1118: def vnext(V)
                   1119: {
                   1120:        S = length(V);
                   1121:        for(I = S-1; I > 0; I--){
                   1122:                if(V[I-1] < V[I]){
                   1123:                        V0 = V[I-1];
                   1124:                        for(J = I+1; J < S; J++)
                   1125:                                if(V0 >= V[J]) break;
                   1126:                        V[I-1] = V[--J];
                   1127:                        V[J] = V0;
                   1128:                        for(J = S-1; I < J; I++, J--){
                   1129:                                V0 = V[I];
                   1130:                                V[I] = V[J];
                   1131:                                V[J] = V0;
                   1132:                        }
                   1133:                        return 1;
                   1134:                }
                   1135:        }
                   1136:        return 0;
                   1137: }
                   1138:
                   1139: def ldict(N, M)
                   1140: {
                   1141:        Opt = getopt(opt);
                   1142:        R = S = [];
                   1143:        for(I = 2; N > 0; I++){
                   1144:                R = cons(irem(N,I), R);
                   1145:                N = idiv(N,I);
                   1146:        }
                   1147:        L = LL = length(R);
                   1148:        T=newvect(LL+1);
                   1149:        while(L-- > 0){
                   1150:                V = car(R); R = cdr(R);
                   1151:                for(I = J = 0; J <= V ; I++){
                   1152:                        if(T[I] == 0)
                   1153:                                J++;
                   1154:                }
                   1155:                T[I-1] = 1;
                   1156:                S = cons(LL-I+1, S);
                   1157:        }
                   1158:        for(I = 0; I <= LL; I++){
                   1159:                if(T[I] == 0){
                   1160:                        S = cons(LL-I, S);
                   1161:                        break;
                   1162:                }
                   1163:        }
                   1164:        if(M == 0)
                   1165:                return S;
                   1166:        if(M <= LL){
                   1167:                print("too small size");
                   1168:                return 0;
                   1169:        }
                   1170:        T = [];
                   1171:        for(I = --M; I > LL; I--)
                   1172:                T = cons(I,T);
                   1173:        S = append(S,T);
                   1174:        if(Opt == 2 || Opt == 3)
                   1175:                S = reverse(S);
                   1176:        if(Opt != 1 && Opt != 3)
                   1177:                return S;
                   1178:        for(T = []; S != []; S = cdr(S))
                   1179:                T = cons(M-car(S),T);
                   1180:        return T;
                   1181: }
                   1182:
                   1183: def ndict(L)
                   1184: {
                   1185:        Opt = getopt(opt);
                   1186:        R = [];
                   1187:        if(Opt != 1 && Opt != 2)
                   1188:                L = reverse(L);
                   1189:        T = (Opt == 1 || Opt == 3)?1:0;
                   1190:        for( ; L != []; L = cdr(L)){
                   1191:                for(I = 0, V = car(L), LT = cdr(L); LT != []; LT = cdr(LT))
                   1192:                        if(T == 0){
                   1193:                                if(V < car(LT)) I++;
                   1194:                        }else if (V > car(LT)) I++;
                   1195:                R = cons(I, R);
                   1196:        }
                   1197:        R = reverse(R);
                   1198:        for(V = 0, I = length(R); I > 0; R = cdr(R), I--)
                   1199:                V = V*I + car(R);
                   1200:        return V;
                   1201: }
                   1202:
                   1203: def nextsub(L,N)
                   1204: {
                   1205:        if(type(L) == 1){
                   1206:                for(LL = [], I = L-1; I >= 0; I--)
                   1207:                        LL = cons(I,LL);
                   1208:                return LL;
                   1209:        }
                   1210:        M = length(L = ltov(L));
                   1211:        K = N-M;
                   1212:        for(I = M-1; I >= 0; I--)
                   1213:                if(L[I] < I+K) break;
                   1214:        if(I < 0)
                   1215:                return 0;
                   1216:        for(J = L[I]+1; I < M; I++, J++)
                   1217:                L[I] = J;
                   1218:        return vtol(L);
                   1219: }
                   1220:
                   1221: def nextpart(L)
                   1222: {
                   1223:        if(car(L) <= 1)
                   1224:                return 0;
                   1225:        for(I = 0, L = reverse(L); car(L) == 1; L=cdr(L))
                   1226:                I++;
                   1227:        I += (K = car(L));
                   1228:        R = irem(I,--K);
                   1229:        R = (R==0)?[]:[R];
                   1230:        for(J = idiv(I,K); J > 0; J--)
                   1231:                R = cons(K,R);
                   1232:        L = cdr(L);
                   1233:        while(L!=[]){
                   1234:                R = cons(car(L), R);
                   1235:                L = cdr(L);
                   1236:        }
                   1237:        return R;
                   1238: }
                   1239:
                   1240: def transpart(L)
                   1241: {
                   1242:        L = reverse(L);
                   1243:        for(I=1, R=[]; L!= []; I++){
                   1244:                R = cons(length(L), R);
                   1245:                while(L != [] && car(L) <= I)
                   1246:                        L = cdr(L);
                   1247:        }
                   1248:        return reverse(R);
                   1249: }
                   1250:
                   1251: def trpos(A,B,N)
                   1252: {
                   1253:        S = newvect(N);
                   1254:        for(I = 0; I < N; I++)
                   1255:                S[I]=(I==A)?B:((I==B)?A:I);
                   1256:        return S;
                   1257: }
                   1258:
                   1259: def sprod(S,T)
                   1260: {
                   1261:        L = length(S);
                   1262:        V = newvect(L);
                   1263:        while(--L >= 0)
                   1264:                V[L] = S[T[L]];
                   1265:        return V;
                   1266: }
                   1267:
                   1268: def sinv(S)
                   1269: {
                   1270:        L = length(S);
                   1271:        V = newvect(L);
                   1272:        while(--L >= 0)
                   1273:                V[S[L]] = L;
                   1274:        return V;
                   1275: }
                   1276:
                   1277: def slen(S)
                   1278: {
                   1279:        L = length(S);
                   1280:        for(V = 0, J = 2; J < L; i++){
                   1281:                for(I = 0; I < J; I++)
                   1282:                        if(S[I] > S[J]) V++;
                   1283:        }
                   1284:        return V;
                   1285: }
                   1286:
                   1287: def sord(W,V)
                   1288: {
                   1289:        L = length(W);
                   1290:        W0 = nevect(L);
                   1291:        V0 = newvect(L);
                   1292:        for(I = F = C = 0; I < L; I++){
                   1293:                C = 0;
                   1294:                if( (W1 = W[I]) > (V1 = V[I]) ){
                   1295:                        if(F < 0) C = 1;
                   1296:                        else if(F==0) F = 1;
                   1297:                }else if(W1 < V1){
                   1298:                        if(F > 0) C = 1;
                   1299:                        else if(F==0) F = -1;
                   1300:                }
                   1301:                for(J = I;--J >= 0 && W0[J] > W1; ) W0[J+1] = W0[J];
                   1302:                W0[J+1] = W1;
                   1303:                for(J = I;--J >= 0 && V0[J] > V1; ) V0[J+1] = V0[J];
                   1304:                V0[J+1] = V1;
                   1305:                if(C){
                   1306:                        for(J = I; J >= 0; J--){
                   1307:                                if((W1=W0[J]) == (V1=V0[J])) continue;
                   1308:                                if(W1 > V1){
                   1309:                                        if(F < 0) return 2;
                   1310:                                }
                   1311:                                else if(F > 0) return 2;
                   1312:                        }
                   1313:                }
                   1314:        }
                   1315:        return F;
                   1316: }
                   1317:
                   1318: def vprod(V1,V2)
                   1319: {
1.71      takayama 1320:        V1=lsub(V1);V2=lsub(V2);
1.6       takayama 1321:        for(R = 0, I = length(V1)-1; I >= 0; I--)
                   1322:                R = radd(R, rmul(V1[I], V2[I]));
                   1323:        return R;
                   1324: }
                   1325:
                   1326: def dnorm(V)
                   1327: {
1.61      takayama 1328:        if(type(V)<2) return ctrl("bigfloat")?abs(V):dabs(V);
1.58      takayama 1329:        if((M=getopt(max))==1||M==2){
                   1330:                if(type(V)==5) V=vtol(V);
                   1331:                for(S=0;V!=[];V=cdr(V)){
1.61      takayama 1332:                        if(M==2) S+=ctrl("bigfloat")?abs(car(V)):dabs(car(V));
1.58      takayama 1333:                        else{
1.61      takayama 1334:                                if((T=ctrl("bigfloat")?abs(car(V)):dabs(car(V)))>S) S=T;
1.58      takayama 1335:                        }
                   1336:                }
                   1337:                return S;
                   1338:        }
1.6       takayama 1339:        R=0;
                   1340:        if(type(V)!=4)
1.58      takayama 1341:                for (I = length(V)-1; I >= 0; I--) R+= real(V[I])^2+imag(V[I])^2;
1.6       takayama 1342:        else{
                   1343:                if(type(V[0])>3){
                   1344:                        V=ltov(V[0])-ltov(V[1]);
                   1345:                        return dnorm(V);
                   1346:                }
1.58      takayama 1347:                for(;V!=[]; V=cdr(V))   R+=real(car(V))^2+imag(car(V))^2;
1.6       takayama 1348:        }
1.61      takayama 1349:        return ctrl("bigfloat")?pari(sqrt,R):dsqrt(R);
1.6       takayama 1350: }
                   1351:
                   1352: def dvprod(V1,V2)
                   1353: {
                   1354:        if(type(V1)<2) return V1*V2;
                   1355:        R=0;
1.71      takayama 1356:        V1=lsub(V1);
                   1357:        V2=lsub(V2);
1.6       takayama 1358:        if(type(V1)!=4)
                   1359:                for(I = length(V1)-1; I >= 0; I--)
                   1360:                        R += V1[I]*V2[I];
                   1361:        else{
                   1362:                for(; V1!=[]; V1=cdr(V1),V2=cdr(V2))
                   1363:                        R+=car(V1)*car(V2);
                   1364:        }
                   1365:        return R;
                   1366: }
                   1367:
1.70      takayama 1368: def ptline(L,R)
                   1369: {
                   1370:        P=L[0];Q=L[1];
                   1371:        return (Q[1]-P[1])*(R[0]-P[0])-(Q[0]-P[0])*(R[1]-P[1]);
                   1372: }
                   1373:
                   1374:
1.6       takayama 1375: def dvangle(V1,V2)
                   1376: {
                   1377:        if(V2==0 && type(V1)==4 && length(V1)==3 &&
                   1378:          (type(V1[0])==4 || type(V1[0])==5 || type(V1[1])==4 || type(V1[1])==5 ||
                   1379:           type(V1[2])==4 || type(V1[2])==5) ){
                   1380:                if(V1[0]==0 || V1[1]==0 || V1[2]==0) return 1;
                   1381:                PV2=V1[1];
                   1382:                if(type(PV2)==4){
                   1383:                        PV2=ltov(PV2);
                   1384:                        return dvangle(PV2-ltov(V1[0]),ltov(V1[2])-PV2);
                   1385:                }else
                   1386:                        return dvangle(PV2-V1[0],V1[2]-PV2);
                   1387:        }
                   1388:        if((L1=dnorm(V1))==0 || (L2=dnorm(V2))==0) return 1;
                   1389:        return dvprod(V1,V2)/(L1*L2);
                   1390: }
                   1391:
                   1392: def mulseries(V1,V2)
                   1393: {
                   1394:        L = length(V1);
                   1395:        if(size(V2) < L)
                   1396:                L = size(V2);
                   1397:        VV = newvect(L);
                   1398:        for(J = 0; J < L; J++){
                   1399:                for(K = R = 0; K <= J; K++)
                   1400:                        R = radd(R,rmul(V1[K],V2[J-K]));
                   1401:                VV[J] = R;
                   1402:        }
                   1403:        return VV;
                   1404: }
                   1405:
1.13      takayama 1406: def scale(L)
                   1407: {
1.23      takayama 1408:        T=F=0;LS=1;
1.18      takayama 1409:        Pr=getopt(prec);
1.23      takayama 1410:        Inv=getopt(inv);
                   1411:        Log10=dlog(10);
                   1412:        if(type(L)==7){
                   1413:                V=findin(L,["CI","DI","CIF","CIF'","DIF","DIF'","SI","TI1","TI2","STI"]);
                   1414:                if(V>=0){
                   1415:                        L=["C","D","CF","CF'","DF","DF'","S","T1","T2","ST"];
                   1416:                        Inv=1;L=L[V];
                   1417:                }
                   1418:                V=findin(L,["C","A","K","CF","CF'","S","T1","T2","ST","LL0","LL1","LL2","LL3","LL00",
                   1419:                        "LL01","LL02","LL03"])+1;
                   1420:                if(V==0) V=findin(L,["D","B","K","DF","DF'"])+1;
                   1421:                if(V>0) L=V;
                   1422:        }
                   1423:        if(type(OL=L)!=4){
1.15      takayama 1424:                if(L==2){
1.23      takayama 1425:                        L=(Pr==0)?
1.18      takayama 1426:                          [[[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 1427:                   [[1,2,1/10],[2,5,1/2], [10,20,1],[20,50,5]],
1.18      takayama 1428:                   [[1,2,1/2],[2,10,1], [10,20,5],[20,100,10]]]:
                   1429:                           [[[1,2,1/50],[2,5,1/20],[5,10,1/10], [10,20,1/5],[20,50,1/2],[50,100,1]],
                   1430:                                [[1,5,1/10],[5,10,1/2], [10,20,1],[50,100,5]],
                   1431:                                [[1,5,1/2],[5,10,1], [10,50,5],[50,100,10]]];
1.23      takayama 1432:                        LS=2;M2=[[1,10,1],[10,100,10]];
1.15      takayama 1433:                }else if(L==3){
1.23      takayama 1434:                        L=(Pr==0)?
1.18      takayama 1435:                          [[[1,2,1/20],[2,5,1/10],[5,10,1/5], [10,20,1/2],[20,50,1],[50,100,2],
                   1436:                   [100,200,5],[200,500,10],[500,1000,20]],
1.15      takayama 1437:                        [[1,2,1/10],[2,5,1/2], [10,20,1],[20,50,5], [100,200,10],[200,500,50]],
1.18      takayama 1438:                        [[1,2,1/2],[2,10,1], [10,20,5],[20,100,10], [100,200,50],[200,1000,100]]]:
                   1439:                          [[[1,2,1/50],[2,5,1/20],[5,10,1/10],[10,20,1/5],[20,50,1/2],[50,100,1],
                   1440:                              [100,200,2],[200,500,5],[500,1000,10]],
                   1441:                                [[1,5,1/10],[5,10,1/2], [10,50,1],[50,100,5], [100,500,10],[500,1000,50]],
1.23      takayama 1442:                                [[1,5,1/2],[5,10,1],[10,50,5],[50,100,10], [100,500,50],[500,1000,100]]];
                   1443:                        LS=3;M2=[[1,5,1],[10,50,10],[100,500,100],[500,1000,500]];
                   1444:                }else if(L>9&&L<18){
1.26      takayama 1445:                        if(L<18){       /* LL0 - LL3, LL00 - LL03 */
1.23      takayama 1446:                                if(L==10){
                   1447:                                        L=[ [[1.001,1.002,0.00001],[1.002,1.005,0.00002],[1.005,1.0105,0.00005]],
                   1448:                                                [[1.001,1.002,0.00005],[1.002,1.005,0.0001], [1.005,1.0105,0.0001]],
                   1449:                                                [[1.001,1.002,0.0001],[1.002,1.005,0.0005], [1.005,1.0105,0.0005]]];
                   1450:                                        M2=[1.001,1.0015,1.002,1.003,1.004,1.005,1.006,1.007,1.008,1.009,1.01];
                   1451:                                }
                   1452:                                if(L==11){
                   1453:                                        L=[ [[1.01,1.02,0.0001],[1.02,1.05,0.0002],[1.05,1.105,0.0005]],
                   1454:                                                [[1.01,1.02,0.0005],[1.02,1.05,0.001], [1.05,1.105,0.001]],
                   1455:                                                [[1.01,1.02,0.001],[1.02,1.05,0.005], [1.05,1.105,0.005]]];
                   1456:                                        M2=[1.01,1.015,1.02,1.03,1.04,1.05,1.06,1.07,1.08,1.09,1.10];
                   1457:                                }else if(L==12){
                   1458:                                        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],
                   1459:                                              [2.5,2.72,0.02]],
                   1460:                                                [[1.105,1.2,0.005],[1.2,1.4,0.01],[1.4,1.8,0.01],[1.8,2.5,0.05],
                   1461:                                              [2.5,2.72,0.1]],
                   1462:                                                [[1.105,1.2,0.01],[1.2,1.4,0.05],[1.4,1.8,0.05],[1.8,2.5,0.1],
                   1463:                                              [2.5,2.72,0.1]]];
1.26      takayama 1464:                                        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 1465:                                }else if(L==13){
                   1466:                                        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],
                   1467:                                                 [50,100,2],[100,200,5],[200,400,10],[400,500,20],[500,1000,50],
                   1468:                                                 [1000,2000,100],[2000,5000,200],[5000,10000,500],[10000,22000,1000]],
                   1469:                                                [[2.7,4,0.1],[4,6,0.1],[6,10,0.5],[10,15,1],[15,30,1],[30,50,5],
                   1470:                                                 [50,100,10],[100,200,10],[200,400,50],[400,500,100],[500,1000,100],
                   1471:                                                 [1000,2000,500],[2000,5000,1000],[5000,10000,1000],[10000,22000,5000]],
                   1472:                                                [[3,4,0.5],[4,6,0.5],[6,10,1],[10,15,5],[15,30,5],[30,50,10],
                   1473:                                                 [50,100,50],[100,200,50],[200,400,100],[400,500,100],[500,1000,500],
                   1474:                                                 [1000,2000,1000],[2000,5000,3000],[5000,10000,5000],[10000,22000,10000]]];
                   1475:                                        M2=[3,4,5,6,7,8,9,10,15,20,30,40,50,100,200,500,1000,2000,5000,10000,20000];
                   1476:                                }else if(L==14){
1.26      takayama 1477:                                        L=[ [[0.998,0.999,0.00001],[0.995,0.998,0.00002],[0.99,0.995,0.00005]],
                   1478:                                                [[0.998,0.999,0.00005],[0.995,0.998,0.0001],[0.99,0.995,0.0001]],
                   1479:                                                [[0.998,0.999,0.0001],[0.995,0.998,0.0005],[0.99,0.995,0.0005]]];
1.23      takayama 1480:                                        M2=[0.999,0.9985,0.998,0.997,0.996,0.995,0.994,0.993,0.992,0.991,0.99];
                   1481:                                }else if(L==15){
1.26      takayama 1482:                                        L=[ [[0.98,0.9901,0.0001],[0.95,0.98,0.0002],[0.905,0.95,0.0005]],
                   1483:                                                [[0.98,0.99,0.0005],[0.95,0.98,0.001], [0.905,0.95,0.001]],
1.23      takayama 1484:                                                [[0.98,0.99,0.001],[0.95,0.98,0.005], [0.91,0.95,0.005]]];
                   1485:                                        M2=[0.99,0.985,0.98,0.97,0.96,0.95,0.94,0.93,0.92,0.91];
                   1486:                                }else if(L==16){
1.26      takayama 1487:                                        L=[ [[0.8,0.906,0.001],[0.6,0.8,0.002],[0.37,0.6,0.005]],
                   1488:                                                [[0.8,0.906,0.005],[0.6,0.8,0.01],[0.37,0.6,0.01]],
                   1489:                                                [[0.8,0.9,0.01],[0.6,0.8,0.05],[0.4,0.6,0.05]]];
                   1490:                                        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 1491:                                }else{
1.26      takayama 1492:                                        L=[ [[0.05,0.37,0.002],[0.02,0.05,0.001],[0.01,0.02,0.0005],
                   1493:                                                 [0.005,0.01,0.0002],[0.001,0.005,0.0001],
                   1494:                                                 [0.0005,0.001,0.00002],[0.0001,0.0005,0.00001],[0.00005,0.0001,0.000002]],
                   1495:                                                [[0.05,0.37,0.01],[0.02,0.05,0.002],[0.01,0.02,0.001],
                   1496:                                                 [0.005,0.01,0.001],[0.001,0.005,0.0002],
                   1497:                                                 [0.0005,0.001,0.0001],[0.0001,0.0005,0.00002],[0.00005,0.0001,0.00001]],
                   1498:                                                [[0.05,0.37,0.05],[0.02,0.05,0.01],[0.01,0.02,0.005],
                   1499:                                                 [0.005,0.01,0.005],[0.002,0.005,0.001],
                   1500:                                                 [0.0005,0.001,0.0005],[0.0001,0.0005,0.0001],[0.00005,0.0001,0.00005]]];
                   1501:                                        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 1502:                                }
                   1503:                        }
1.15      takayama 1504:                }else{
1.23      takayama 1505:                        if(L==6){       /* S */
                   1506:                                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]],
                   1507:                                        [[6-1/6,15,1/6],[15,30,1/2],[30,70,1],[70,80,5],[80,90,10]],
                   1508:                                        [[6,15,1/2],[15,30,1],[30,70,5],[70,90,10]] ];
                   1509:                                M2=[6,7,8,9,10,15,20,30,40,50,60,70,90];
                   1510:                        }else if(L==7){ /* T1 */
                   1511:                                F=log(tan(x*3.1416/180))/Log10+1;
                   1512:                                L=[ [[6-1/3,15,1/12],[15,45,1/6]],
                   1513:                                        [[6-1/3,15,1/6],[15,45,1/2]],
                   1514:                                        [[6,45,1]] ];
                   1515:                                M2=[6,7,8,9,10,15,20,30,40,45];
                   1516:                        }else if(L==8){ /* T2 */
                   1517:                                L=[ [[45,75,1/6],[75,84+1/6,1/12]],
                   1518:                                        [[45,75,1],[75,84+1/6,1/6]],
                   1519:                                        [[45,84,1]] ];
                   1520:                                M2=[45,50,60,70,75,80,81,82,83,84];
                   1521:                        }else if(L==9){ /* ST */
                   1522:                                L=[ [[35/60,1,1/120],[1,2,1/60],[2,5+9/12,1/30]],
                   1523:                                        [[35/60,1,1/60],[1,2,1/6],[2,5+9/12,1/6]],
                   1524:                                        [[40/60,1,1/6],[1,2,1/2],[2,5+9/12,1]] ];
                   1525:                                M2=[1,2,3,4,5];
                   1526:                        }else{
                   1527:                                M2=(L==4||L==5)?[[1,2,1/2],[2,9,1]]:[[1,2,1/2],[2,10,1]];
                   1528:                                L=(Pr==0)?
                   1529:                                [ [[1,2,1/50],[2,5,1/20],[5,10,1/10]],
                   1530:                                  [[1,5,1/10],[5,10,1/2]],
                   1531:                                  [[1,5,1/2],[5,10,1]] ]:
                   1532:                                [[[1,2,1/100],[2,5,1/50],[5,10,1/20]],
                   1533:                              [[1,2,1/20],[2,10,1/10]],
                   1534:                              [[1,2,1/10],[2,10,1/2]] ];
                   1535:                        }
1.15      takayama 1536:                }
                   1537:        }else if(type(L[0])!=4){
                   1538:                L=[L];
                   1539:                if(length(L)!=3||L[0]+L[2]>L[1]) T=L;
1.13      takayama 1540:        }
1.15      takayama 1541:        if(T==0){
                   1542:                if(type(L[0][0])!=4) L=[L];
                   1543:                for(R=[];L!=[];L=cdr(L)){
                   1544:                        for(RR=[],LT=car(L);LT!=[];LT=cdr(LT))
                   1545:                                for(I=car(LT)[0];I<=car(LT)[1];I+=car(LT)[2]) RR=cons(I,RR);
                   1546:                RR=lsort(RR,[],1);
                   1547:                        R=cons(RR,R);
                   1548:                }
                   1549:                R=reverse(R);
                   1550:                for(T=[];R!=[];R=cdr(R)){
                   1551:                        if(length(R)>1) T=cons(lsort(R[0],R[1],"setminus"),T);
                   1552:                        else T=cons(R[0],T);
                   1553:                }
1.13      takayama 1554:        }
                   1555:        V0=dlog(10);
                   1556:        S0=S1=1;D0=D1=0;
                   1557:        SC=getopt(scale);
                   1558:        if(type(SC)==4){
                   1559:                S0=SC[0];S1=SC[1];
1.18      takayama 1560:        }else if(type(SC)==1){
                   1561:                S0=SC;S1=0;
1.13      takayama 1562:        }else return T;
                   1563:        if(type(D=getopt(shift))==4){
                   1564:                D0=D[0];D1=D[1];
1.31      takayama 1565:        }else if(type(D)<2&&type(D)>=0){
1.23      takayama 1566:                D0=0;D1=D;
1.31      takayama 1567:        };
1.23      takayama 1568:        if(Inv==1){
                   1569:                D0+=S0;S0=-S0;
1.13      takayama 1570:        }
1.23      takayama 1571:        if(type(TF=getopt(f))>1) F=TF;
                   1572:        if(F) F=f2df(F);
                   1573:        if(type(I=getopt(ol))==1&&OL>3) OL=I;
1.18      takayama 1574:        for(M=M0=[],I=length(T);T!=[];T=cdr(T),I--){
1.13      takayama 1575:                for(S=car(T);S!=[];S=cdr(S)){
1.23      takayama 1576:                        VS=car(S);
                   1577:                        if(F) V=myfdeval(F,car(S));
                   1578:                        else if(OL==4) V=frac(dlog(VS)/Log10+0.5);
                   1579:                        else if(OL==5) V=frac(dlog(VS*3.1416)/Log10);
                   1580:                        else if(OL>5&&OL<10){
                   1581:                                VS=VS*3.1416/180;
                   1582:                                if(OL==6) V=dlog(dsin(VS))/Log10+1;
                   1583:                                else if(OL==9) V=dlog(VS)/Log10+2;
                   1584:                                else V=dlog(dtan(VS))/Log10+8-OL;
                   1585:                        }
                   1586:                        else if(OL>9&&OL<14) V=dlog(dlog(VS))/Log10+13-OL;
                   1587:                        else if(OL>13&&OL<18) V=dlog(-dlog(VS))/Log10+17-OL;
                   1588:                        else V=dlog(VS)/Log10/LS;
                   1589:                        V*=S0;
1.13      takayama 1590:                        if(S1!=0){
                   1591:                                M=cons([V+D0,D1],M);
1.23      takayama 1592:                                M=cons([V+D0,((length(SC)>2)?SC[I]:(I*S1))+D1],M);
1.13      takayama 1593:                                M=cons(0,M);
1.18      takayama 1594:                        }else M0=cons(V+D0,M0);
1.13      takayama 1595:                }
1.18      takayama 1596:                if(S1==0) M=cons(reverse(M0),M);
1.13      takayama 1597:        }
                   1598:        if(S1!=0) M=cdr(M);
1.18      takayama 1599:        if(S1==0||getopt(TeX)!=1) return M;
1.13      takayama 1600:        M=reverse(M);
1.23      takayama 1601:        if(type(U=getopt(line))==4){
                   1602:                if(Inv==1) U=[U[0]+S0,U[1]+S0];
1.18      takayama 1603:                M=cons([U[0]+D0,D1],cons([U[1]+D0,D1],cons(0,M)));
1.23      takayama 1604:        }
                   1605:        if((VT=getopt(vert))==1){
                   1606:                for(N=[];M!=[];M=cdr(M)){
                   1607:                        if(type(TM=car(M))==4) N=cons([TM[1],TM[0]],N);
                   1608:                        else N=cons(TM,N);
                   1609:                }
                   1610:                M=reverse(N);
                   1611:        }
1.18      takayama 1612:        if(type(Col=getopt(col))<1) S=xylines(M);
                   1613:        else S=xylines(M|opt=Col);
                   1614:        if(type(Mes=getopt(mes))==4){
1.23      takayama 1615:                if(length(Mes)==1&&type(M2)==4) Mes=cons(car(Mes),M2);
1.18      takayama 1616:                S3=car(Mes);
                   1617:                if(type(S3)==4){
                   1618:                        Col=S3[1];
                   1619:                        S3=car(S3);
                   1620:                }else Col=0;
                   1621:                V=car(scale(cdr(Mes)));
1.23      takayama 1622:                if(!F) Mes=scale(cdr(Mes)|scale=[S0/LS,0],shift=[D0,D1],ol=OL);
1.18      takayama 1623:                else Mes=scale(cdr(Mes)|f=F,scale=[S0,0],shift=[D0,D1]);
                   1624:                for(M=car(Mes);M!=[];M=cdr(M),V=cdr(V)){
1.23      takayama 1625:                        TV=deval(car(V));
                   1626:                        if(Col!=0) TV=[Col,TV];
                   1627:                        S+=(VT==1)?xyput([S3+D1,car(M),TV]):xyput([car(M),S3+D1,TV]);
                   1628:                }
                   1629:        }
                   1630:        if(type(Mes=getopt(mes2))==4){
                   1631:                if(type(car(Mes))!=4) Mes=[Mes];
                   1632:                for(;Mes!=[];Mes=cdr(Mes)){
                   1633:                        TM=car(Mes);
                   1634:                        if(!F) V=scale([car(TM)]|scale=[S0/LS,0],shift=[D0,D1],ol=OL);
                   1635:                        else V=scale([car(TM)]|f=F,scale=[S0,0],shift=[D0,D1]);
                   1636:                        V=car(car(V));
                   1637:                        TM=cdr(TM);
                   1638:                        if(type(Col=car(TM))==4){
                   1639:                                C0=Col[0];C1=Col[1];
                   1640:                                if(length(Col)==3){
                   1641:                                        S+=(VT==1)?xyline([D1+C0,V],[D1+C1,V]|opt=Col[2])
                   1642:                                                :xyline([V,D1+C0],[V,D1+C1]|opt=Col[2]);
                   1643:                                }else S+=(VT==1)?xyline([D1+C0,V],[D1+C1,V]):xyline([V,D1+C0],[V,D1+C1]);
                   1644:                        }
                   1645:                        if(type(TM[1]<2)){
                   1646:                                TM=cdr(TM);
                   1647:                                S3=car(TM);
                   1648:                        }
                   1649:                        S+=(VT==1)?xyput([S3+D1,V,TM[1]]):xyput([V,S3+D1,TM[1]]);
1.13      takayama 1650:                }
                   1651:        }
1.18      takayama 1652:        return S;
1.13      takayama 1653: }
                   1654:
1.6       takayama 1655: def pluspower(P,V,N,M)
                   1656: {
                   1657:        RR = 1;
                   1658:        for(K = R = 1; K < M-1; I++){
                   1659:                R = R*(N-K+1)*P/K;
                   1660:                RR = radd(RR,R);
                   1661:        }
                   1662:        VV = newvect(M);
                   1663:        for(K = 0; K < M-1; K++)
                   1664:                VV[K] = red(mycoef(RR,K,V));
                   1665: }
                   1666:
                   1667: def vtozv(V)
                   1668: {
                   1669:        if(type(V)<4) V=newvect(1,[V]);
                   1670:        S = length(V);
                   1671:        VV = newvect(S);
                   1672:        Lcm = 1;
                   1673:        for(K = 0; K < S; K++){
                   1674:                VV[K] = red(V[K]);
                   1675:                Lcm = lcm(Lcm,dn(VV[K]));
                   1676:                C = ptozp(nm(VV[K])|factor=0);
                   1677:                if(K == 0){
                   1678:                        Dn  = dn(C[1]);
                   1679:                        Nm  = nm(C[1]);
                   1680:                        PNm = nm(C[0]);
                   1681:                }else{
                   1682:                        Dn  = ilcm(Dn,dn(C[1]));
                   1683:                        Nm  = igcd(Nm,nm(C[1]));
                   1684:                        PNm = gcd(PNm,nm(C[0]));
                   1685:                }
                   1686:        }
                   1687:        if(!(M=Nm*PNm)) return [VV,0];
                   1688:        Mul = (Lcm*Dn)/M;
                   1689:        for(K = 0; K < S; K++)
                   1690:                VV[K] = rmul(VV[K],Mul);
                   1691:        return [VV,Mul];
                   1692: }
                   1693:
                   1694: def dupmat(M)
                   1695: {
                   1696:        if(type(M) == 6){
                   1697:                Size = size(M);
                   1698:                MM = newmat(Size[0],Size[1]);
                   1699:                for(I = 0; I < Size[0]; I++){
                   1700:                        for(J = 0; J < Size[1]; J++)
                   1701:                                MM[I][J] = M[I][J];
                   1702:                }
                   1703:                return MM;
                   1704:        }
                   1705:        if(type(M) == 5)
                   1706:                return ltov(vtol(M));
                   1707:        return M;
                   1708: }
                   1709:
                   1710: def matrtop(M)
                   1711: {
                   1712:        S = size(M);
                   1713:        MM = dupmat(M);
                   1714:        Lcm = newvect(S[0]);
                   1715:        for(J = 0; J < S[0]; J++){
                   1716:                U = vtozv(M[J]);
                   1717:                for(K = -1, I = 0; I < S[1]; I++)
                   1718:                        MM[J][I] = U[0][I];
                   1719:                Lcm[J] = U[1];
                   1720:        }
                   1721:        return [MM,Lcm];
                   1722: }
                   1723:
                   1724: def mytrace(M)
                   1725: {
                   1726:        S=size(M);
                   1727:        if(S[0]!=S[1]) return 0;
                   1728:        for(I=V=0; I<S[0]; I++){
                   1729:                V+=M[I][I];
                   1730:        }
                   1731:        return V;
                   1732: }
                   1733:
                   1734: def mydet(M)
                   1735: {
                   1736:        MM = matrtop(M);
                   1737:        if(type(MM[0]) == 6){
                   1738:                S = size(M);
                   1739:                for(Dn = 1, I = 0; I < S[0]; I++)
                   1740:                        Dn *= MM[1][I];
                   1741:                return (!Dn)?0:red(det(MM[0])/Dn);
                   1742:        }
                   1743: }
                   1744:
1.71      takayama 1745: def permanent(M)
                   1746: {
                   1747:        SS=size(M);
                   1748:        if((S=SS[0]) != SS[1] || S==0) return 0;
                   1749:        if((Red=getopt(red))!=1){
                   1750:                MM = matrtop(M);
                   1751:                for(Dn = 1, I = 0; I < S; I++)
                   1752:                        Dn *= MM[1][I];
                   1753:                return (!Dn)?0:red(permanent(MM[0]|red=1)/Dn);
                   1754:        }
                   1755:        if(S<3){
                   1756:                if(S==1) return M[0][0];
                   1757:                else return M[0][0]*M[1][1]+M[0][1]*M[1][0];
                   1758:        }
                   1759:        LL=m2ll(M);
                   1760:        for(V=I=0;I<S;I++){
                   1761:                if(!(K=M[I][0])) continue;
                   1762:                for(TL=[],SL=LL,J=0;J<S;J++,SL=cdr(SL))
                   1763:                        if(I!=J) TL=cons(cdr(car(SL)),TL);
                   1764:                if(K) V+=K*permanent(lv2m(TL));
                   1765:        }
                   1766:        return V;
                   1767: }
                   1768:
1.6       takayama 1769: def mperm(M,P,Q)
                   1770: {
                   1771:        if(type(M) == 6){
                   1772:                S = size(M);
                   1773:                if(type(P) <= 1)
                   1774:                        P=(P==1)?Q:trpos(0,0,S[0]);
                   1775:                if(type(P) > 3 && type(P[0]) >= 4)
                   1776:                        P = trpos(P[0][0],P[0][1],S[0]);
                   1777:                else if(type(P) == 4){
                   1778:                        if(length(P)==2 && type(P[1])==4){
                   1779:                                P0=P[0];P1=car(P[1]);P=newvect(P1);
                   1780:                                for(I=0;I<P1;I++) P[I]=P0+I;
                   1781:                        }else P = ltov(P);
                   1782:                }
                   1783:                if(type(Q) <= 1)
                   1784:                        Q=(Q==1)?P:trpos(0,0,S[1]);
                   1785:                if(type(Q) > 3 && type(Q[0]) >= 4)
                   1786:                        Q = trpos(Q[0][0],Q[0][1],S[1]);
                   1787:                if(type(Q) == 4){
                   1788:                        if(length(Q)==2 && type(Q[1])==4){
                   1789:                                P0=Q[0];P1=car(Q[1]);Q=newvect(P1);
                   1790:                                for(I=0;I<P1;I++) Q[I]=P0+I;
                   1791:                        }else Q = ltov(Q);
                   1792:                }
                   1793:                MM = newmat(S0=length(P),S1=length(Q));
                   1794:                for(I = 0; I < S0; I++){
                   1795:                        MMI = MM[I]; MPI = M[P[I]];
                   1796:                        for(J = 0; J < S1; J++)
                   1797:                                MMI[J] = MPI[Q[J]];
                   1798:                }
                   1799:                return MM;
                   1800:        }
                   1801:        if((type(M) == 5 || type(M) == 4) && type(P) >= 4){
                   1802:                if(length(P) == 1 && type(car(P)) == 4)
                   1803:                        P = trpos(car(P)[0],car(P)[1],length(M));
                   1804:                MM = newvect(S = length(P));
                   1805:                for(I = 0; I < S; I++)
                   1806:                        MM[I] = M[P[I]];
                   1807:                if(type(M) == 4)
                   1808:                        MM = vtol(MM);
                   1809:                return MM;
                   1810:        }
                   1811:        return M;
                   1812: }
                   1813:
                   1814: def mtranspose(M)
                   1815: {
                   1816:        if(type(M)==4){
                   1817:                MV=ltov(M);
                   1818:                II=length(MV);
                   1819:                for(I=L=0; I<II; I++){
                   1820:                        if(type(MV[I])!=4)      return M;
                   1821:                        MV[I]=ltov(MV[I]);
                   1822:                }
                   1823:                for(R=[],J=0; ;J++){
                   1824:                        for(T=[],I=F=0; I<II; I++){
                   1825:                                if(length(MV[I])>J){
                   1826:                                        F=1;
                   1827:                                        T=cons(MV[I][J],T);
                   1828:                                }
                   1829:                        }
                   1830:                        if(F==0)        return reverse(R);
                   1831:                        if(F==1)        R=cons(reverse(T),R);
                   1832:                }
                   1833:        }
                   1834:        if(type(M) != 6)
                   1835:                return M;
                   1836:        S = size(M);
                   1837:        MM = newmat(S[1],S[0]);
                   1838:        for(I = 0; I < S[0]; I++){
                   1839:                for(J = 0; J < S[1]; J++)
                   1840:                        MM[J][I] = M[I][J];
                   1841:        }
                   1842:        return MM;
                   1843: }
                   1844:
                   1845: def mtoupper(MM, F)
                   1846: {
                   1847:        TeXs=["\\ -=\\ ","\\ +=\\ "];
                   1848:        Lins=[" -= line"," += line"];
                   1849:        Assume=["If","Assume"];
                   1850:        if(type(St = getopt(step))!=1) St=0;
                   1851:        Opt = getopt(opt);
                   1852:        if(type(Opt)!=1) Opt=0;
1.43      takayama 1853:        if(type(Main=getopt(main))!=1) Main=0;
1.6       takayama 1854:        TeX=getopt(dviout);
                   1855:        if(type(Tab=getopt(tab))!=1 && Tab!=0) Tab=2;
                   1856:        Line="\\text{line}";
                   1857:        if(type(TeX)!=1 || !St) TeX=0;
                   1858:        Size = size(MM);
                   1859:        if(F==-1){
                   1860:                M = newmat(Size[0], Size[1]+1);
                   1861:                for(I = 0; I < Size[0]; I++){
                   1862:                        for(J = 0; J < Size[1]; J++)
                   1863:                                M[I][J] = MM[I][J];
                   1864:                        M[I][Size[1]] = zz^I;
                   1865:                }
                   1866:                Size = size(M);
                   1867:                F = 1;
                   1868:        }else if(F<0){
                   1869:                F=Size[0];
                   1870:                M = newbmat(1,2,[[MM,mgen(F,0,[1],0)]]);
                   1871:                Size=[Size[0],F+Size[1]];
                   1872:        }else
                   1873:                M = dupmat(MM);
                   1874:        if(St){
                   1875:                if(TeX) Lout=[[dupmat(M)]];
                   1876:                else mycat0([M,"\n\n"],0);
                   1877:        }
                   1878:        Top="";
                   1879:        if(Opt>3){
                   1880:                for(I=Opt; I>4; I--)
                   1881:                        Top+=(TeX)?"\\ ":" ";
                   1882:        }
                   1883:        PC=IF=1;
1.43      takayama 1884:        if(Opt>3){
                   1885:                for(P=[1],K=0;K<Size[1]-F;K++){
                   1886:                        for(J=0;J<Size[0];J++)
                   1887:                                if(type(dn(M[J][K]))==2) P=cons(dn(M[J][K]),P);
                   1888:                }
                   1889:                PC=llcm(P|poly=1);
                   1890:        }
1.6       takayama 1891:        for(K = JJ = 0; K < Size[1] - F; K++){
                   1892:                for(J = JJ; J < Size[0]; J++){
                   1893:                        if(M[J][K] != 0){               /* search simpler element */
                   1894:                                if(Opt>2 && (Mul=M[J][K])!=1){
                   1895:                                        for(FF=0,JT=J; JT<Size[0]; JT++){
                   1896:                                                if((Val=M[JT][K])==1){  /* 1 */
                   1897:                                                        Mul=1;J=JT; break;
                   1898:                                                }
                   1899:                                                if(Val==0 || type(Val)>type(Mul)) continue;
                   1900:                                                if(type(Val)<type(Mul) || (Val==-1 && Mul!=-1)){
                   1901:                                                        Mul=Val; J=JT;          /* smaller type */
                   1902:                                                }
                   1903:                                                else if(Opt>3){
                   1904:                                                        if(isint(Val)==1){      /* integer elememt */
                   1905:                                                                if(isint(Mul)!=1){
                   1906:                                                                        Mul=Val; J=JT;  /* integer */
                   1907:                                                                }
                   1908:                                                                if(FF<3||(FF==3&&Val>0)){
                   1909:                                                                        for(JK=K+1;;){
                   1910:                                                                                if(JK>=Size[1]-F){
                   1911:                                                                                        J=JT;
                   1912:                                                                                        FF=((Mul=Val)>0)?4:3;
                   1913:                                                                                        break;  /* divisible int => 4: pos_int 3: neg_int */
                   1914:                                                                                }
                   1915:                                                                                if(isint(M[JT][JK++]/Val)!=1) break;
                   1916:                                                                        }
                   1917:                                                                }
                   1918:                                                        }else if(!FF){
                   1919:                                                                for(JK=K+1; JK<Size[1]-F; JK++){
                   1920:                                                                        if(isint(M[JT][JK]/Val)!=1) break;
                   1921:                                                                        J=JT; FF=1;             /* divisible => 1: non integer */
                   1922:                                                                }
                   1923:                                                        }
                   1924:                                                }
                   1925:                                        }
                   1926:                                        if(FF==0 && Opt>3 && Mul!=1 && Mul!=-1){        /* FF > 0 => divisible */
                   1927:                                                for(FF=0,J0=J; J0<Size[0]-1 && FF!=9; J0++){
                   1928:                                                        VV0=M[J0][K];
                   1929:                                                        if(VV0==0 || isint(VV0)==0) continue;
                   1930:                                                        for(J1=J0+1;J1<Size[0] && FF!=9; J1++){
                   1931:                                                                VV1=M[J1][K];
                   1932:                                                                if(VV1==0 || isint(VV1)==0) continue;
                   1933:                                                                for(C=FT=0,V0=VV0,V1=VV1; C<2 && FF!=10; C++,V1=V0,V0=VV1){
                   1934:                                                                        for(CC=0,RC=ceil(V0/V1);CC<2;CC++,RC--){
                   1935:                                                                                if((CD=V0-RC*V1)==0 && (RC==1 || RC==-1)){
                   1936:                                                                                        FT=1; FF=10;            /* 10: vanish by +- */
                   1937:                                                                                }else if(CD==1){
                   1938:                                                                                        FV=(vars(M[J0])==[]&&vars(M[J1])==[])?1:0;
                   1939:                                                                                        if((RC==1 || RC==-1) && FF<8+FV){
                   1940:                                                                                                FT=1; FF=8+FV;  /* 8/9: 1 by +- */
                   1941:                                                                                        }else if(FF<6+VF){
                   1942:                                                                                                FT=1; FF=6+FV;  /* 6/7: 1 by times */
                   1943:                                                                                        }
                   1944:                                                                                }else if(CD==-1){
                   1945:                                                                                        FV=(vars(M[J0])==[]&&vars(M[J1])==[])?1:0;
                   1946:                                                                                        if((RC==1 || RC==-1) && FF<4+FV){
                   1947:                                                                                                FT=1; FF=4+FV;  /* 4/5: 1 by +- */
                   1948:                                                                                        }else if(FF<2+VF){
                   1949:                                                                                                FT=1; FF=2+FV;  /* 2/3: 1 by times */
                   1950:                                                                                        }
                   1951:                                                                                }
                   1952:                                                                                if(FT==1){
                   1953:                                                                                        FT=0; KRC=RC;
                   1954:                                                                                        if(C==0){
                   1955:                                                                                                KJ0=J0; KJ1=J1;
                   1956:                                                                                        }else{
                   1957:                                                                                                KJ0=J1; KJ1=J0;
                   1958:                                                                                        }
                   1959:                                                                                }
                   1960:                                                                        }
                   1961:                                                                }
                   1962:                                                        }
                   1963:                                                }
                   1964:                                                if(FF>0){
                   1965:                                                        for(I=K;I<Size[1];I++)
                   1966:                                                                M[KJ0][I]=radd(M[KJ0][I],rmul(M[KJ1][I],-KRC));
                   1967:                                                        if(KRC<0){
                   1968:                                                                KRC=-KRC;Sgn=1;
                   1969:                                                        }else
                   1970:                                                                Sgn=0;
1.43      takayama 1971:                                                        if(St&&!Main){
1.6       takayama 1972:                                                                if(TeX){
                   1973:                                                                        if(KRC==1)
                   1974:                                                                                Lout=cons([Top+"\\xrightarrow{", Line,KJ0+1,TeXs[Sgn],
                   1975:                                                                                        Line,KJ1+1,"}",dupmat(M)],Lout);
                   1976:                                                                        else
                   1977:                                                                                Lout=cons([Top+"\\xrightarrow{", Line,KJ0+1,TeXs[Sgn],
                   1978:                                                                                        Line,KJ1+1,"\\times\\left(",KRC,"\\right)}",
                   1979:                                                                                        dupmat(M)],Lout);
                   1980:
                   1981:                                                                }else{
                   1982:                                                                        if(KRC==1)
                   1983:                                                                                mycat([Top+"line",KJ0+1,Lins[Sgn],KJ1+1,"\n",M,"\n"]);                                                                          else
                   1984:                                                                                mycat([Top+"line",KJ0+1,Lins[Sgn],KJ1+1," * (",KRC,")\n",M,"\n"]);
                   1985:                                                                }
                   1986:                                                        }
                   1987:                                                        Mul=M[KJ0][K]; J=KJ0;
                   1988:                                                        if(FF==10){
                   1989:                                                                J--; continue;
                   1990:                                                        }
                   1991:                                                }
                   1992:                                        }
                   1993:                                }
                   1994:                        /* a parameter Var */
                   1995:                                Var=0;
1.43      takayama 1996: /* mycat(["start",J,K]); */
1.6       takayama 1997:                                if(St && Opt>4 && length(Var=vars(nm(M[J][K])))==1){
                   1998:                                        J0=J;Jv=mydeg(nm(M[J0][K]),car(Var));
                   1999:                                        for(I=JJ;I<Size[0]; I++){
                   2000:                                                if((MIK=M[I][K])==0) continue;
                   2001:                                                if((T=vars(MIK=nm(MIK)))==[]){  /* 1/poly */
                   2002:                                                        J=I;Var=[]; break;
                   2003:                                                }
                   2004:                                                if(length(T)>1) continue;
                   2005:                                                if(mydeg(MIK,T[0])<Jv){
1.39      takayama 2006:                                                        J0=I;Jv=mydeg(MIK,T[0]);Var=T;  /* search minimal degree */
1.6       takayama 2007:                                                }
                   2008:                                        }
                   2009:                                        if(length(Var)==1){
                   2010:                                                Var=car(Var);
                   2011:                                                Q=nm(M[J0][K]);
1.43      takayama 2012: /* mycat(["min",Q,M[J0][K],"J0=",J0,"J=",J,"JJ=",JJ,K,M]); */
                   2013: J=J0;
1.6       takayama 2014:                                                for(I=JJ; I<Size[0]; I++){
                   2015:                                                        if(I==J0 || mydeg(nm(M[I][K]),Var)<0) continue;
                   2016:                                                        T=rpdiv(nm(M[I][K]),Q,Var);
                   2017:                                                        if(T[0]!=0 && (vars(T)==[] || vars(T)==[Var])) break;   /* dec. deg */
                   2018:                                                }
                   2019:                                        }
                   2020:                                }
                   2021:                                if(type(Var)==2){ /* 1 variable */
                   2022:                                        if(I==Size[0]){
                   2023:                                                for(QF=0,Q0=1,QR=getroot(Q,Var|mult=1);QR!=[];QR=cdr(QR)){
1.43      takayama 2024: /* mycat(["root",Q,QR,PC]); */
1.6       takayama 2025:                                                        if(deg(T=QR[0][1],Var)>0){
                   2026:                                                                QF=1;Q0*=T; continue;
                   2027:                                                        }
                   2028:                                                        if(subst(PC,Var,T)==0) continue;
                   2029:                                                        Q0*=(Var-(T=QR[0][1]));
                   2030:                                                        if(type(T)<2){
                   2031:                                                                M0=subst(M,Var,T);
                   2032:                                                                if(TeX){
                   2033:                                                                        Lout=cons(["\\hspace{",Tab*(St-3)-1,"mm}\\text{If }",
                   2034:                                                                                Var,"=",T,","] ,Lout);
1.43      takayama 2035:                                                                        Lout=append(mtoupper(M0,F|step=St+1,opt=Opt,dviout=-2,tab=Tab,main=Main),Lout);
1.6       takayama 2036:                                                                }else{
                   2037:                                                                        mycat([str_times(" ",St-1)+"If",Var,"=",T,","]);
1.43      takayama 2038:                                                                        mtoupper(M0,F|step=St+1,opt=Opt,main=Main);
1.6       takayama 2039:                                                                }
                   2040:                                                        }
                   2041:                                                }
                   2042:                                                if(Q0!=1){
                   2043:                                                        if(TeX)
                   2044:                                                                Lout=cons(["\\hspace{",Tab*(St-3)-1,"mm}\\text{"+Assume[QF]+" }",
                   2045:                                                                        Q0/=fctr(Q0)[0][0],"\\ne0,"],Lout);
                   2046:                                                        else
                   2047:                                                                mycat([str_times(" ",St-1)+Assume[QF],Q0,"!=0,"]);
                   2048:                                                        PC*=Q0;
                   2049:                                                }
                   2050:                                                IF=0;St++;
                   2051:                                        }else{
                   2052:                                                KRC=-red((T[2]*dn(M[J0][K]))/(T[1]*dn(M[I][K])));
                   2053:                                                for(II=K;II<Size[1];II++)
                   2054:                                                        M[I][II]=radd(M[I][II],rmul(M[J0][II],KRC));
1.43      takayama 2055:                                                if(!Main){
                   2056:                                                        if(TeX)
                   2057:                                                                Lout=cons([Top+"\\xrightarrow{", Line,I+1,"\\ +=\\ ",Line,
                   2058:                                                                        J0+1,"\\times\\left(",KRC,"\\right)}",dupmat(M)],Lout);
                   2059:                                                        else
                   2060:                                                                mycat([Top+"line",I+1,"+=",Line,J0+1," * (",KRC,")\n",M,"\n"]);
                   2061:                                                }
1.6       takayama 2062:                                                J=JJ-1;
                   2063:                                                continue;
                   2064:                                        }
                   2065:                                }
                   2066:                                if(J != JJ){
                   2067:                                        for(I = K; I < Size[1]; I++){
                   2068:                                                Temp = M[JJ][I];
                   2069:                                                M[JJ][I] = M[J][I];
                   2070:                                                M[J][I] = (Opt>=2)?Temp:-Temp;
                   2071:                                        }
                   2072:                                        if(St){
                   2073:                                                if(TeX)
                   2074:                                                        Lout=cons([Top+"\\xrightarrow{",Line,JJ+1,"\\ \\leftrightarrow\\ ",
                   2075:                                                                Line,J+1,"}",dupmat(M)],Lout);
                   2076:                                                else
                   2077:                                                        mycat0([Top+"line",JJ+1," <-> line",J+1,"\n",M,"\n\n"],0);
                   2078:                                        }
                   2079:                                }
                   2080:                                /* Assume PC != 0 */
                   2081:                                if(Opt>1){
                   2082:                                        Mul = M[JJ][K];
                   2083:                                        if(Opt > 5 && St && IF && (Var=vars(MIK=nm(Mul)))!=[]){
                   2084:                                                TF=fctr(MIK);
                   2085:                                                for(FF=0,Q0=1,TP=cdr(TF);TP!=[];TP=cdr(TP)){
                   2086:                                                        if(type(dn(red(PC/(TP0=car(car(TP))))))<2) continue; /* divisible */
                   2087:                                                        Q0*=TP0;
                   2088:                                                        for(Var=vars(TP0);Var!=[];Var=cdr(Var)){
                   2089:                                                                if(mydeg(TP0,X=car(Var))==1 && type(dn(red(PC/mycoef(TP0,1,X))))<2){
                   2090:                                                                        /* TP0=A*X+B with non-vanishing A */
                   2091:                                                                        T=red(-mycoef(TP0,0,X)/mycoef(TP0,1,X));
                   2092:                                                                        M0=mysubst(M,[X,T]);
                   2093:                                                                        if(TeX){
                   2094:                                                                                Lout=cons(["\\hspace{",Tab*(St-3)-1,"mm}\\text{If }",
                   2095:                                                                                        X,"=",T,","] ,Lout);
1.43      takayama 2096:                                                                                Lout=append(mtoupper(M0,F|step=St+1,opt=Opt,dviout=-2,tab=Tab,main=Main),
1.6       takayama 2097:                                                                                        Lout);
                   2098:                                                                        }else{
                   2099:                                                                                mycat([str_times(" ",St-1)+"If",X,"=",T,","]);
1.43      takayama 2100:                                                                                mtoupper(M0,F|step=St+1,opt=Opt,main=Main);
1.6       takayama 2101:                                                                        }
                   2102:                                                                        break;
                   2103:                                                                }
                   2104:                                                        }
                   2105:                                                        if(Var==[] && Opt>6){
                   2106:                                                                for(Var=vars(TP0);Var!=[];Var=cdr(Var)){
                   2107:                                                                        if(mydeg(TP0,X=car(Var))==1){
                   2108:                                                                                /* TP0=A*X+B, A is a poly of X0 with rational funct */
                   2109:                                                                                T=nm(mycoef(TP0,1,X));
                   2110:                                                                                for(Var0=vars(T);Var0!=[]; Var0=cdr(Var0)){
                   2111:                                                                                        X0=car(Var0);
                   2112:                                                                                        if(type(dn(red(PC/type(mycoef(T,mydeg(T,X0),X0)))))>1) continue;
                   2113:                                                                                        TR=getroot(T,X0|mult=1);
                   2114:                                                                                        if(findin(X0,vars(TR))<0) break;
                   2115:                                                                                }
                   2116:                                                                                if(Var0==[]) continue;
                   2117:                                                                                for(;TR!=[0];TR=cdr(TR)){
                   2118:                                                                                        if(TR==[]){
                   2119:                                                                                                TR=[0,0];
                   2120:                                                                                                T0=-mycoef(TP0,0,X)/mycoef(TP0,1,X);
                   2121:                                                                                                X0=X;
                   2122:                                                                                        }else T0=car(TR)[1];
                   2123:                                                                                        M0=mysubst(M,[X0,T0]);
                   2124:                                                                                        if(TeX){
                   2125:                                                                                                Lout=cons(["\\hspace{",Tab*(St-3)-1,"mm}\\text{If }",
                   2126:                                                                                                        X0,"=",T0,","] ,Lout);
1.43      takayama 2127:                                                                                                Lout=append(mtoupper(M0,F|step=St+1,opt=Opt,dviout=-2,tab=Tab,main=Main),
1.6       takayama 2128:                                                                                                        Lout);
                   2129:                                                                                        }else{
                   2130:                                                                                                mycat([str_times(" ",St-1)+"If",X0,"=",T0,","]);
1.43      takayama 2131:                                                                                                mtoupper(M0,F|step=St+1,opt=Opt,main=Main);
1.6       takayama 2132:                                                                                        }
                   2133:                                                                                }
                   2134:
                   2135:                                                                        }
                   2136:                                                                        break;
                   2137:                                                                }
                   2138:                                                        }
                   2139:                                                        if(Var==[]){
                   2140:                                                                FF=1;
                   2141:                                                        }
                   2142:                                                }
                   2143:                                                if(Q0!=1){
                   2144:                                                        if(FF) FF=1;
                   2145:                                                        if(TeX) Lout=cons(["\\hspace{",Tab*(St-3)-1,"mm}\\text{"+Assume[FF]+" }",Q0/=fctr(Q0)[0][0],"\\ne0,"],
                   2146:                                                                Lout);
                   2147:                                                        else mycat([str_times(" ",St-1)+Assume[FF],Q0,"!=0,"]);
                   2148:                                                        PC*=Q0;St++;
                   2149:                                                }
                   2150:                                        }
                   2151:                                        IF=M[JJ][K]=1;
                   2152:                                        if(Mul!=1){
                   2153:                                                for(L=K+1; L<Size[1]; L++)
                   2154:                                                        M[JJ][L]=red(M[JJ][L]/Mul);
                   2155:                                                if(St){
                   2156:                                                        if(TeX)
                   2157:                                                                Lout=cons([Top+"\\xrightarrow{",Line,JJ+1,
                   2158:                                                                        "\\ \\times=\\ \\left(",red(1/Mul),"\\right)}",
                   2159:                                                                        dupmat(M)],Lout);
                   2160:                                                        else
                   2161:                                                                mycat0([Top+"line",JJ+1, " *= (",red(1/Mul), ")\n",M,"\n\n"],0);
                   2162:                                                }
                   2163:                                        }
                   2164:
                   2165:                                }
                   2166:                                for(J = (Opt>0)?0:(JJ+1); J < Size[0]; J++){
                   2167:                                        if(J == JJ)
                   2168:                                                continue;
                   2169:                                        Mul = -M[J][K];
                   2170:                                        if(Mul!=0){
                   2171:                                                if(Opt!=2)      Mul=rmul(Mul,1/M[JJ][K]);
                   2172:                                                for(I = K+1; I < Size[1]; I++)
                   2173:                                                        M[J][I] = radd(M[J][I],rmul(M[JJ][I],Mul));
                   2174:                                                M[J][K] = 0;
1.43      takayama 2175:                                                if(St&&!Main){
1.6       takayama 2176:                                                        if(Mul<0){
                   2177:                                                                Mul=-Mul;Sgn=0;
                   2178:                                                        }else   Sgn=1;
                   2179:                                                        if(TeX){
                   2180:                                                                if(Mul==1)
                   2181:                                                                        Lout=cons([Top+"\\xrightarrow{", Line,J+1,TeXs[Sgn],Line,JJ+1,
                   2182:                                                                                "}",dupmat(M)],Lout);
                   2183:                                                                else Lout=cons([Top+"\\xrightarrow{", Line,J+1,TeXs[Sgn],Line,JJ+1,
                   2184:                                                                                "\\times\\left(",Mul,"\\right)}",dupmat(M)],Lout);
                   2185:                                                        }else{
                   2186:                                                                if(Mul==1)
                   2187:                                                                        mycat0([Top+"line",J+1, Lins[Sgn],JJ+1,"\n",M,"\n\n"],0);
                   2188:                                                                else
                   2189:                                                                        mycat0([Top+"line",J+1, Lins[Sgn],JJ+1," * (",Mul,")\n",M,"\n\n"],0);
                   2190:                                                        }
                   2191:                                                }
                   2192:                                        }
                   2193:                                }
                   2194:                                JJ++;
                   2195:                        }
                   2196:                }
                   2197:        }
                   2198:        if(TeX){
                   2199:                if(TeX==-2) return Lout;
                   2200:                Lout=reverse(Lout);
                   2201:                Br="\\allowdisplaybreaks";
                   2202:                Cr="\\\\\n &";
                   2203:                if(getopt(pages)==1) Cr=Br+Cr;
                   2204:                if(type(S=getopt(cr))==7) Cr=S;
                   2205:                if(type(Lim=getopt(lim))==1){
                   2206:                        if(Lim>0){
                   2207:                                if(Lim<30) Lim=TeXLim;
                   2208:                                Lim*=2;
                   2209:                        }
                   2210:                }else Lim=0;
                   2211:                Out = ltotex(Lout|opt=["cr","spts0"],str=1,cr=Cr,lim=Lim);
                   2212:                if(TeX<0) return Out;
                   2213:                dviout(Out|eq=(str_str(Cr,Br)>=0)?6:5,keep=(TeX==1)?0:1);
                   2214:        }
                   2215:        return M;
                   2216: }
                   2217:
                   2218: def mydet2(M)
                   2219: {
                   2220:        S = size(M);
                   2221:        Det = 1;
                   2222:        MM = mtoupper(M,0);
                   2223:        for(I = 0; I < S[0]; I++)
                   2224:                Det = rmul(Det,MM[I][I]);
                   2225:        return Det;
                   2226: }
                   2227:
                   2228: def myrank(MM)
                   2229: {
                   2230:        S = size(MM);
                   2231:        M = dupmat(MM);
                   2232:        M = mtoupper(M,0);
                   2233:        C = 0;
                   2234:        for(I = K = 0; I < S[0]; I++){
                   2235:                for(J = K; J < S[1]; J++){
                   2236:                        if(M[I][J] != 0){
                   2237:                         C++; K++;
                   2238:                         break;
                   2239:                        }
                   2240:                }
                   2241:        }
                   2242:        return C;
                   2243: }
                   2244:
                   2245: def meigen(M)
                   2246: {
                   2247:        F = getopt(mult);
                   2248:        if(type(M)==4 || type(M)==5){
                   2249:                II=length(M);
                   2250:                for(R=[],I=II-1; I>=0; I--){
                   2251:                        if(F==1)
                   2252:                                R=cons(meigen(M[I]|mult=1),R);
                   2253:                        else
                   2254:                                R=cons(meigen(M[I]),R);
                   2255:                }
                   2256:                return R;
                   2257:        }
                   2258:        S = size(M)[0];
                   2259:        P = mydet2(mgen(S,0,[zz],0)-M);
                   2260:        return (F==1)?getroot(P,zz|mult=1):getroot(P,zz);
                   2261: }
                   2262:
                   2263: def transm(M)
                   2264: {
                   2265:        if(type(M)!=6) M=s2m(M);
                   2266:        if(type(M)!=6){
                   2267:                errno(0);
                   2268:                return 0;
                   2269:        }
                   2270:        L=[M];TeX="";
                   2271:        Line=["\\text{line}","\\text{col}"];
                   2272:        if((DVI=getopt(dviout)) !=1) DVI=0;
                   2273:        else dviout(M);
                   2274:        for(;;){
                   2275:                print(L0=dupmat(car(L)));
                   2276:                Sz=size(L0);
                   2277:                S=keyin("? ");
                   2278:                N=0;
                   2279:                if(str_len(S)<=1){
                   2280:                        if(S=="q") return L;
                   2281:                        if(S=="t"){
                   2282:                                N=mtranspose(L0);
                   2283:                                TeX=["\\text{transpose}"];
                   2284:                        }
                   2285:                        else if(S=="f"){
                   2286:                                if(length(L)>1){
                   2287:                                        if(LF!=0) TeX="";
                   2288:                                        L=cdr(L);LF=L0;
                   2289:                                        if(DVI){
                   2290:                                                dviout0(-1);
                   2291:                                                dviout(" ");
                   2292:                                        }
                   2293:                                }
                   2294:                        }else if(S=="g"){
                   2295:                                if(LF!=0) N=LF;
                   2296:                        }else if(S=="0"){
                   2297:                                N=M;L=[];TeX=[];
                   2298:                        }else if(S=="a"||S=="A"){
                   2299:                                if(DVI&&S=="A") mtoupper(L0,0|step=1,opt=10,dviout=1);
                   2300:                                else mtoupper(L0,0|step=1,opt=10);
                   2301:                        }else{
                   2302:                                mycat0([
                   2303:        "2,5    : line2 <-> line5",
                   2304:        "2,5,-2 ; line2 += (-2)*line5",
                   2305:        "2,2,-2 : line2 *= -2",
                   2306:        "2,5,0  : line2 += (?)*line5 for reduction",
                   2307:        "r,2,5  : raw2 <-> raw5 (r,2,5,-2  etc.)",
                   2308:        "s,x,2  : subst(*,x,2)",
                   2309:        "t      : transpose",
                   2310:        "0      : first matrix",
                   2311:        "f      : previous matrix",
                   2312:        "g      : next matrix (only after f)",
                   2313:        "A      : auto (a : without TeX)",
                   2314:        "q      : quit"
                   2315:                                ],1|delim="\n");
                   2316:                        }
                   2317:                }else{
                   2318:                        FR=0;
                   2319:                        S=evals(S|del=",");
                   2320:                        if(S[0]==r){
                   2321:                                FR=1; S=cdr(S);
                   2322:                        }
                   2323:                        if((LL=length(S))>=2){
                   2324:                                S0=S[0]-1;S1=S[1]-1;
                   2325:                                if(S[0]==s){
                   2326:                                        if(length(S)==3) N=subst(L0,S[1],S[2]);
                   2327:                                        if(DVI) TeX=[S[1],"\\mapsto",S[2]];
                   2328:                                }else if(FR==0){
                   2329:                                        if(S0<0 || S0>=Sz[0] || S1<0 || S1>=Sz[0]) continue;
                   2330:                                        if(LL==2){
                   2331:                                                N=rowx(L0,S0,S1);
                   2332:                                                if(DVI) TeX=[Line[0],S[0],"\\ \\leftrightarrow\\ ",Line[0],S[1]];
                   2333:                                        }else{
                   2334:                                                S2=S[2];
                   2335:                                                if(S0==S1){
                   2336:                                                        N=rowm(L0,S0,S2);
                   2337:                                                        if(DVI) TeX=[Line[0],S[0],"\\ \\times=\\ ",S2];
                   2338:                                                }else{
                   2339:                                                        if(S2==0){
                   2340:                                                                for(J=0;J<Sz[1] && L0[S1][J]==0;J++);
                   2341:                                                                if(J<Sz[1]) S2=-L0[S0][J]/L0[S1][J];
                   2342:                                                        }
                   2343:                                                        if(S2!=0){
                   2344:                                                                N=rowa(L0,S0,S1,S2);
                   2345:                                                                if(DVI) TeX=[Line[0],S[0],"\\ +=\\ ",Line[0],
                   2346:                                                                        S[1],"\\ \\times\\ (",S2,")"];
                   2347:                                                        }
                   2348:                                                }
                   2349:                                        }
                   2350:                                }else{
                   2351:                                        if(S0<0 || S0>=Sz[1] || S1<0 && S1>=Sz[1]) continue;
                   2352:                                        if(LL==2){
                   2353:                                                N=colx(L0,S0,S1);
                   2354:                                                if(DVI) TeX=[Line[1],S[0],"\\ \\leftrightarrow\\ ",Line[1],S[1]];
                   2355:                                        }else{
                   2356:                                                S2=S[2];
                   2357:                                                if(S0==S1){
                   2358:                                                        N=colm(L0,S0,S2);
                   2359:                                                        if(DVI) TeX=[Line[1],S[0],"\\ \\times=\\ ",S[2]];
                   2360:                                                }else{
                   2361:                                                        if(S2!=0){
                   2362:                                                                for(J=0; I1<Sz[0] && L0[I1][J]==0; J++);
                   2363:                                                                if(J<Sz[0]) S2=-L0[J][S0]/L0[J][S1];
                   2364:                                                        }if(S2!=0){
                   2365:                                                                N=cola(L0,S0,S1,S2);
                   2366:                                                                if(DVI) TeX=[Line[1],S[0],"\\ +=\\ ",Line[1],
                   2367:                                                                        S[1],"\\ \\times\\ (",S2,")"];
                   2368:                                                        }
                   2369:                                                }
                   2370:                                        }
                   2371:                                }
                   2372:                        }
                   2373:                }
                   2374:                if(N!=0){
                   2375:                        LF=0;L=cons(N,L);
                   2376:                        if(DVI) dviout("\\xrightarrow{"+ltotex(TeX|opt="spts0",str=1)+"}"+mtotex(N)|eq=8);
                   2377:                }
                   2378:        }
                   2379: }
                   2380:
                   2381: def vgen(V,W,S)
                   2382: {
                   2383:        IM=length(V);
                   2384:        I=(getopt(opt)==0)?IM:0;
                   2385:        for(SS=0; I<IM && (SS==0 || V[I]<=W[I]); I++)
                   2386:                SS += W[I];
                   2387:        if(I<IM){
                   2388:                W[I]++;
                   2389:                SS--;
                   2390:        }else
                   2391:                SS=S;
                   2392:        for(J=0;J<I;J++){
                   2393:                 W[J] = (SS<=V[J])?SS:V[J];
                   2394:                 SS -= W[J];
                   2395:        }
                   2396:        if(SS>0)
                   2397:                return -1;
                   2398:        return(I==IM)?0:I;
                   2399: }
                   2400:
                   2401: def mmc(M,X)
                   2402: {
                   2403:        Mt=getopt(mult);
1.50      takayama 2404:        if(type(M)==7) M=s2sp(M);
                   2405:        if(type(M)!=4) return 0;
                   2406:        if(type(M[0])<=3){
                   2407:                for(RR=[];M!=[];M=cdr(M)) RR=cons(mat([car(M)]),RR);
                   2408:                M=reverse(RR);
                   2409:        }
1.6       takayama 2410:        if(type(M[0])!=6){                      /* spectre type -> GRS */
                   2411:                G=s2sp(M|std=1);
                   2412:                L=length(G);
                   2413:                for(V=[],I=L-2;I>=0;I--) V=cons(makev([I+10]),V);
                   2414:                V=cons(makev([L+9]),V);
                   2415:                G=sp2grs(G,V,[1,length(G[0]),-1]|mat=1);
                   2416:                if(getopt(short)!=0){
                   2417:                        V=append(cdr(V),[V[0]]);
                   2418:                        G=shortv(G,V);
                   2419:                }
                   2420:                R=chkspt(G|mat=1);
                   2421:                if(Mt!=1) Mt=0;
                   2422:                if(R[2]!=2 || R[3]!=0 || !(R=getbygrs(G,1|mat=1))) return 0;
                   2423:                MZ=newmat(1,1);
                   2424:                SS=length(G);
                   2425:                if(Mt==1) SS=SS*(SS-1)/2;
                   2426:                for(M=[],I=0;I<SS;I++) M=cons(MZ,M);
                   2427:                for(RR=R; RR!=[]; RR=cdr(RR)){
                   2428:                        RT=car(RR)[0];
                   2429:                        if(type(RT)==4){
                   2430:                                if(RT[0]!=0) M=mmc(M,[RT[0]]|simplify=Simp);
                   2431:                                M=mmc(M,[cdr(RT)]);
                   2432:                        }
                   2433:                }
                   2434: /*             for(R=cdr(R);R!=[];R=cdr(R)) M=mmc(M,[car(R)[0]]|mult=Mt); */
                   2435:        }
                   2436:        if(X==0) return M;
                   2437:        L=length(M);
                   2438:        if((L>=6 && Mt!=0)||(L==3&&Mt==1)){
                   2439:                for(SS=2,I=3; I<L; I+=(++SS));
                   2440:                if(I!=L) return -1;
                   2441:                Mt=1;
                   2442:        }else{
                   2443:                SS=L;Mt=0;
                   2444:        }
                   2445:        if(length(X)==SS+1){
                   2446:                if(car(X)!=0&&(M=mmc(M,[car(X)]|mult=Mt))==0) return M;
                   2447:                return mmc(M,cdr(X)|mult=Mt);
                   2448:        }
                   2449:        for(I=X;I!=[];I=cdr(I)) if(I[0]!=0) break;
                   2450:        if(I==[]) return M;
                   2451:        Simp=getopt(simplify);
                   2452:        if(Simp!=0 && type(Simp)!=1) Simp=2;
                   2453:        N=newvect(L);
                   2454:        for(I=0;I<L;I++) N[I]=dupmat(M[I]);
                   2455:        S=size(N[0])[0];
                   2456:        if(type(X)==4&&length(X)>SS){   /* addition */
                   2457:                for(I=0;I<SS;I++,X=cdr(X)) if(X[I] != 0) N[I] = radd(N[I],car(X));
                   2458:        }
                   2459:        if(length(X)!=1) return 0;
                   2460:        X=X[0];
                   2461:        MZ = newmat(S,S);
                   2462:        MM = newvect(L);
                   2463:        for(M1=J=0; J<SS; J++){
                   2464:                for(R=[],I=SS-1; I>=0; I--){
                   2465:                        if(I==J){
                   2466:                                for(RR=[],K=SS-1; K>=0; K--)
                   2467:                                        RR=cons((K==I)?N[K]+diagm(S,[X]):N[K],RR);
                   2468:                                R=cons(RR,R);
                   2469:                        }else R=cons([MZ],R);
                   2470:                }
                   2471:                MM[J]=newbmat(SS,SS,R);
                   2472:                if(J==0) M1=MM[0];
                   2473:                else M1=radd(M1,MM[J]);
                   2474:        }
                   2475:        /* middle convolution */
                   2476:        for(P=0,Q=1;J<L;J++){   /* A_{P,Q} */
                   2477:                for(R=[],I=SS-1; I>=0; I--){
                   2478:                        for(RR=[],K=SS-1;K>=0;K--){
                   2479:                                MT=MZ;
                   2480:                                if(I==K){
                   2481:                                        MT=N[J];
                   2482:                                        if(I==P) MT-=N[Q];
                   2483:                                        else if(I==Q) MT-=N[P];
                   2484:                                }else if(I==P && K==Q) MT=N[Q];
                   2485:                                 else if(I==Q && K==P) MT=N[P];
                   2486:                                RR=cons(MT,RR);
                   2487:                        }
                   2488:                        R=cons(RR,R);
                   2489:                }
                   2490:                MM[J]=newbmat(SS,SS,R);
                   2491:                if(++Q==SS){
                   2492:                        P++;Q=P+1;
                   2493:                }
                   2494:        }
                   2495:        for(R=[],I=SS-1; I>=0; I--){
                   2496:                for(RR=[N[I]],J=0; J<I; J++) RR=cons(MZ,RR);
                   2497:                R=cons(RR,R);
                   2498:        }
                   2499:        M0 = newbmat(SS,SS,R);
                   2500:        KE = append(mykernel(M0|opt=1),mykernel(M1|opt=1));
                   2501:        if(length(KE) == 0) return MM;
                   2502:        KK = mtoupper(lv2m(KE),0);
                   2503:        for(I=0;I<L;I++) MM[I] = mmod(MM[I],KK);
                   2504:        if(Simp!=0) MM = mdsimplify(MM|type=Simp);
                   2505:        return MM;
                   2506: }
                   2507:
                   2508: def lpgcd(L)
                   2509: {
                   2510:        for(F=[]; L!=[]; L=cdr(L)){
                   2511:                if((P=car(L))==0) continue;
                   2512:                        if(F==[]){
                   2513:                                F=fctr(P);
                   2514:                                S=length(F);
                   2515:                                S--;
                   2516:                                V=newvect(S);
                   2517:                                M=newvect(S);
                   2518:                                for(I=0; I<S; I++){
                   2519:                                        M[I] = F[I+1][1];
                   2520:                                        V[I] = F[I+1][0];
                   2521:                                }
                   2522:                                N=nm(ptozp(P|factor=1)[1]);
                   2523:                                continue;
                   2524:                 }
                   2525:                 N=igcd(ptozp(P|factor=1)[1],N);
                   2526:                 for(I=0; I<S; I++){
                   2527:                         for(Q=P,CT=0; CT<M[I]; CT++)
                   2528:                                 if((Q=tdiv(Q,V[I])) == 0) break;
                   2529:                         if(CT<M[I]) M[I]=CT;
                   2530:                 }
                   2531:        }
                   2532:        if(F==[]) return 0;
                   2533:        for(Q=N,I=0;I<S; I++){
                   2534:                while(M[I]>0){
                   2535:                        Q *= V[I];
                   2536:                        M[I]--;
                   2537:                }
                   2538:        }
                   2539:        return Q;
                   2540: }
                   2541:
                   2542: def mdivisor(M,X)
                   2543: {
                   2544:        S=size(M=dupmat(M));
                   2545:        XX=(type(X)==4||X==0)?X:[0,X];
                   2546:        S0=S[0]; S1=S[1];
                   2547:        if((Tr=getopt(trans))==1||Tr==2){
                   2548:                Tr0=1;
                   2549:                GR=mgen(S0,0,1,0); GC=mgen(S1,0,1,0);
                   2550:        }else Tr=Tr0=0;
                   2551:         /* 0,a,b       : (a,b)->(1,1)
                   2552:                1               : (1,1) invertible
                   2553:                2,i,M   : line 0,i by M
                   2554:                3,j,M   : col  0,j by M
                   2555:                4,j             : col  1 += col j
                   2556:                5,j,T   : line j by T
                   2557:                6,j,T   : col  1 += col j by T (non-com)
                   2558:                7,j             : line 2<->j  (non-com)
                   2559:         */
                   2560:        if(type(V=getopt(dviout))==1){
                   2561:                if(type(XX)==4 && type(XX[0])>1) Var=[XX[1],"\\partial"];
                   2562:                else    Var=0;
                   2563:                Tr=(abs(V)==3)?0:1;
                   2564:                MM=dupmat(M);
                   2565:                II=((S[0]>S[1])?S[1]:S[0])+1;
                   2566:                if(abs(V)>1){
                   2567:                        Is1=Js1=S[0]+S[1];
                   2568:                        Is=Js=[0,[Is1]];
                   2569:                }else{
                   2570:                        Is=[0,[Is1=S[0]]];Js=[0,[Js1=S[1]]];
                   2571:                }
                   2572:                VV=V;
                   2573:                V=newvect(II);
                   2574:                for(I=0;I<II;I++) V[I]=[];
                   2575:                N=newbmat(2,2,[[M,mgen(S[0],0,[1],0)],[mgen(S[1],0,[1],0)]]);
                   2576:                mdivisor(M,X|step=1,dviout=V);
                   2577:                L=S[0]+S[1];
                   2578:                if(Tr){
                   2579:                        NN=mperm(N,Is1,Js1);
                   2580:                        for(K=S[0];K<Is1;K++){
                   2581:                                for(L=S[1];L<Js1;L++)
                   2582:                                        NN[K][L]=" ";
                   2583:                        }
                   2584:                        Out=[[mperm(NN,Is,Js)]];
                   2585:                }
                   2586:                for(I=1;I<II;I++){
                   2587:                        I0=I-1;
                   2588:                        if(V[I]==[]) continue;
                   2589:                        for(T=reverse(V[I]);T!=[];T=cdr(T)){
                   2590:                                St=[];
                   2591:                                C=car(R=car(T));
                   2592:                                if(C==0){
                   2593:                                        N=mperm(N,(R[1]==0)?0:[[R[1]+I0,I0]],(R[2]==0)?0:[[R[2]+I0,I0]]);
                   2594:
                   2595:                                        if(Tr){
                   2596:                                                if(R[2]!=0) St=append(["C",I,"\\leftrightarrow C",R[2]+I],St);
                   2597:                                                if(R[1]!=0){
                   2598:                                                        if(R[2]!=0) St=cons(",\\ ",St);
                   2599:                                                        St=append(["L",I,"\\leftrightarrow L",R[1]+I],St);
                   2600:                                                }
                   2601:                                                Out=cons(St,Out);
                   2602:                                        }
                   2603:                                }else if(C==1){
                   2604:                                        P=1/N[I0][I0];N[I0][I0]=1;
                   2605:                                        if(P!=1){
                   2606:                                                for(J=I;J<L;J++)
                   2607:                                                        N[I0][J]=muldo(P,N[I0][J],XX);
                   2608:
                   2609:                                                if(Tr){
                   2610:                                                        St=append(["L",I,"\\leftarrow(",P,")","\\times L",I],St);
                   2611:                                                        Out=cons(St,Out);
                   2612:                                                        NN=mperm(N,Is1,Js1);
                   2613:                                                        for(K=S[0];K<Is1;K++){
                   2614:                                                                for(L=S[1];L<Js1;L++)
                   2615:                                                                        NN[K][L]=" ";
                   2616:                                                        }
                   2617:                                                        Out=cons(["\\to",mperm(NN,Is,Js)],Out);
                   2618:                                                }
                   2619:                                        }
                   2620:                                        for(F=0,J=I;J<S[0];J++){
                   2621:                                                if((P=N[J][I0])==0) continue;
                   2622:                                                F++;
                   2623:                                                N[J][I0]=0;
                   2624:                                                for(K=I;K<L;K++)
                   2625:                                                        N[J][K]=red(N[J][K]-muldo(P,N[I0][K],XX));
                   2626:
                   2627:                                        }
                   2628:                                        if(F){
                   2629:                                                if(Tr){
                   2630:                                                        Out=cons(["Li\\ -\\!=\\ \\circ\\times L",I,"\\quad(i>",I,")"],Out);
                   2631:                                                        NN=mperm(N,Is1,Js1);
                   2632:                                                        for(K=S[0];K<Is1;K++){
                   2633:                                                                for(L=S[1];L<Js1;L++)
                   2634:                                                                        NN[K][L]=" ";
                   2635:                                                        }
                   2636:                                                        Out=cons(["\\to",mperm(NN,Is,Js)],Out);
                   2637:                                                }
                   2638:                                        }
                   2639:                                        for(F=0,J=I;J<S[1];J++){
                   2640:                                                if((P=N[I0][J])==0) continue;
                   2641:                                                F++;
                   2642:                                                N[I0][J]=0;
                   2643:                                                for(K=I;K<L;K++)
                   2644:                                                        N[K][J]=red(N[K][J]-muldo(N[K][I0],P,XX));
                   2645:                                        }
                   2646:                                        if(F&&Tr) Out=cons(["Cj\\ -\\!=\\ C",I,"\\times\\circ\\quad(j>",I,")"],Out);
                   2647:                                        else continue;
                   2648:                                }else if(C==2){
                   2649:                                        C=mat(N[I0],N[R[1]+I0]);C=muldo(R[2],C,XX);
                   2650:                                        for(J=0;J<L;J++){
                   2651:                                                N[I0][J]=C[0][J];N[R[1]+I0][J]=C[1][J];
                   2652:                                        }
                   2653:                                        if(Tr) Out=cons([dupmat(R[2]),"\\begin{pmatrix}L",I,"\\\\L",R[1]+I,
                   2654:                                                "\\end{pmatrix}"],Out);
                   2655:                                }else if(C==3){
                   2656:                                        C=newmat(L,2);
                   2657:                                        for(J=0;J<L;J++){
                   2658:                                                C[J][0]=N[J][I0];C[J][1]=N[J][R[1]+I0];
                   2659:                                        }
                   2660:                                        C=muldo(C,R[2],XX);
                   2661:                                        for(J=0;J<L;J++){
                   2662:                                                N[J][I0]=C[J][0];N[J][R[1]+I0]=C[J][1];
                   2663:                                        }
                   2664:                                        if(Tr) Out=cons(["\\begin{pmatrix}C",I,"&C",R[1]+I,"\\end{pmatrix}",
                   2665:                                                dupmat(R[2])],Out);
                   2666:                                }else if(C==4){
                   2667:                                        for(J=0;J<L;J++)
                   2668:                                                N[J][I0]=red(N[J][I0]+N[J][R[1]+I0]);
                   2669:                                        if(Tr) Out=cons(["C",I,"\\ +\\!=\\ C",R[1]+I],Out);
                   2670:                                }else if(C==5){
                   2671:                                        for(J=0;J<L;J++)
                   2672:                                                N[I0+R[1]][J]=red(R[2]*N[I0+R[1]][J]);
                   2673:                                        if(Tr) Out=cons(["L",I+R[1],"\\leftarrow(", R[2],")\\times L",I+R[1]],
                   2674:                                                Out);
                   2675:                                }else if(C==6){
                   2676:                                        for(J=0;J<L;J++)
                   2677:                                                N[J][I0]=N[J][I0]+muldo(N[J][I0+R[1]],R[2],XX);
                   2678:                                        if(Tr) Out=cons(["C",I,"\\ +\\!=\\ C",I+R[1],"\\times(", R[2],")"],
                   2679:                                                Out);
                   2680:                                }else if(C==7){
                   2681:                                        mycat(["line",I+1,"\\leftrightarrow",R[1]+I]);
                   2682:                                        for(J=0;J<L;J++){
                   2683:                                                C=N[I][J];N[I][J]=N[R[1]+I0][J];N[R[1]+I0][J]=C;
                   2684:                                        }
                   2685:                                        if(Tr) Out=cons(["L",I+1,"\\leftrightarrow L",R[1]+I],Out);
                   2686:                                }
                   2687:                                if(Tr){
                   2688:                                        NN=mperm(N,Is,Js);
                   2689:                                        for(K=S[0];K<Is1;K++){
                   2690:                                                for(L=S[1];L<Js1;L++)
                   2691:                                                        NN[K][L]=" ";
                   2692:                                        }
                   2693:                                        Out=cons(["\\to",NN],Out);
                   2694:                                }
                   2695:                        }
                   2696:                }
                   2697:                if(!Tr){
                   2698:                        NN=mperm(N,Is,Js);
                   2699:                        Out=[];
                   2700:                }
                   2701:                if(S[0]+S[1]==Is1){
                   2702:                        N1=mperm(NN,[0,[S[0]]],[S[1],[S[0]]]);
                   2703:                        N2=mperm(NN,[S[0],[S[1]]],[0,[S[1]]]);
                   2704:                        N3=mperm(NN,[0,[S[0]]],[0,[S[1]]]);
                   2705:                        R1=mdivisor(N1,X|trans=1)[1];
                   2706:                        R2=mdivisor(N2,X|trans=1)[1];
                   2707:                        if(Tr){
                   2708:                                Out=cons(["\\text{As a result,}"],Out);
                   2709:                                Out=cons([N3,"=",N1,MM,N2],Out);
                   2710:                                if(S[0]==S[1] && N3==mgen(S[0],0,1,0)){
                   2711:                                        Out=cons(["=",muldo(N2,N1,XX),MM,"."],Out);
                   2712:                                }else{
                   2713:                                        Out=cons([N1,"^{-1}=",R1,","],Out);
                   2714:                                        Out=cons([N2,"^{-1}=",R2,"."],Out);
                   2715:                                }
                   2716:                        }else{
                   2717:                                Out=cons([N3,"=P",MM,"Q,"],Out);
                   2718:                                Out=cons(["P=",N1,"=",R1,"^{-1},"],Out);
                   2719:                                Out=cons(["Q=",N2,"=",R2,"^{-1}."],Out);
                   2720:                        }
                   2721:                }
                   2722:                Out = ltotex(reverse(Out)|opt=["cr","spts0"],str=1,cr=15,var=Var);
                   2723:                if(S[0]+S[1]==Is1)
                   2724:                        Out=str_subst(Out,"\\texttt{ }","");
                   2725:                if(VV>0){
                   2726:                        dviout(Out|eq=6);
                   2727:                        return NN;
                   2728:                }
                   2729:                return Out;
                   2730:        }else if(type(V)!=5) V=0;
                   2731:
                   2732:        if(type(St=getopt(step))!=1) St=0;
                   2733:        for(FF=": start";;){
                   2734:                if(St && V==0){
                   2735:                        if(Tr){
                   2736:                                mycat0([St,FF,"\n"],0);
                   2737:                                mycat([GR,"\n"]);mycat([M,"\n"]);mycat([GC,"\n"]);
                   2738:                        }
                   2739:                        else    mycat0([St,FF,"\n",M,"\n"],0);
                   2740:                }
                   2741:                if(X==0||X==[0,0]){ /* search minimal non-zero element */
                   2742:                        for(K=F=I=0; I<S0; I++){
                   2743:                                for(J=0; J<S1; J++){
                   2744:                                        if((P=abs(M[I][J]))!=0 && (K>P || K==0)){
                   2745:                                                K=P; R=[I,J];
                   2746:                                        }
                   2747:                                }
                   2748:                        }
                   2749:                        R=cons(K-1,[R]);
                   2750:                }
                   2751:                else R=mymindeg(M,XX[1]|opt=1);
                   2752:                if(R[0]<0){             /*zero matrix */
                   2753:                        if(Tr) return [[],mgen(S0,0,1,0),mgen(S1,0,1,0)];
                   2754:                        return [];
                   2755:                }
                   2756:                R0=R[1][0];R1=R[1][1];
                   2757:                if(R0!=0){
                   2758:                        M=rowx(M,0,R0);
                   2759:                        if(Tr) GR=rowx(GR,0,R0);
                   2760:                }
                   2761:                if(R1!=0){
                   2762:                        M=colx(M,0,R1);
                   2763:                        if(Tr) GC=colx(GC,0,R1);
                   2764:                }
                   2765:                if(St>0 && (R0!=0 || R1!=0))
                   2766:                        if(type(V)==5) V[St]=cons([0,R0,R1],V[St]);
                   2767:                        else if(Tr){
                   2768:                                mycat0([St,": (",R0+1,",",R1+1,") -> (1,1)\n"],0);
                   2769:                                mycat([GR,"\n"]);mycat([M,"\n"]);mycat([GC,"\n"]);
                   2770:                        }else mycat0([St,": (",R0+1,",",R1+1,") -> (1,1)\n",M,"\n"],0);
                   2771:                if(R[0]==0){            /* (1,1) : invertible */
                   2772:                        if(type(V)==5) V[St]=cons([1],V[St]);
                   2773:                        P=M[0][0]; M[0][0]=1;
                   2774:                        for(J=0;J<S1;J++){      /* (1,1) -> 1 */
                   2775:                                if(J>0) M[0][J]= red(M[0][J]/P);
                   2776:                                if(Tr) GR[0][J]=red(GR[0][J]/P);
                   2777:                        }
                   2778:                        if(S0>1 && S1>1) N=newmat(S0-1,S1-1);
                   2779:                        else N=0;
                   2780:                        for(I=1;I<S0;I++){
                   2781:                                P=M[I][0]; M[I][0]=0;
                   2782:                                for(J=1;J<S1;J++)
                   2783:                                        N[I-1][J-1]=M[I][J]=red(M[I][J] - muldo(P,M[0][J],XX));
                   2784:                                if(Tr){
                   2785:                                        for(J=0;J<S0;J++)
                   2786:                                                GR[I][J] = red(GR[I][J] -muldo(P,GR[0][J],XX));
                   2787:                                }
                   2788:                        }
                   2789:                        if(Tr){
                   2790:                                for(J=1;J<S1; J++){
                   2791:                                        for(I=0;I<S1;I++) GC[I][J]=red(GC[I][J]-muldo(GC[I][0],M[0][J],XX));
                   2792:                                        M[0][J]=0;
                   2793:                                }
                   2794:                        }
                   2795:                        if(St>0 && V==0){
                   2796:                                if(Tr){
                   2797:                                        mycat0([St,": unit\n"],0);
                   2798:                                        mycat([GR,"\n"]);mycat([M,"\n"]);mycat([GC,"\n"]);
                   2799:                                }
                   2800:                                else mycat0([St,": unit\n",M,"\n"],0);
                   2801:                        }
                   2802:                        if(N==0){
                   2803:                                if(!Tr) return [1];
                   2804:                                if(Tr==2){
                   2805:                                        GR0=mdivisor(GR,X|trans=1)[1];
                   2806:                                        GC0=mdivisor(GC,X|trans=1)[1];
                   2807:                                        return [[1],GR,GC,GR0,GC0];
                   2808:                                }
                   2809:                                return [[1],GR,GC];
                   2810:                        }
                   2811:                        R=mdivisor(N,XX|dviout=V,trans=Tr0,step=(St>0)?St+1:St);
                   2812:                        if(!Tr) return cons(1,R);
                   2813:                        GR=muldo(newbmat(2,2,[[1],[0,R[1]]]),GR,XX);
                   2814:                        GC=muldo(GC,newbmat(2,2,[[1],[0,R[2]]]),XX);
                   2815:                        if(S0==S1 && countin(1,1,R[0])==S0-1){
                   2816:                                GR=muldo(GC,GR,XX); GC=mgen(S0,0,1,0);
                   2817:                        }
                   2818:                        if(Tr==2){
                   2819:                                GR0=mdivisor(GR,X|trans=1)[1];
                   2820:                                GC0=mdivisor(GC,X|trans=1)[1];
                   2821:                                return [cons(1,R[0]),GR,GC,GR0,GC0];
                   2822:                        }
                   2823:                        return [cons(1,R[0]),GR,GC];
                   2824:                }
                   2825:                for(I=1;I<S0;I++){
                   2826:                        if(M[I][0]!=0){
                   2827: /* Error! when mygcd(A,B,0) with A<=0 or B<=0 */
                   2828:                                R=mygcd(M[I][0],M[0][0],XX);    /* R[0]=R[1]*M[I][0]+R[2]*M[0][0] */
                   2829:                                M[0][0]=R[0]; M[I][0]=0;        /*    0=R[3]*M[I][0]+R[4]*M[0][0] */
                   2830:                                for(J=1;J<S1;J++){
                   2831:                                        T=red(muldo(R[1],M[I][J],XX)+muldo(R[2],M[0][J],XX));
                   2832:                                        M[I][J]=red(muldo(R[3],M[I][J],XX)+muldo(R[4],M[0][J],XX));
                   2833:                                        M[0][J]=T;
                   2834:                                }
                   2835:                                if(Tr){
                   2836:                                        for(J=0;J<S0;J++){
                   2837:                                                T=red(muldo(R[1],GR[I][J],XX)+muldo(R[2],GR[0][J],XX));
                   2838:                                                GR[I][J]=red(muldo(R[3],GR[I][J],XX)+muldo(R[4],GR[0][J],XX));
                   2839:                                                GR[0][J]=T;
                   2840:                                        }
                   2841:                                }
                   2842:                                if(St && V==0){
                   2843:                                        mycat([" [",R[2],R[1],"]*"]);
                   2844:                                        mycat([" [",R[4],R[3],"]"]);
                   2845:                                }
                   2846:                                if(type(V)==5) V[St]=cons([2,I,mat([R[2],R[1]],[R[4],R[3]])],V[St]);
                   2847:                                FF=": line 1 & "+rtostr(I+1); I=S0;
                   2848:                        }
                   2849:                }
                   2850:                if(I>S0) continue;
                   2851:                for(J=1;J<S1;J++){
                   2852:                        if(M[0][J]!=0){
                   2853:                                R=mygcd(M[0][J],M[0][0],XX|rev=1); /* R[0]=M[0][J]*R[1]+M[0][0]*R[2] */
                   2854:                                M[0][0]=R[0]; M[0][J]=0;                 /*    0=M[0][J]*R[3]+M[0][0]*R[4] */
                   2855:                                for(I=1;I<S0;I++){
                   2856:                                        T=red(muldo(M[I][J],R[1],XX)+muldo(M[I][0],R[2],XX));
                   2857:                                        M[I][J]=red(muldo(M[I][J],R[3],XX)+muldo(M[I][0],R[4],XX));
                   2858:                                        M[I][0]=T;
                   2859:                                }
                   2860:                                if(Tr){
                   2861:                                        for(I=0;I<S1;I++){
                   2862:                                                T=red(muldo(GC[I][J],R[1],XX)+muldo(GC[I][0],R[2],XX));
                   2863:                                                GC[I][J]=red(muldo(GC[I][J],R[3],XX)+muldo(GC[I][0],R[4],XX));
                   2864:                                                GC[I][0]=T;
                   2865:                                        }
                   2866:                                }
                   2867:                                if(type(V)==5) V[St]=cons([3,J,mat([R[2],R[4]],[R[1],R[3]])],V[St]);
                   2868:                                FF=": column 1 & "+rtostr(J+1);J=S1;
                   2869:                                if(St && V==0){
                   2870:                                        mycat([" *[",R[2],R[4],"]"]);
                   2871:                                        mycat(["  [",R[1],R[3],"]"]);
                   2872:                                }
                   2873:                        }
                   2874:                }
                   2875:                if(J>S1) continue;
                   2876:                if(S0==1 || S1==1){
                   2877:                        P=M[0][0];
                   2878:                        if(X==0){
                   2879:                                if(P<0){
                   2880:                                        P=-P;
                   2881:                                        if(Tr) for(J=0;J<S0;J++) GR[0][J]=-GR[0][J];
                   2882:                                        if(type(V)==5) V[St]=cons([5,0,-1],V[St]);
                   2883:                                }
                   2884:                        }else{
                   2885:                                P=nm(P);
                   2886:                                if((R=fctr(P)[0][0])!=1){
                   2887:                                        P/=R;
                   2888:                                        if(Tr) for(J=0;J<S0;J++) GR[0][J]/=R;
                   2889:                                        if(type(V)==5) V[St]=cons([5,0,1/R],V[St]);
                   2890:                                }
                   2891:                        }
                   2892:                        if(!Tr) return [P];
                   2893:                        if(Tr==2){
                   2894:                                GR0=mdivisor(GR,X|trans=1)[1];
                   2895:                                GC0=mdivisor(GC,X|trans=1)[1];
                   2896:                                return [[P],GR,GC,GR0,GC0];
                   2897:                        }
                   2898:                        return [[P],GR,GC];
                   2899:                }
                   2900:                if(XX==0 || (type(XX)==4 && XX[0]==0)){                 /* commutative case */
                   2901:                        P=M[0][0];
                   2902:                        for(I=1; I<S0; I++){
                   2903:                                for(J=1; J<S1; J++)
                   2904:                                        if(divdo(M[I][J],P,XX)[1]!=0) break;
                   2905:                                if(J<S1){
                   2906:                                        if(type(V)==5) V[St]=cons([4,J],V[St]);
                   2907:                                        FF=": column 1 += col"+rtostr(J+1);
                   2908:                                        for(I=1;I<S0;I++) M[I][0]=M[I][J];
                   2909:                                        if(Tr) for(I=0;I<S1;I++) GC[I][0]=red(GC[I][0]+GC[I][J]);
                   2910:                                        break;
                   2911:                                }
                   2912:                        }
                   2913:                        if(J<S1) continue;
                   2914:                        N=newmat(S0-1,S1-1);
                   2915:                        for(I=1;I<S0;I++)
                   2916:                                for(J=1;J<S1;J++) N[I-1][J-1]=red(M[I][J]/P);
                   2917:                        if(X==0){
                   2918:                                if(P<0) P=-P;
                   2919:                                if(Tr) for(J=0;J<S0;J++) GR[0][J]=-GR[0][J];
                   2920:                        }else{
                   2921:                                P=M[0][0];
                   2922:                                P=nm(P);
                   2923:                                P/=fctr(P)[0][0];
                   2924:                                if(Tr) for(J=0;J<S0;J++) GR[0][J]/=fctr(P)[0][0];
                   2925:                        }
                   2926:                        R=mdivisor(N,XX|dviout=V,trans=Tr0,step=(St>0)?St+1:St);
                   2927:                        RT=(Tr)?R[0]:R;
                   2928:                        for(RR=[],L=reverse(RT);L!=[];L=cdr(L))
                   2929:                                RR=cons(red(P*car(L)),RR);
                   2930:                        RR=cons(P,RR);
                   2931:                        if(!Tr) return RR;
                   2932:                        GR=muldo(newbmat(2,2,[[1],[0,R[1]]]),GR,XX);
                   2933:                        GC=muldo(GC,newbmat(2,2,[[1],[0,R[2]]]),XX);
                   2934:                        if(S0==S1 && countin(1,1,RR)==S0){
                   2935:                                GR=muldo(GC,GR,XX); GC=mgen(S0,0,1,0);
                   2936:                        }
                   2937:                        if(Tr==2){
                   2938:                                GR0=mdivisor(GR,X|trans=1)[1];
                   2939:                                GC0=mdivisor(GC,X|trans=1)[1];
                   2940:                                return [RR,GR,GC,GR0,GC0];
                   2941:                        }
                   2942:                        return [RR,GR,GC];
                   2943:                }  /* End of commutative case */
                   2944:                for(I=1; I<S0; I++){
                   2945:                        for(J=1; J<S1; J++){
                   2946:                                if(M[I][J] != 0){
                   2947:                                        for(T=1;I<S0;T*=XX[0]){
                   2948:                                                R=divdo(muldo(M[I][J],T,XX),M[0][0],XX);
                   2949:                                                if(R[1]!=0){
                   2950:                                                        if(type(V)==5) V[St]=cons([6,J,T],V[St]);
                   2951:                                                        FF=": column 1 += col"+rtostr((J+1)*T);
                   2952:                                                        if(I>1){
                   2953:                                                                M=rowx(M,1,I);
                   2954:                                                                if(Tr) GR=rowx(GR,1,I);
                   2955:                                                                if(type(V)==5) V[St]=cons([7,I],V[St]);
                   2956:                                                                FF+=", line 2<->"+rtostr(I+1);
                   2957:                                                        }
                   2958:                                                        for(I=1;I<S0;I++)   M[I][0]=muldo(M[I][J],T,XX);
                   2959:                                                        if(Tr)
                   2960:                                                                for(I=1;I<S1;I++) GC[I][0]=red(GC[I][0]+muldo(GC[I][J],T,XX));
                   2961:                                                        I=S0+1; J=S1;
                   2962:                                                        break;
                   2963:                                                }
                   2964:                                        }
                   2965:                                }
                   2966:                        }
                   2967:                        if(I>S0) break;
                   2968:                }
                   2969:                if(I==S0) return [];  /* zero matrix : never happen */
                   2970:        }
                   2971: }
                   2972:
                   2973: def mdsimplify(L)
                   2974: {
                   2975:        T=getopt(type);
                   2976:        SS=0;
                   2977:        if(type(L)==6){
                   2978:                L=[L]; SS=1;
                   2979:        }
                   2980:        if(type(L)==5){
                   2981:                SS=2;
                   2982:                L = vtol(L);
                   2983:        }
                   2984:        M=car(L);
                   2985:        S=size(M)[0];
                   2986: #if 0
                   2987:        MN=newmat(S,S);
                   2988:        MD=newmat(S,S);
                   2989:        for(I=0;I<S;I++){
                   2990:                for(J=0;J<S;J++){
                   2991:                        TN=0;TD=1;
                   2992:                        for(PL=L;PL!=[];PL=cdr(PL)){
                   2993:                                TM=red(car(PL)[I][J]);
                   2994:                                TN=lgcd([TN,nm(TM)]|pol=1);
                   2995:                                TD=llcm([TD,dn(TM)]|pol=1);
                   2996:                        }
                   2997:                        MN[I][J]=TM;
                   2998:                        MD[I][J]=TN;
                   2999:                }
                   3000:        }
                   3001:        for(I=0;I<S;I++){
                   3002:                for(J=0;J<S;J++){
                   3003:                        if(I==J||type(TD[I][J])<2||type(TN[J][I])<2) continue;
                   3004:                        for(FC=cdr(fctr(TD[I][J]));FC!=[];){
                   3005:                                TFC=car(FC);
                   3006:                                if(type(red(TN[J][I]/TFC[0]))>2) continue;
                   3007:                        }
                   3008:                }
                   3009:        }
                   3010: #endif
                   3011:        DD=newvect(S);
                   3012:        for(I=0; I<S; I++){
                   3013:                LN=RN=[];
                   3014:                LD=RD=1;
                   3015:                for(LL=L; LL!=[]; LL=cdr(LL)){
                   3016:                        M = car(LL);
                   3017:                        for(J=0; J<S; J++){
                   3018:                                if(J==I) continue;
                   3019:                                if((MM=M[I][J]) != 0){
                   3020:                                        LN = cons(nm(MM),LN);
                   3021:                                        if(type(MM)==3 && tdiv(LD,P=dn(MM))==0)
                   3022:                                                LD=tdiv(LD*P,gcd(LD,P));
                   3023:                                }
                   3024:                                if((MM=M[J][I]) != 0){
                   3025:                                        RN = cons(nm(MM),RN);
                   3026:                                        if(type(MM)==3 && tdiv(RD,P=dn(MM))==0)
                   3027:                                                RD=tdiv(RD*P,gcd(RD,P));
                   3028:                                }
                   3029:                        }
                   3030:                }
                   3031:                if(T==1 || T==3) LQ=RD;
                   3032:                else{
                   3033:                        P=lpgcd(LN);
                   3034:                        LQ=gcd(P,RD);
                   3035:                        if(P!=0) LQ *= nm(fctr(P)[0][0]);
                   3036:                }
                   3037:                if(T==1 || T==2) RQ=LD;
                   3038:                else{
                   3039:                        P=lpgcd(RN);
                   3040:                        RQ=gcd(P,LD);
                   3041:                        if(P!=0) RQ *= nm(fctr(P)[0][0]);
                   3042:                }
                   3043:                if((P=gcdz(LQ,RQ))!=1){
                   3044:                        LQ = red(LQ/P); RQ=red(RQ/P);
                   3045:                }
                   3046:                DD[I]=red(LQ/RQ);
                   3047:                if(LQ!=1 || RQ!=1){
                   3048:                        for(LA=[],LL=L; LL!=[]; LL=cdr(LL)){
                   3049:                                M = car(LL);
                   3050:                                for(J=0; J<S; J++){
                   3051:                                        if(I!=J){
                   3052:                                                if(LQ!=1){
                   3053:                                                        M[I][J] = red(M[I][J]/LQ);
                   3054:                                                        M[J][I] = red(M[J][I]*LQ);
                   3055:                                                }
                   3056:                                                if(RQ!=1){
                   3057:                                                        M[J][I] = red(M[J][I]/RQ);
                   3058:                                                        M[I][J] = red(M[I][J]*RQ);
                   3059:                                                }
                   3060:                                        }
                   3061:                                }
                   3062:                        }
                   3063:                }
                   3064:        }
                   3065:        if(SS==2) L=ltov(L);
                   3066:        if(SS==1) L=L[0];
                   3067:        if(getopt(show)==1) L=[L,DD];
                   3068:        return L;
                   3069: }
                   3070:
                   3071: def m2mc(M,X)
                   3072: {
                   3073:        if(type(M)<2){
                   3074:        mycat([
                   3075: "m2mc(m,t) or m2mc(m,[t,s])\t Calculation of Pfaff system of two variables\n",
                   3076: " m : list of 5 residue mat. or GRS/spc for rigid 4 singular points\n",
                   3077: " t : [a0,ay,a1,c], swap, GRS, GRSC, sp, irreducible, pair, pairs, Pfaff, All\n",
                   3078: " s : TeX, dviout, GRSC\n",
                   3079: " option : swap, small, simplify, operator, int\n",
                   3080: " Ex: m2mc(\"21,21,21,21\",\"All\")\n"
                   3081: ]);
                   3082:                return 0;
                   3083:        }
                   3084:        if(type(M)==7) M=s2sp(M);
                   3085:        if(type(X)==7) X=[X];
                   3086:        Simp=getopt(simplify);
                   3087:        if(Simp!=0 && type(Simp)!=1) Simp=2;
                   3088:        Small=(getopt(small)==1)?1:0;
                   3089:        if(type(M[0])==4){
                   3090:                if(type(M[0][0])==1){ /* spectral type */
                   3091:                        XX=getopt(dep);
                   3092:                        if(type(XX)!=4 || type(XX[0])>1) XX=[1,length(M[0])];
                   3093:                        M=sp2grs(M,[d,a,b,c],[XX[0],XX[1],-2]|mat=1);
                   3094:                        if(XX[0]>1 && XX[1]<2) XX=[XX[0],2];
                   3095:                        if(getopt(int)!=0){
                   3096:                                T=M[XX[0]-1][XX[1]-1][1];
                   3097:                                for(V=vars(T);V!=[];V=cdr(V)){
                   3098:                                        F=coef(T,1,car(V));
                   3099:                                        if(type(F)==1 && dn(F)>1)
                   3100:                                         M = subst(M,car(V),dn(F)*car(V));
                   3101:                                }
                   3102:                        }
                   3103:                        V=vars(M);
                   3104:                        if(findin(d1,V)>=0 && findin(d2,V)<0 && findin(d3,V)<0)
                   3105:                                M=subst(M,d1,d);
                   3106:                }
                   3107:                RC=chkspt(M|mat=1);
                   3108:                if(RC[2] != 2 || RC[3] != 0){ /* rigidity idx and Fuchs cond */
                   3109:                        erno(0);return 0;
                   3110:                }
                   3111:                R=getbygrs(M,1|mat=1);
                   3112:                if(getopt(anal)==1) return R;   /* called by mc2grs() */
                   3113:                Z=newmat(1,1,[[0]]);
                   3114:                N=[Z,Z,Z,Z,Z];
                   3115:                for(RR=R; RR!=[]; RR=cdr(RR)){
                   3116:                        RT=car(RR)[0];
                   3117:                        if(type(RT)==4){
                   3118:                                if(RT[0]!=0) N=m2mc(N,RT[0]|simplify=Simp);
                   3119:                                N=m2mc(N,[RT[1],RT[2],RT[3]]|simplify=Simp);
                   3120:                        }
                   3121:                }
                   3122:                if(type(X)==4 && type(X[0])==7)
                   3123:                        return m2mc(N,X|keep=Keep,small=Small);
                   3124:                return N;
                   3125:        }
                   3126:        if(type(X)==4 && type(X[0])==7){
                   3127:                Keep=(getopt(keep)==1)?1:0;
                   3128:                if(X[0]=="All"){
                   3129:                        dviout("Riemann scheme"|keep=1);
                   3130:                        m2mc(M,[(findin("GRSC",X)>=0)?"GRSC":"GRS","dviout"]|keep=1);
                   3131:                        dviout("Spectral types : "|keep=1);
                   3132:                        m2mc(M,["sp","dviout"]|keep=1);
                   3133:                        dviout("\\\\\nBy the decompositions"|keep=1);
                   3134:                        R=m2mc(M,["pairs","dviout"]|keep=1);
                   3135:                        for(R0=R1=[],I=1; R!=[]; I++, R=cdr(R)){
                   3136:                                for(S=0,RR=car(R)[1][0];RR!=[]; RR=cdr(RR)) S+=RR[0];
                   3137:                                if(S==0) R0=cons(I,R0);
                   3138:                                else if(S<0) R1=cons(I,R1);
                   3139:                        }
                   3140:                        S="irreducibility\\ $"+((length(R0)==0)?"\\Leftrightarrow":"\\Leftarrow")
                   3141:                                +"\\ \\emptyset=\\mathbb Z\\cap$";
                   3142:                        dviout(S|keep=1);
                   3143:                        m2mc(M,["irreducible","dviout"]|keep=1);
                   3144:                        if(R0!=[])
                   3145:                                dviout(ltotex(reverse(R0))|eq=0,keep=1,
                   3146:                                 title="The following conditions may not be necessary for the irreducibility.");
                   3147:                        if(R1!=[])
                   3148:                                dviout(ltotex(reverse(R1))|eq=0,keep=1,title="The following conditions can be omitted.");
                   3149:                        if(getopt(operator)!=0){
                   3150:                                dviout("The equation in a Pfaff form is"|keep=1);
                   3151:                                m2mc(M,["Pfaff","dviout"]|keep=Keep,small=Small);
                   3152:                        }
                   3153:                        else if(Keep!=1) dviout(" ");
                   3154:                        return M;
                   3155:                }
                   3156:                Show=0;
                   3157:                if(length(X)>1){
                   3158:                        if(X[1]=="dviout") Show=2;
                   3159:                        if(X[1]=="TeX") Show=1;
                   3160:                }
                   3161:                if(X[0]=="GRS"||X[0]=="GRSC"||X[0]=="sp"){
                   3162:                        Y=radd(-M[0],-M[1]-M[2]);
                   3163:                        if(X[0]!="GRSC"){
                   3164:                                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);
                   3165:                                if(X[0]=="sp"){
                   3166:                                        L=chkspt(L|opt="sp");
                   3167:                                        V=[L[1],L[0],L[2],L[5]]; W=[L[1],L[3],L[4],L[6]];
                   3168:                                        if(Show==2) dviout(s2sp(V)+" : "+s2sp(W)|keep=Keep);
                   3169:                                        return [V,W];
                   3170:                                }
                   3171:                                S="x=0&x=y&x=1&y=0&y=1&x=\\infty&y=\\infty&x=y=\\infty\\\\\n";
                   3172:                        }else{
                   3173:                                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]),
                   3174:                                        radd(M[0],M[1]+M[3]),radd(M[1],M[2]+M[4])]|mult=1);
                   3175:                                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";
                   3176:                        }
                   3177:                        T=ltotex(L|opt="GRS",pre=S,small=Small);
                   3178:                        if(Show==2) dviout(T|eq=0,keep=Keep);
                   3179:                        if(Show==1) L=T;
                   3180:                        return L;
                   3181:                }
                   3182:                if(X[0]=="Pfaff"){
                   3183:                        S=ltotex(M|opt=["Pfaff",u,x,x-y,x-1,y,y-1],small=Small);
                   3184:                        if(Show==2) dviout(S|eq=0,keep=Keep);
                   3185:                        return S;
                   3186:                }
                   3187:                if(X[0]=="irreducible"){
                   3188:                        L=meigen([M[0],M[1],M[2],radd(-M[0],-M[1]-M[2])]|mult=1);
                   3189:                        S=getbygrs(L,10|mat=1);
                   3190:                        if(Show==2) dviout(ltotex(S)|eq=0,keep=Keep);
                   3191:                        return S;
                   3192:                }
                   3193:                if(X[0]=="pairs"||X[0]=="pair"){
                   3194:                        L=meigen([M[0],M[1],M[2],radd(-M[0],-M[1]-M[2])]|mult=1);
                   3195:                        S=chkspt(L|opt=0);
                   3196:                        V=(Show==2)?1:0;
                   3197:                        S=sproot(L,X[0]|dviout=V,keep=Keep);
                   3198:                        return S;
                   3199:                }
                   3200:                if(X[0]=="swap"){
                   3201:                        Swap=getopt(swap);
                   3202:                        if(type(Swap)<1 || Swap==1)
                   3203:                                return newvect(5,[M[3],M[1],M[4],M[0],M[2]]);
                   3204:                        if(Swap==2)
                   3205:                                return newvect(5,[radd(M[0],M[1]+M[3]),M[4],M[2],radd(-M[1],-M[3]-M[4]),M[1]]);
                   3206:                        if(type(Swap)==4 && length(Swap)==3){
                   3207:                                MX=radd(-M[0],-M[1]-M[2]); MY=radd(-M[3],-M[1]-M[4]);
                   3208:                                if(Swap[0]==1){
                   3209:                                        MX0=M[2];MY0=M[4];
                   3210:                                }
                   3211:                                else if(Swap[0]==2){
                   3212:                                        MX0=MX;MY0=MY;
                   3213:                                }else{
                   3214:                                        MX0=M[0];MY0=M[3];
                   3215:                                }
                   3216:                                if(Swap[1]==1){
                   3217:                                        MX1=M[2];MY1=M[4];
                   3218:                                }
                   3219:                                else if(Swap[1]==2){
                   3220:                                        MX1=MX;MY1=MY;
                   3221:                                }else{
                   3222:                                        MX1=M[0];MY1=M[3];
                   3223:                                }
                   3224:                                return newvect(5,MX0,M[1],MX1,MY0,MY1);
                   3225:                        }
                   3226:                }
                   3227:                return 0;
                   3228:        }
                   3229:        if(getopt(swap)==1)
                   3230:                 return m2mc(m2mc(m2mc(M,"swap"),X),"swap");
                   3231:        N=newvect(5);
                   3232:        for(I=0;I<5;I++)
                   3233:                N[I]=M[I];
                   3234:        S=size(N[0])[0];
                   3235:        if(type(X)==4){
                   3236:                 for(I=0;I<3;I++){
                   3237:                         if(X[I] != 0)
                   3238:                                        N[I] = radd(N[I],X[I]);
                   3239:                 }
                   3240:                 if(length(X)==3) return N;
                   3241:                 X=X[3];
                   3242:        }
                   3243:        MZ = newmat(S,S);
                   3244:        ME = mgen(S,0,[X],0);
                   3245:        MM = newvect(5);
                   3246:        MM[0] = newbmat(3,3, [[N[0]+ME,N[1],N[2]], [MZ], [MZ]]);
                   3247:        MM[1] = newbmat(3,3, [[MZ], [N[0],N[1]+ME,N[2]], [MZ]]);
                   3248:        MM[2] = newbmat(3,3, [[MZ], [MZ], [N[0],N[1],N[2]+ME]]);
                   3249:        MM[3] = newbmat(3,3, [[N[3]+N[1],-N[1]], [-N[0],radd(N[0],N[3])], [MZ,MZ,N[3]]]);
                   3250:        MM[4] = newbmat(3,3, [[N[4]], [MZ,N[4]+N[2],-N[2]], [MZ,-N[1],radd(N[4],N[1])]]);
                   3251:        M0 = newbmat(3,3, [[N[0]], [MZ,N[1]], [MZ,MZ,N[2]]]);
                   3252:        M1 = radd(MM[0],MM[1]+MM[2]);
                   3253:        KE = append(mykernel(M0|opt=1),mykernel(M1|opt=1));
                   3254:        if(length(KE) == 0) return MM;
                   3255:        KK = mtoupper(lv2m(KE),0);
                   3256:        for(I=0;I<5;I++)
                   3257:                MM[I] = mmod(MM[I],KK);
                   3258:        if(Simp!=0) MM = mdsimplify(MM|type=Simp);
                   3259:        return MM;
                   3260: }
                   3261:
                   3262: def easierpol(P,X)
                   3263: {
                   3264:        if(type(X) == 4){
                   3265:                for( Y = [] ; X != []; X = cdr(X) )
                   3266:                        Y = cons([0,car(X)], Y);
                   3267:        }else
                   3268:                Y = [0,X];
                   3269:        return rede(P,Y);
                   3270: }
                   3271:
                   3272: def l2p(L,V)
                   3273: {
                   3274:        if(type(L)==4){
                   3275:                for(S=I=0;L!=[];L=cdr(L),I++)
                   3276:                        S+=car(L)*V^I;
                   3277:                return S;
                   3278:        }else if(type(L)==5){
                   3279:                for(S=0,I=size(L)-1;I>=0;I--)
                   3280:                        S+=L[I]*V^I;
                   3281:                return S;
                   3282:        }else{
                   3283:                if(type(D=getopt(size))==1) D--;
                   3284:                else D=mydeg(L,V);
                   3285:                for(S=[];D>=0;D--)
                   3286:                        S=cons(mycoef(L,D,V),S);
                   3287:                return S;
                   3288:        }
                   3289: }
                   3290:
                   3291: def paracmpl(L,V)
                   3292: {
                   3293:        if(type(L)==4) L=ltov(L);
                   3294:        S=length(L);
                   3295:        Lim=getopt(lim);Low=getopt(low);
                   3296:        if((F=type(L[0]))>3){
                   3297:                SV=length(L[0]);
                   3298:                V0=makenewv(L);
                   3299:                for(LL=[];S>0;S--)
                   3300:                        LL=cons(l2p(L[S-1],V0),LL);
                   3301:                G=paracmpl(LL,V|option_list=getopt());
                   3302:                H=(Lim==1)?G:G[0];
                   3303:                for(HH=[];H!=[];H=cdr(H)){
                   3304:                        HT=l2p(car(H),V0|size=SV);
                   3305:                        if(F==5) HT=ltov(HT);
                   3306:                        HH=cons(HT,HH);
                   3307:                }
                   3308:                H=reverse(HH);
                   3309:                return (Lim==1)?H:[H,G[1]];
                   3310:        }
                   3311:        H=newvect(S);D=newvect(S);
                   3312:        for(Dn=1,I=0;I<S;I++){
                   3313:                P=dn(L[I]=red(L[I]));
                   3314:                Dn=red(Dn*P/gcd(Dn,P));
                   3315:        }
                   3316:        if(Dn!=1){
                   3317:                for(I=0;I<S;I++) L[I]=red(Dn*L[I]);
                   3318:        }
                   3319:        G=diagm(S,[1]);
                   3320:        if(type(V)<4) V=[V];
                   3321:        VV=lsort(vars(L),V,1);
                   3322:        V=car(V);
                   3323:        for(I=0;I<S;I++){
                   3324:                P=L[I];
                   3325:                for(J=0,C=P;J<I;J++){
                   3326:                        if(D[J]!=[]){
                   3327:                                C=mycoef(C,DT,VV);
                   3328:                                P-=C*H[J];
                   3329:                                G=cola(G,I,J,-C);
                   3330:                        }
                   3331:                }
                   3332:                if(P==0){
                   3333:                        D[I]=[];continue;
                   3334:                }
                   3335:                P0=nm(red(P));
                   3336:                K=mymindeg(P0,V);
                   3337:                C=mycoef(P0,K,V);
                   3338:                if(K>0){
                   3339:                        P=red(P/V^K);
                   3340:                        G=colm(G,I,1/V^K);
                   3341:                }
                   3342:                for(DT=[],VT=VV;VT!=[];VT=cdr(VT)){
                   3343:                        K=(Low==1)?mymindeg(C,car(VT)):mydeg(C,car(VT));
                   3344:                        C=mycoef(C,K,car(VT));
                   3345:                        DT=cons(K,DT);
                   3346:                }
                   3347:                D[I]=DT=reverse(DT);
                   3348:                for(C=P,VT=VV;VT!=[];VT=cdr(VT),DT=cdr(DT))
                   3349:                        C=mycoef(C,car(DT),car(VT));
                   3350:                H[I]=P=red(P/C);
                   3351:                G=colm(G,I,1/C);
                   3352:        }
                   3353:        if(Dn!=1){
                   3354:                for(I=0;I<S;I++){
                   3355:                        TH=red(H[I]/Dn);
                   3356:                        F=fctr(dn(TH));F=cdr(F);
                   3357:                        if(Lim!=1||subst(Dn,V,0)==0){
                   3358:                                for(;F!=[];F=cdr(F)){
                   3359:                                        if(lsort(vars(car(F)[0]),VV,2)==[]){
                   3360:                                                C=car(F)[0]^car(F)[1];
                   3361:                                                TH=red(TH*C);
                   3362:                                                G=colm(G,I,C);
                   3363:                                        }
                   3364:                                }
                   3365:                        }
                   3366:                        H[I]=TH;
                   3367:                }
                   3368:        }
                   3369:        H=vtol(H);
                   3370:        if(Lim==1){
                   3371:                H=subst(H,V,0);
                   3372:                return map(red,H);
                   3373:        }
                   3374:        return [H,map(red,G)];
                   3375: }
                   3376:
                   3377: def mykernel(M)
                   3378: {
                   3379:        if(getopt(opt) == 1)
                   3380:                M = mtranspose(M);
                   3381:        S = size(M);
                   3382:        R = [];
                   3383:        MM = mtoupper(M,-1);
                   3384:        for(I = S[0]-1; I >= 0; I--){
                   3385:                for(J = S[1]-1; J >= 0; J--){
                   3386:                        if(MM[I][J] != 0)
                   3387:                                return R;
                   3388:                }
                   3389:                P = easierpol(MM[I][S[1]],zz);
                   3390:                RR = newvect(S[0]);
                   3391:                for(J = 0; J < S[0]; J++)
                   3392:                        RR[J] = mycoef(P,J,zz);
                   3393:                R = cons(RR,R);
                   3394:        }
                   3395:        return R;
                   3396: }
                   3397:
                   3398: def myimage(M)
                   3399: {
                   3400:        if(getopt(opt) == 1)
                   3401:                M = mtranspose(M);
                   3402:        S = size(M);
                   3403:        V = [];
                   3404:        M0 = newvect(S[1]);
                   3405:        M = mtoupper(M,0|opt=1);
                   3406:        for(I = S[0]-1; I >= 0; I--)
                   3407:                if(M0 != M[I])
                   3408:                        V = cons(vtozv(M[I])[0], V);
                   3409:        return V;
                   3410: }
                   3411:
                   3412: def mymod(V,L)
                   3413: {
                   3414:        Opt = getopt(opt);
                   3415:        S = length(V);
                   3416:        VP = newvect(S);
                   3417:        if(type(L)==6)
                   3418:                L=m2lv(L);
                   3419:        CT = length(L);
                   3420:        for(LT = L; LT != []; LT = cdr(LT)){
                   3421:                for(VT = car(LT), I = 0; I < S; I++)
                   3422:                        if(VT[I] != 0) break;
                   3423:                if(I >= S){
                   3424:                        CT--;
                   3425:                        continue;
                   3426:                }
                   3427:                VP[I] = 1;
                   3428:                MI = -red(V[I]/VT[I]);
                   3429:                if(MI != 0)
                   3430:                        V = radd(V,rmul(MI,VT));
                   3431:        }
                   3432:        if(Opt==1){
                   3433:                for(I = 0; I < S; I++)
                   3434:                        if(V[I] != 0)
                   3435:                                return 1;
                   3436:                return 0;
                   3437:        }
                   3438:        if(Opt==2){
                   3439:                W=newvect(S-CT);
                   3440:                for(CC = I = 0; I < S; I++){
                   3441:                        if(VP[I]==0) W[CC++] =V[I];
                   3442:                }
                   3443:                return W;
                   3444:        }
                   3445:        return V;
                   3446: }
                   3447:
                   3448: def mmod(M,L)
                   3449: {
                   3450:        S=size(M)[1];
                   3451:        MM=mtranspose(M);
                   3452:        VP = newvect(S);
                   3453:        if(type(L)==6)
                   3454:                L=m2lv(L);
                   3455:        for(CT = 0, LT = L; LT != []; LT = cdr(LT)){
                   3456:                for(VT = car(LT), I = 0; I < S; I++){
                   3457:                        if(VT[I] != 0){
                   3458:                                VP[I] = 1;
                   3459:                                break;
                   3460:                        }
                   3461:                }
                   3462:        }
                   3463:        if(getopt(opt)==1)
                   3464:                NE=1;
                   3465:        for(D=I=0; I<S; I++){
                   3466:                if(NE != 1 && VP[I] == 1) continue;
                   3467:                T = mymod(MM[I],L|opt=2);
                   3468:                if(D==0){
                   3469:                        K=length(T);
                   3470:                        MN=newmat((NE==1)?S:K,K);
                   3471:                }
                   3472:                for(J=0;J<K;J++)
                   3473:                        MN[J][D]=T[J];
                   3474:                D++;
                   3475:        }
                   3476:        return MN;
                   3477: }
                   3478:
                   3479: def llsize(V)
                   3480: {
                   3481:        for(I=J=0;V!=[];V=cdr(V),I++)
                   3482:                if(length(car(V))>J) J=length(car(V));
                   3483:        return [I,J];
                   3484: }
                   3485:
                   3486: def llbase(VV,L)
                   3487: {
                   3488:        S = length(VV);
                   3489:        V = dupmat(VV);
                   3490:        if(type(V) == 4)
                   3491:                V = ltov(V);
                   3492:        T = length(L);
                   3493:        for(I = 0; I < S; I++)
                   3494:                V[I] = nm(red(V[I]));
                   3495:        LV = 0;
                   3496:        for(J = 0; J < T; J++){
                   3497:                X = var(L[J]); N = deg(L[J],X);
                   3498:                for(I = LV; I < S; I++){
                   3499:                        if((C2=coef(V[I],N,X)) != 0){
                   3500:                                if(I > LV){
                   3501:                                        Temp = V[I];
                   3502:                                        V[I] = V[LV];
                   3503:                                        V[LV] = Temp;
                   3504:                                }
                   3505:                                for(I = 0; I < S; I++){
                   3506:                                        if(I == LV || (C1 = coef(V[I],N,X)) == 0)
                   3507:                                                continue;
                   3508:                                        Gcd = gcd(C1,C2);
                   3509:                                        V[I] = V[I]*tdiv(C2,Gcd)-V[LV]*tdiv(C1,Gcd);
                   3510:                                }
                   3511:                                LV++;
                   3512:                        }
                   3513:                }
                   3514:        }
                   3515:        return V;
                   3516: }
                   3517:
1.44      takayama 3518: def rsort(L,T,K)
                   3519: {
                   3520:        for(R=[];L!=[];L=cdr(L))
                   3521:                R=cons((type(car(L))==4)?rsort(car(L),T-1,K):car(L),R);
                   3522:        if(T>0||iand(T,iand(K,2)/2)) return reverse(R);
                   3523:        R=qsort(R);
                   3524:        return (iand(K,1))? reverse(R):R;
                   3525: }
                   3526:
1.60      takayama 3527: def llget(L,LL,LC)
                   3528: {
                   3529:        if(type(LL)==4){
                   3530:                LM=length(L);
                   3531:                for(R=[];LL!=[];LL=cdr(LL)){
                   3532:                        if(isint(TL=car(LL))) R=cons(TL,R);
                   3533:                        else{
                   3534:                                IM=(length(TL)==1)?(LM-1):TL[1];
                   3535:                                for(I=car(TL);I<=IM;I++) R=cons(I,R);
                   3536:                        }
                   3537:                }
                   3538:                LL=reverse(R);
                   3539:                if(LC==-1){
                   3540:                        LL=lsort(LL,[],1);
                   3541:                        return lsort(L,"num",["sub"]|c1=LL);
                   3542:                }
                   3543:                L=lsort(L,"num",["get"]|c1=LL);
                   3544:        }
                   3545:        if(type(LC)==4){
                   3546:                LM=length(L[0]);
                   3547:                for(R=[];LC!=[];LC=cdr(LC)){
                   3548:                        if(isint(TL=car(LC))) R=cons(TL,R);
                   3549:                        else{
                   3550:                                IM=(length(TL)==1)?(LM-1):TL[1];
                   3551:                                for(I>=car(TL);I<=IM;I++) R=cons(I,R);
                   3552:                        }
                   3553:                }
                   3554:                LC=reverse(R);
                   3555:                if(LL==-1){
                   3556:                        LC=lsort(LC,[],1);
                   3557:                        return lsort(L,"col",["setminus"]|c1=LC);
                   3558:                }
                   3559:                L=lsort(L,"col",["put"]|c1=LC);
                   3560:        }
1.63      takayama 3561:        if(getopt(flat)==1) L=m2l(L|flat=1);
1.60      takayama 3562:        return L;
                   3563: }
                   3564:
1.44      takayama 3565:
1.6       takayama 3566: def lsort(L1,L2,T)
                   3567: {
1.10      takayama 3568:        C1=getopt(c1);C2=getopt(c2);
1.8       takayama 3569:        if(type(T)==4){
                   3570:                K=T;
1.10      takayama 3571:                if(length(T)>0){
                   3572:                        T=K[0];
                   3573:                        K=cdr(K);
1.12      takayama 3574:                }else T=0;
1.8       takayama 3575:        }else K=0;
1.10      takayama 3576:        if(type(TT=T)==7)
                   3577:                T = findin(T,["cup","setminus","cap","reduce","sum","subst"]);
                   3578:        if(type(L2)==7&&T<0)
                   3579:                T=findin(TT,["put","get","sub"]);
                   3580:        if(K){           /* [[..],..] */
                   3581:                if(K!=[]) KN=K[0];
                   3582:                if(L2==[]||L2=="sort"){ /* sort or deduce duplication */
                   3583:                        if((T!=0&&T!=3)||length(K)!=1) return L1;
1.8       takayama 3584:                        if(KN<0){
                   3585:                                KN=-KN-1;
                   3586:                                F=-1;
                   3587:                        }else F=1;
                   3588:                        L1=msort(L1,[F,0,KN]);
1.10      takayama 3589:                        if(T==3){
1.8       takayama 3590:                                R=[car(L1)];L1=cdr(L1);
                   3591:                                for(;L1!=[];L1=cdr(L1)){
                   3592:                                        if(car(L1)[KN]!=car(R)[KN]) R=cons(car(L1),R);
                   3593:                                }
                   3594:                                L1=reverse(R);
                   3595:                        }
                   3596:                        return L1;
1.10      takayama 3597:                }else if((L2==0||L2=="col")&&type(C1)==4){
1.8       takayama 3598:                        if(T==0||T==1){ /* extract or delete columns */
                   3599:                                for(R=[];L1!=[];L1=cdr(L1)){
1.10      takayama 3600:                                        if(T==1&&C1==[0]){      /* delete top column */
1.8       takayama 3601:                                                R=cons(cdr(car(L1)),R);
                   3602:                                                continue;
                   3603:                                        }
1.10      takayama 3604:                                        LT=car(L1);RT=[];
1.8       takayama 3605:                                        if(T==0){
1.10      takayama 3606:                                                for(CT=C1;CT!=[];CT=cdr(CT)) RT=cons(LT[car(CT)],RT);
1.8       takayama 3607:                                        }else{
1.10      takayama 3608:                                                for(I=0;LT!=[];I++,LT=cdr(LT))
1.8       takayama 3609:                                                        if(findin(I,C1)<0) RT=cons(car(LT),RT);
                   3610:                                        }
1.59      takayama 3611:                                        R=cons(reverse(RT),R);
1.8       takayama 3612:                                }
                   3613:                                return reverse(R);
                   3614:                        }
1.10      takayama 3615:                }else if(type(L2)==1||type(L2)==7){
                   3616:                        if(L2==1||L2=="num"){
                   3617:                                if(T==4) T=3;
                   3618:                                I=(length(K)<2)?(-1):K[1];
                   3619:                                if(T==0||T==1||T==2||T==3){
                   3620:                                        S=F=CT=0;R=[];
                   3621:                                        if(K==[] || type((S=K[0]))==1 || S==0){
                   3622:                                                if(T==0||T==1||T==2){
                   3623:                                                        for(J;L1!=[];L1=cdr(L1),J++){
                   3624:                                                                if(T==0) R=cons(cons(J+S,car(L1)),R);
                   3625:                                                                else if(T==1){
                   3626:                                                                        for( ;C1!=[]; C1=cdr(C1))
                   3627:                                                                                R=cons(L1[car(C1)],R);
                   3628:                                                                }else{
                   3629:                                                                        if(findin(J,C1)<0) R=cons(car(L1),R);
                   3630:                                                                }
                   3631:                                                        }
                   3632:                                                        return reverse(R);
                   3633:                                                }else if(T==3) return length(L1);
                   3634:                                        }else{
                   3635:                                                if(type(S)==2&&vtype(S)>2) F=1;
                   3636:                                                else if(type(S)==4) F=2;
                   3637:                                                else if(S=="+") F=3;
                   3638:                                                else return L1;
                   3639:                                        }
                   3640:                                        for(R=[];L1!=[];L1=cdr(L1)){
                   3641:                                                L1T=car(L1);
                   3642:                                                if(F==1) V=call(S,(I<0)?L1T:L1T[I]);
                   3643:                                                else if(F==2) V=calc((I<0)?L1T:L1T[I],S);
                   3644:                                                else if(F==3){
                   3645:                                                        for(C=C1,V=0;C!=[];C=cdr(C))
                   3646:                                                                if(type(X=L1T[car(C)])==1) V+=X;
                   3647:                                                }
                   3648:                                                if(T==0) R=cons(cons(V,L1T),R);
                   3649:                                                else if(T==1){
                   3650:                                                        if(V) R=cons(L1T,R);
                   3651:                                                }else if(T==2){
                   3652:                                                        if(!V) R=cons(L1T,R);
                   3653:                                                }else if(T==3){
                   3654:                                                        if(F==3) CT+=V;
                   3655:                                                        else if(V) CT++;
                   3656:                                                }
                   3657:                                        }
                   3658:                                        return (T==3)?CT:reverse(R);
                   3659:                                }else if(TT=="col"){
                   3660:                                        J=(length(K)>0)?car(K):0;
                   3661:                                        I=length(car(L1))+J;
                   3662:                                        for(V=[];I>J;)
                   3663:                                                V=cons(--I,V);
                   3664:                                        return cons(V,L1);
                   3665:                                }
                   3666:                        }else if(L2=="transpose") return mtranspose(L1);
1.12      takayama 3667:                        else if(L2=="subst"||L2=="adjust"){
                   3668:                                Null=(!K)?"":car(K);
1.17      takayama 3669:                                if(L2=="adjust") C1=[];
1.12      takayama 3670:                                R=lv2m(L1|null="");
1.10      takayama 3671:                                for(;C1!=[];C1=cdr(C1)) R[car(C1)[0]][car(C1)[1]]=car(C1)[2];
                   3672:                                return m2ll(R);
                   3673:                        }
                   3674:                        return L1;
                   3675:                }else{           /* [[..],..], [[..],..] */
                   3676:                        if(type(L2[0])<4){
                   3677:                                for(R=[];L2!=[];L2=cdr(L2)) R=cons([car(L2)],R);
                   3678:                                L2=reverse(R);
                   3679:                        }
                   3680:                        if(TT=="sum")  T=3;
                   3681:                        if(TT=="over") T=4;
                   3682:                        if(findin(T,[0,1,2,3,4,5])<0) return L1;
                   3683:                        if(T==4||T==5){
                   3684:                                if(type(C1)<2) C1=[C1];
                   3685:                                if(type(C2)<2) C2=[C2];
                   3686:                        }
1.8       takayama 3687:                        if(type(car(L2))!=4){
                   3688:                                for(R=[];L2!=[];L2=cdr(L2)) R=cons([car(L2)],R);
                   3689:                                R=reverse(R);
                   3690:                                if(length(K)==1) K=[K[0],0];
                   3691:                                C2=0;
                   3692:                        }
1.10      takayama 3693:                        L1=lsort(L1,"num",["put",0]);           /* insert number */
                   3694:                        K0=(length(K)>0)?K[0]+1:1;
                   3695:                        K1=(length(K)>1)?K1=K[1]:0;
                   3696:                        L1=lsort(L1,"sort",[0,K0]);
                   3697:                        if(T<4&&type(C2)==4&&length(L2[0])>1){
                   3698:                                L2=lsort(L2,"col",["put"]|c1=cons(K1,C2)); /* add key and extract columns */
                   3699:                                C2=0;K1=0;
                   3700:                        }
                   3701:                        L2=lsort(L2,"sort",[0,K1]);
                   3702:                        for(R0=[],S=S1=length(L1[0]);S>0;S--) R0=cons("",R0);
                   3703:                        for(R1=[],S=length(L2[0]);S>0;S--) R1=cons("",R1);
                   3704:                        if(!K1&&T!=3) R1=cdr(R1);
                   3705:                        for(R=[];L1!=[];L1=cdr(L1)){
                   3706:                                while(L2!=[]&&car(L1)[K0]>car(L2)[K1]){
                   3707:                                        if(T==3) R=cons(append(R0,car(L2)),R);
                   3708:                                        L2=cdr(L2);
                   3709:                                }
                   3710:                                if(L2==[]||car(L1)[K0]<car(L2)[K1]){
                   3711:                                        if(T!=2) R=cons((T==1||T>3||R1==[])?car(L1):append(car(L1),R1),R);
                   3712:                                }else if(T==0||T==2||T==3){
                   3713:                                        if(R0==[]) R=append(car(L1),R);
                   3714:                                        else R=cons(append(car(L1),(!K1&&T!=3)?cdr(car(L2)):car(L2)),R);
                   3715:                                        L2=cdr(L2);
                   3716:                                }else if(T==4||T==5){
                   3717:                                        V1=ltov(car(L1));V2=ltov(car(L2));
                   3718:                                        for(D1=C1,D2=C2;D1!=[];D1=cdr(D1),D2=cdr(D2))
                   3719:                                                if((I=V2[car(D2)])!=""||T==4) V1[car(D1)+1]=I;
                   3720:                                        R=cons(vtol(V1),R);
                   3721:                                }
                   3722:                        }
                   3723:                        if(T==3){
                   3724:                                while(L2!=[]){
                   3725:                                        R=cons(append(R0,car(L2)),R);
                   3726:                                        L2=cdr(L2);
                   3727:                                }
                   3728:                        }
                   3729:                        R=lsort(R,"sort",["put",0]);    /* original order */
                   3730:                        D=(((T==0||T==2)&&!K1)||T==3)?[0]:[0,S1+K1];
                   3731:                        R=lsort(R,0,[1]|c1=D); /* delete */
                   3732:                        if(type(C1)!=4||T==1||T==4||T==5) return R;
                   3733:                        C=[];S0=size(L1[0]);
                   3734:                        for(;C1!=[];C1=cdr(C1)) C=cons(car(C1),C);
                   3735:                        for(I=0;I<S0-S1;I++) C=cons(I+S1,C);
1.8       takayama 3736:                        C=reverse(C);
1.10      takayama 3737:                        return lsort(R,"col",[1]|c1=C);
1.8       takayama 3738:                }
                   3739:        }
1.10      takayama 3740:        if(L2 == []){           /* [...] */
                   3741:                if(T==8||TT=="count") return [length(L1),length(lsort(L1,[],1))];
                   3742:                if(T==7||TT=="cut"){
                   3743:                        K=length(L1);
                   3744:                        if(C1<0) C1=K+C1;
                   3745:                        for(R=[],I=0;I<C1&&L1!=[];I++,L1=cdr(L1))
                   3746:                                R=cons(car(L1),R);
                   3747:                        for(S=[];L1!=[];L1=cdr(L1))
                   3748:                                S=cons(car(L1),S);
                   3749:                        return [reverse(R),reverse(S)];
                   3750:                }
                   3751:                if(T==2) return L2;
                   3752:                if(T==3) return [L1,L2];
1.6       takayama 3753:                L1 = ltov(L1); qsort(L1);
                   3754:                if(T != 1)
                   3755:                        return vtol(L1);
                   3756:                L3 = [];
                   3757:                for(I = length(L1)-1; I >= 0; I--){
                   3758:                        if(I > 0 && L1[I] == L1[I-1])
                   3759:                                continue;
                   3760:                        L3 = cons(L1[I], L3);
                   3761:                }
                   3762:                return L3;
                   3763:        }
1.10      takayama 3764:        if(T==8||TT=="count"){
                   3765:                K=length(lsort(L1,L2,3)[0]);
                   3766:                R=[length(L2),length(L1)];
                   3767:                L1 = lsort(L1,[],1);
                   3768:                L2 = lsort(L2,[],1);
                   3769:                R=append([length(L2),length(L1)],R);
                   3770:                R=cons(length(lsort(L1,L2,2)),R);
                   3771:                return reverse(cons(K,R));
                   3772:        }
1.12      takayama 3773:        if((T==9||TT=="cons")&&type(car(L1))==4){
                   3774:                if(type(L2)!=4) L2=[L2];
                   3775:                for(R=[];L1!=[];L1=cdr(L1)){
                   3776:                        R=cons(cons(car(L2),car(L1)),R);
                   3777:                        if(length(L2)>1) L2=cdr(L2);
                   3778:                }
                   3779:                return reverse(R);
                   3780:        }
1.13      takayama 3781:        if(T==10||TT=="cmp"){
                   3782:                if(length(L1)!=length(L2)){
                   3783:                        mycat("Different length!");
                   3784:                        return 1;
                   3785:                }
                   3786:                R=[];
                   3787:                if(type(car(L1))==4){
                   3788:                        for(U=[],I=0;L1!=[];I++,L1=cdr(L1),L2=cdr(L2)){
                   3789:                                if(length(S=car(L1))!=length(T=car(L2))){
                   3790:                                        mycat(["Different size : line ",I]);
                   3791:                                        return 0;
                   3792:                                }
                   3793:                                for(J=0;S!=[];S=cdr(S),T=cdr(T),J++)
                   3794:                                        if(car(S)!=car(T)) U=cons([[I,J],car(S),car(T)],U);
                   3795:                        }
                   3796:                        if(U!=[]) R=cons(reverse(U),R);
                   3797:                }else{
                   3798:                        for(I=0;L1!=[];L1=cdr(L1),L2=cdr(L2),I++)
                   3799:                                if(car(L1)!=car(L2)) R=cons([I,car(L1),car(L2)],R);
                   3800:                }
                   3801:                return reverse(R);
                   3802:        }
                   3803:        if(T==11||TT=="append"){
                   3804:                if(type(car(L1))!=4) return append(L1,L2);
                   3805:                for(R=[];L1!=[];L1=cdr(L1),L2=cdr(L2))
                   3806:                        R=cons(append(car(L1),car(L2)),R);
                   3807:                return reverse(R);
                   3808:        }
1.6       takayama 3809:        if(T == 1 || T == 2){
                   3810:                L1 = lsort(L1,[],1);
                   3811:                L2 = lsort(L2,[],1);
                   3812:                L3 = [];
                   3813:                if(T == 1){
                   3814:                        while(L1 != []){
                   3815:                                if(L2 == [] || car(L1) < car(L2)){
                   3816:                                 L3 = cons(car(L1), L3);
                   3817:                                 L1 = cdr(L1);
                   3818:                                        continue;
                   3819:                                }
                   3820:                                if(car(L1) > car(L2)){
                   3821:                                        L2 = cdr(L2);
                   3822:                                        continue;
                   3823:                                }
                   3824:                                L1 = cdr(L1); L2 = cdr(L2);
                   3825:                        }
                   3826:                        return reverse(L3);
                   3827:                }
                   3828:                if(T==2){
                   3829:                        while(L1 != [] && L2 != []){
                   3830:                                if(car(L1) != car(L2)){
                   3831:                                        if(car(L1) <= car(L2))
                   3832:                                                         L1 = cdr(L1);
                   3833:                                        else L2 = cdr(L2);
                   3834:                                        continue;
                   3835:                                }
                   3836:                                while(car(L1) == car(L2))
                   3837:                                        L1 = cdr(L1);
                   3838:                                L3 = cons(car(L2), L3);
                   3839:                        }
                   3840:                        return reverse(L3);
                   3841:                }
                   3842:        }
                   3843:        if(T==3){
                   3844:                L1 = qsort(L1); L2 = qsort(L2);
                   3845:                L3 = L4 = [];
                   3846:                while(L1 != [] && L2 != []){
                   3847:                        if(car(L1) == car(L2)){
                   3848:                                L1 = cdr(L1); L2 = cdr(L2);
                   3849:                        }else if(car(L1) < car(L2)){
                   3850:                                L3 = cons(car(L1),L3);
                   3851:                                L1 = cdr(L1);
                   3852:                        }else{
                   3853:                                L4 = cons(car(L2), L4);
                   3854:                                L2 = cdr(L2);
                   3855:                        }
                   3856:                }
                   3857:                L4 = append(reverse(L4),L2);
                   3858:                L3 = append(reverse(L3),L1);
                   3859:                return [L3,L4];
                   3860:        }
                   3861:        L1 = append(L1,L2);
                   3862:        return lsort(L1,[],1);
                   3863: }
                   3864:
                   3865: def mqsub(X,Y)
                   3866: {
                   3867:        for(L=LQS;L!=[];L=cdr(L)){
                   3868:                F=(T=car(L))[0];M=(T=cdr(T))[0];
                   3869:                X0=X;Y0=Y;
                   3870:                for(T=cdr(T);T!=[];T=cdr(T)){
                   3871:                        X0=X0[car(T)];Y0=Y0[car(T)];
                   3872:                }
                   3873:                if(type(M)==1){
                   3874:                        if(M==3){
                   3875:                                X0=type(X0);Y0=type(Y0);
                   3876:                        }else if(M==4&&type(X0)<2&&type(Y0)<2){
                   3877:                                X0=abs(X0);Y0=abs(Y0);
                   3878:                        }else if(M==5){
                   3879:                                X0=str_len(rtostr(X0));Y0=str_len(rtostr(Y0));
                   3880:                        }else if(type(X0)==type(Y0)&&type(X0)>3&&type(X0)<7){
                   3881:                                if(M==1){
                   3882:                                        X0=length(X0);Y0=length(Y0);
                   3883:                                }else if(M==2){
                   3884:                                        LX=length(X0);LY=length(Y0);
                   3885:                                        L0=(LX<LY)?LX:LY;
                   3886:                                        for(I=0;;I++){
                   3887:                                                if(I==L0){
                   3888:                                                        X0=LX;Y0=LY;break;
                   3889:                                                }
                   3890:                                                if(X0[I]==Y0[I]) continue;
                   3891:                                                X0=X0[I];Y0=Y0[I];break;
                   3892:                                        }
                   3893:                                }
                   3894:                        }
                   3895:                }else if(type(M)==2){
                   3896:                        X0=(*M)(X0,Y0);Y0=0;
                   3897:                }else if(type(M)==4&&length(M)==1){
                   3898:                        X0=(*car(M))(X0);Y0=(*car(M))(Y0);
                   3899:                }
                   3900:                if(X0==Y0) continue;
                   3901:                return (X0<Y0)?-F:F;
                   3902:        }
                   3903:        return 0;
                   3904: }
                   3905:
                   3906: def msort(L,S)
                   3907: {
                   3908:        if(type(S)!=4) return qsort(L);
                   3909:        if(type(S[0])!=4) S=[S];
                   3910:        LQS=S;
                   3911:        return qsort(L,os_md.mqsub);
                   3912: }
                   3913:
1.22      takayama 3914: def lpair(A,B)
                   3915: {
                   3916:        if(B==0){
                   3917:                for(S=T=[];A!=[];A=cdr(A)){
                   3918:                        S=cons(car(A)[0],S);T=cons(car(A)[1],T);
                   3919:                }
                   3920:                return [reverse(S),reverse(T)];
                   3921:        }else{
                   3922:                for(R=[];A!=[];A=cdr(A),B=cdr(B))
                   3923:                        R=cons([car(A),car(B)],R);
                   3924:                return reverse(R);
                   3925:        }
                   3926: }
                   3927:
1.6       takayama 3928: def lmax(L)
                   3929: {
                   3930:        if(type(L)==4){
                   3931:                V=car(L);
                   3932:                while((L=cdr(L))!=[])
                   3933:                        if(V < car(L)) V=car(L);
                   3934:                return V;
                   3935:        }else if(type(L)==5||type(L)==6)
                   3936:                return lmax(m2l(L));
                   3937:        return [];
                   3938: }
                   3939:
                   3940: def lmin(L)
                   3941: {
                   3942:        if(type(L)==4){
                   3943:                V=car(L);
                   3944:                while((L=cdr(L))!=[])
                   3945:                        if(V > car(L)) V=car(L);
                   3946:                return V;
                   3947:        }else if(type(L)==5||type(L)==6)
                   3948:                return lmin(m2l(L));
                   3949:        return [];
                   3950: }
                   3951:
                   3952: def lgcd(L)
                   3953: {
                   3954:        if(type(L)==4){
                   3955:                F=getopt(poly);
                   3956:                V=car(L);
                   3957:                while((L=cdr(L))!=[]&&V!=1){
                   3958:                        if(V!=0)
                   3959:                                V=(F==1)?gcd(V,car(L)):igcd(V,car(L));
                   3960:                }
                   3961:                return V;
                   3962:        }else if(type(L)==5||type(L)==6)
                   3963:                return lgcd(m2l(L)|option_list=getopt());
                   3964:        return [];
                   3965: }
                   3966:
1.56      takayama 3967: def llcm(R)
                   3968: {
1.60      takayama 3969:        if(type(R)==5||type(R)==6) R=m2l(R);
1.56      takayama 3970:        if(type(R)<4) R=[R];
                   3971:        if(type(R)!=4) return 0;
                   3972:        V=getopt(poly);
                   3973:        if(type(V)<1){
                   3974:                for(L=R;L!=[];L=cdr(L)){
                   3975:                        if(type(car(L))>1){
                   3976:                                V=1; break;
                   3977:                        }
                   3978:                }
                   3979:        }
                   3980:        if(getopt(dn)!=1){
                   3981:                for(L=[];R!=[];R=cdr(R)) if(R!=0) L=cons(1/car(R),L);
                   3982:                R=L;
                   3983:        }
                   3984:        P=1;
                   3985:        if(type(V)<1){
                   3986:                for(;R!=[];R=cdr(R)){
                   3987:                        if(!(TL=car(R))) continue;
                   3988:                        else P=ilcm(P,dn(TL));
                   3989:                }
                   3990:                return P;
                   3991:        }
                   3992:        for(;R!=[];R=cdr(R)){
                   3993:                if(!car(R)) continue;
                   3994:                D=dn(red(car(R)));
                   3995:                N=red(P/D);
                   3996:                if(type(V)<2){
                   3997:                        if(type(N)!=3) continue;
                   3998:                        P*=dn(N);
                   3999:                        continue;
                   4000:                }
                   4001:                if(ptype(N,V)>2){
                   4002:                        L=fctr(dn(N));
                   4003:                        for(;L!=[];L=cdr(L)){
                   4004:                                if(ptype(car(L)[0],V)<2) continue;
                   4005:                                P*=car(L)[0]^car(L)[1];
                   4006:                        }
                   4007:                }
                   4008:        }
                   4009:        return P;
                   4010: }
1.6       takayama 4011:
                   4012: def ldev(L,S)
                   4013: {
                   4014:        M=abs(lmax(L));N=abs(lmin(L));
                   4015:        if(M<N) M=N;
                   4016:        for(C=0,LT=L;;C++){
                   4017:                LT=ladd(LT,S,1);
                   4018:                MT=abs(lmax(LT));NT=abs(lmin(LT));
                   4019:                if(MT<NT) MT=NT;
                   4020:                if(MT>=M) break;
                   4021:                M=MT;
                   4022:        }
                   4023:        if(!C){
                   4024:                for(C=0,LT=L;;C--){
                   4025:                        LT=ladd(LT,S,-1);
                   4026:                        MT=abs(lmax(LT));NT=abs(lmin(LT));
                   4027:                        if(MT<NT) MT=NT;
                   4028:                        if(MT>=M) break;
                   4029:                        M=MT;
                   4030:                }
                   4031:        }
                   4032:        return [C,ladd(L,S,C)];
                   4033: }
                   4034:
                   4035: def lchange(L,P,V)
                   4036: {
                   4037:        if(getopt(flat)==1&&type(P)==4){
                   4038:                for(L=ltov(L);P!=[];P=cdr(P),V=cdr(V))
                   4039:                        L[car(P)]=car(V);
                   4040:                return vtol(L);
                   4041:        }
                   4042:        if(type(P)==4){
                   4043:                IP=car(P); P=cdr(P);
                   4044:        }else{
                   4045:                IP=P; P=[];
                   4046:        }
                   4047:        for(I=0, LL=[], LT=L; LT!=[]; I++,LT=cdr(LT)){
                   4048:                if(I==IP){
                   4049:                        LL=cons((P==[])?V:lchange(car(LT),P,V),LL);
                   4050:                }else
                   4051:                        LL=cons(car(LT),LL);
                   4052:        }
                   4053:        return reverse(LL);
                   4054: }
                   4055:
                   4056: def lsol(VV,L)
                   4057: {
                   4058:        if(type(VV)<4 && type(L)==2)
                   4059:                return red(L-VV/mycoef(VV,1,L));
                   4060:        S = length(VV);
                   4061:        T = length(L);
                   4062:        V = llbase(VV,L);
                   4063:        for(J = K = 0; J < T; J++){
                   4064:                X = var(L[J]); N = deg(L[J],X);
                   4065:                for(I = K; I < S; I++){
                   4066:                        if((C=mycoef(V[I], N, X)) != 0){
                   4067:                                V[I] = [L[J],red(X^N-V[I]/C)];
                   4068:                                K++;
                   4069:                                break;
                   4070:                        }
                   4071:                }
                   4072:        }
                   4073:        return V;
                   4074: }
                   4075:
                   4076: def lnsol(VV,L)
                   4077: {
                   4078:        LL=lsort(vars(VV),L,1);
                   4079:        VV=ptol(VV,LL|opt=0);
                   4080:        return lsol(VV,L);
                   4081: }
                   4082:
                   4083:
                   4084: def ladd(X,Y,M)
                   4085: {
1.58      takayama 4086:        if(Y==0){
                   4087:                Y=X[1];X=X[0];
                   4088:        }
1.22      takayama 4089:        if(type(Y)==4) Y=ltov(Y);
1.6       takayama 4090:        if(type(X)==4) X=ltov(X);
                   4091:        return vtol(X+M*Y);
                   4092: }
                   4093:
                   4094: def mrot(X)
                   4095: {
1.22      takayama 4096:        if(type(X)==4){
                   4097:                if(getopt(deg)==1)
                   4098:                        X=[deval(@pi*X[0]/180),deval(@pi*X[1]/180),deval(@pi*X[2]/180)];
                   4099:                if(getopt(conj)==1)
                   4100:                        return mrot([-X[2],-X[1],0])*mrot([X[0],X[1],X[2]]);
                   4101:                if(X[1]==0){
                   4102:                        X=[X[0]+X[2],0,0];
                   4103:                        if(X[0]==0) return diagm(3,[1]);
                   4104:                }
                   4105:                if(X[0]!=0){
                   4106:                        M=mat([dcos(X[0]),-dsin(X[0]),0],[dsin(X[0]),dcos(X[0]),0],[0,0,1]);
                   4107:                        if(X[1]==0) return M;
                   4108:                }
                   4109:                N=mat([dcos(X[1]),0,-dsin(X[1])],[0,1,0],[dsin(X[1]),0,dcos(X[1])]);
                   4110:                if(X[0]!=0) N=M*N;
                   4111:                if(X[2]==0) return N;
                   4112:                return N*mrot([X[2],0,0]);
                   4113:        }
1.6       takayama 4114:        if(getopt(deg)==1) X=@pi*X/180;
                   4115:        X=deval(X);
1.22      takayama 4116:        return mat([dcos(X),-dsin(X)],[dsin(X),dcos(X)]);
1.6       takayama 4117: }
                   4118:
                   4119: def m2v(M)
                   4120: {
                   4121:        S = size(M);
                   4122:        V = newvect(S[0]*S[1]);
                   4123:        for(I = C = 0; I < S[0]; I++){
                   4124:                MI = M[I];
                   4125:                for(J = 0; J < S[1]; J++)
                   4126:                        V[C++] = MI[J];
                   4127:        }
                   4128:        return V;
                   4129: }
                   4130:
                   4131: def lv2m(L)
                   4132: {
                   4133:        if(type(L)==5) L=vtol(L);
                   4134:        II=length(L);
                   4135:        for(J=1,T=L; T!=[]; T=cdr(T))
                   4136:                if(length(car(T))>JJ) JJ=length(car(T));
                   4137:        M = newmat(II,JJ);
                   4138:        N = getopt(null);
                   4139:        if(type(N)<0)   N=0;
                   4140:        for(I=0; I<II; I++){
                   4141:                V=car(L); L=cdr(L);
                   4142:                for(J=length(V);--J>=0;)
                   4143:                        M[I][J] = V[J];
                   4144:                if(N!=0){
                   4145:                        for(J=length(V); J<JJ; J++)
                   4146:                                M[I][J]=N;
                   4147:                }
                   4148:        }
                   4149:        return M;
                   4150: }
                   4151:
                   4152: def m2lv(M)
                   4153: {
                   4154:        I=size(M)[0];
                   4155:        for(N=[],I=size(M)[0];I-->0;)
                   4156:                N=cons(M[I],N);
                   4157:        return N;
                   4158: }
                   4159:
                   4160: def s2m(S)
                   4161: {
                   4162:        if(type(S)==6) return S;
                   4163:        if(type(S)==7){
                   4164:                if(str_chr(S,0,"[")!=0) S=s2sp(S);
                   4165:                else if(str_chr(S,0,",")>=0) return eval_str(S);
                   4166:                else{
                   4167:                        for(L=LL=[],I=0; ; ){
                   4168:                                II=str_chr(S,I+2,"]");
                   4169:                                if(II<0) return 0;
                   4170:                                J=str_chr(S,I+2," ");
                   4171:                                while(str_chr(S,J+1," ")==J+1) J++;
                   4172:                                if(J>II-2 || J<0) J=II;
                   4173:                 V=eval_str(sub_str(S,I+1,J-1));
                   4174:                                L=cons(V,L);
                   4175:                                I=J;
                   4176:                                if(J==II){
                   4177:                                        LL=cons(ltov(reverse(L)),LL);
                   4178:                                        L=[];
                   4179:                                        if((I=str_chr(S,II+1,"["))<0)
                   4180:                                                return lv2m(reverse(LL));
                   4181:                                }
                   4182:                        }
                   4183:                }
                   4184:        }
                   4185:        if(type(S)==5) S=vtol(S);
                   4186:        if(type(S[0])==5) return lv2m(S);
                   4187:        I=length(S);
                   4188:        for(J=1,T=S; T!=[]; T=cdr(T))
                   4189:                if(length(car(T))>J) J=length(car(T));
                   4190:        return newmat(I,J,S);
                   4191: }
                   4192:
                   4193: def c2m(L,V)
                   4194: {
                   4195:        if(type(Pow=getopt(pow))!=1){
                   4196:                if(isvar(V)==1){
                   4197:                        for(Pow=0,LT=L;LT!=[];LT=cdr(LT)){
                   4198:                                if(mydeg(car(LT),V)>JJ) Pow=mydeg(car(LT),V);
                   4199:                        }
                   4200:                        JJ=Pow+1;
                   4201:                }else{
                   4202:                        Pow=-1;
                   4203:                        JJ=length(V);
                   4204:                }
                   4205:        }else JJ=Pow+1;
                   4206:        M=newmat(length(L),JJ);
                   4207:        for(I=0;L!=[];L=cdr(L),I++){
                   4208:                for(J=0;J<JJ;J++){
                   4209:                        LT=car(L);
                   4210:                        M[I][J]=(Pow>=0)?mycoef(LT,J,V):mycoef(LT,1,V[J]);
                   4211:                }
                   4212:        }
                   4213:        return M;
                   4214: }
                   4215:
                   4216: #if 0
                   4217: def m2diag(M,N)
                   4218: {
                   4219:        S = size(M);
                   4220:        MM = mtoupper(M,N);
                   4221:        for(I = S[0]-1; I >= 0; I--){
                   4222:                for(J = 0; I < S[1]-N; I++){
                   4223:                        if(MM[I][J] != 0){
                   4224:                                P = MM[I][J];
                   4225:                                for(K = 0; K < I; K++){
                   4226:                                        Q = -rmul(MM[K][J],1/P);
                   4227:                                        MM[K][J] = 0;
                   4228:                                        if(Q != 0){
                   4229:                                                for(L = J+1; L < S[1]; L++){
                   4230:                                                        if(MM[I][L] != 0)
                   4231:                                                                MM[K][L] = radd(MM[K][L], rmul(MM[I][L],Q));
                   4232:                                                }
                   4233:                                        }
                   4234:                                }
                   4235:                        }
                   4236:                }
                   4237:        }
                   4238:        return MM;
                   4239: }
                   4240: #endif
                   4241:
                   4242: def myinv(M)
                   4243: {
                   4244:        S = size(M);
                   4245:        if((T=S[0]) != S[1])
                   4246:                return 0;
                   4247:        MM = mtoupper(M,-T|opt=2);
                   4248:        if(MM[T-1][T-1] != 1) return 0;
                   4249:        return mperm(MM,0,[T,[T]]);
                   4250: }
                   4251:
                   4252: def madj(G,M)
                   4253: {
                   4254:        H=myinv(G);
                   4255:        if(type(M)==6)
                   4256:                return rmul(rmul(G,M),H);
                   4257:        if(type(M)==4||type(M)==5){
                   4258:                L=length(M);
                   4259:                N=newvect(L);
                   4260:                for(I=0;I<L;I++){
                   4261:                        N[I]=rmul(rmul(G,M[I]),H);
                   4262:                }
                   4263:                if(type(N)==4) N=vtol(N);
                   4264:                return N;
                   4265:        }
                   4266:        return -1;
                   4267: }
                   4268:
                   4269: def mpower(M,N)
                   4270: {
                   4271:        if(type(M)<=3) return (red(M))^N;
                   4272:        S = size(M);
                   4273:        if(S[0] != S[1])
                   4274:                return 0;
                   4275:        if(N == 0) return mgen(S[0],0,[1],0);
                   4276:        if(N < 0)
                   4277:                return(mpower(myinv(M), -N));
                   4278:        R = dupmat(M);
                   4279:        V=1;
                   4280:        for(V=1;;){
                   4281:                if(iand(N,1)){
                   4282:                        V=map(red,R*V);
                   4283:                        N--;
                   4284:                }
                   4285:                if((N/=2)==0) break;
                   4286:                R=map(red,R*R);
                   4287:        }
                   4288:        return V;
                   4289: }
                   4290:
                   4291: def texlen(S)
                   4292: {
                   4293:        if(type(S)!=7) return 0;
                   4294:        LF=I=J=0;
                   4295:        LM=str_len(S);
                   4296:        while((I=str_str(S,"\\frac{"|top=J))>=0){
                   4297:                if(I>J) LF+=texlen(str_cut(S,J,I-1));
                   4298:                I+=6;
                   4299:                for(F=L=0,J=I;F<2 && J<LM-1;F++){
                   4300:                        for(C=1;C>0 && J<LM;){
                   4301:                                if((K0=str_char(S,J,"}"))<0) K0=LM;
                   4302:                                if((K1=str_char(S,J,"{"))<0) K1=LM;
                   4303:                                if(K0<0 && K1<0){
                   4304:                                        J = str_len(S)-1;
                   4305:                                        break;
                   4306:                                }
                   4307:                                if(K0<K1){
                   4308:                                        J=K0+1; C--;
                   4309:                                }else{
                   4310:                                        J=K1+1; C++;
                   4311:                                }
                   4312:                        }
                   4313:                        T=str_cut(S,I,J-1);
                   4314:                        if(F==0){
                   4315:                                I=J=K1+1;C=1;
                   4316:                        }else J=K0+1;
                   4317:                        if(type(T)==7 && (LL=texlen(T))>L) L=LL;
                   4318:                }
                   4319:                LF+=L;
                   4320:        }
                   4321:        if(J>0) S=str_cut(S,J,str_len(S)-1);
                   4322:        if(S==0) return LF;
                   4323:        S=ltov(strtoascii(S));
                   4324:        L=LL=length(S);
                   4325:        for(I=F=0; I<L; I++){
                   4326:                if(S[I]==92) F=1;
                   4327:                else if(F==1){
                   4328:                        if((S[I]>96     && S[I]<123)||(S[I]>64 && S[I]<91))     LL--;
                   4329:                        else F=0;
                   4330:                }
                   4331:                if(S[I]<=32||S[I]==123||S[I]==125||S[I]==94||S[I]==38) LL--;    /* {}^& */
                   4332:                else if(S[I]==95){
                   4333:                        LL--;
                   4334:                        if(I+2<L && S[I+2]==94) LL--;   /* x_2^3 */
                   4335:                        else if(I+6<L && S[I+1]==123 && S[I+4]==125){   /* x_{11}^2 */
                   4336:                                 if(S[I+5]==94 || (S[I+5]==125 && S[I+6]==94)) LL--     ;       /* x_{11}}^2 */
                   4337:                        }
                   4338:                }
                   4339:        }
                   4340:        return LL+LF;
                   4341: }
                   4342:
                   4343: def isdif(P)
                   4344: {
                   4345:        if(type(P)<1 || type(P)>3) return 0;
                   4346:        for(Var=[],R=vars(P);R!=[];R=cdr(R)){
                   4347:                V0=rtostr(car(R));
                   4348:                if(V0>"d" && V0<"e"){
                   4349:                        V=sub_str(V0,1,str_len(V0)-1);
                   4350:                        if(V>="a" && V<"{")     Var=cons([strtov(V),strtov(V0)],Var);
                   4351:                }
                   4352:        }
                   4353:        if(Var==[]) return 0;
                   4354:        for(V=Var; V!=[]; V=cdr(V))
                   4355:                if(ptype(P,car(V)[1])==3) return 0;
                   4356:        return  Var;
                   4357: }
                   4358:
                   4359: def texsp(P)
                   4360: {
                   4361:        Q=strtoascii(P);
                   4362:        if((J=str_char(Q,0,92))<0 || (C=Q[L=str_len(P)-1])==32||C==41||C==125)
                   4363:                return P;
                   4364:        for(;;){
                   4365:                if((I=str_char(Q,J+1,92))<0) break;
                   4366:                J=I;
                   4367:        };
                   4368:        for(I=J+1;I<L&&isalpha(Q[I]);I++);
                   4369:        return(I==L)?P+" ":P;
                   4370: }
                   4371:
                   4372: def fctrtos(P)
                   4373: {
                   4374:        /* extern TeXLim; */
                   4375:        if(!chkfun("write_to_tb", "names.rr"))
                   4376:                return 0;
                   4377:
                   4378:        TeX = getopt(TeX);
                   4379:        if(TeX != 1 && TeX != 2 && TeX != 3)
                   4380:                TeX = 0;
1.70      takayama 4381:        if((Dvi=getopt(dviout)==1) && TeX<2) TeX=3;
1.6       takayama 4382:        if(TeX>0){
                   4383:                Lim=getopt(lim);
                   4384:                if(Lim!=0 && TeX>1 && (type(Lim)!=1||Lim<30)) Lim=TeXLim;
                   4385:                else if(type(Lim)!=1) Lim=0;
                   4386:                CR=(TeX==2)?"\\\\\n":"\\\\\n&";
1.70      takayama 4387:                CR2="\\allowdisplaybreaks"+CR;
                   4388:                if(TeX==1 || Lim==0) CR=CR2="";
                   4389:                else if((Pages=getopt(pages))==1) CR2=CR;
1.6       takayama 4390:                if(!chkfun("print_tex_form", "names.rr"))
                   4391:                        return 0;
                   4392:                Small=getopt(small);
                   4393:        }
                   4394:        Dif=getopt(dif);
                   4395:        Var=getopt(var);
                   4396:        if(Lim>0 && type(Var)<2 && TeX!=1)      Var=[strtov("0"),""];
                   4397:        Dif=0;
                   4398:        if(Var=="dif"){
                   4399:                Dif=DV=1;
                   4400:        }else if (Var=="dif0") Dif=1;
                   4401:        else if(Var=="dif1")  Dif=2;
                   4402:        else if(Var=="dif2")  Dif=3;
                   4403:        if(Dif>0){
                   4404:                for(Var=[],R=vars(P);R!=[];R=cdr(R)){
                   4405:                        V=rtostr(car(R));
                   4406:                        if(V>"d" && V<"e"){
                   4407:                                V=sub_str(V,1,str_len(V)-1);
                   4408:                                if(V>="a" && V<"{"){
                   4409:                                        if(TeX>0){
                   4410:                                                V=my_tex_form(strtov(V));
                   4411:                                                if(Dif>=1){
                   4412:                                                        if(Dif==1){
                   4413:                                                                if(str_len(V)==1) V="\\partial_"+V;
                   4414:                                                                else    V="\\partial_{"+V+"}";
                   4415:                                                        }
                   4416:                                                        Var=cons([car(R),V],Var);
                   4417:                                                }
                   4418:                                                else Var=cons([car(R)],Var);
                   4419:                                        }else Var=cons([car(R)],Var);
                   4420:                                }
                   4421:                        }
                   4422:                }
                   4423:                if(TeX>0){
                   4424:                        if(length(Var)==1){
                   4425:                                if(DV==1 && str_len(Var[0][1])==10) Var=[[Var[0][0],"\\partial"]];
                   4426:                        }else if(DV==1){
                   4427:                                for(V=Var;V!=[];V=cdr(V)){
                   4428:                                        VV=rtostr(car(V)[0]);
                   4429:                                        if(VV<"dx0" || VV>= "dx:" || str_len(VV)>4) break;
                   4430:                                }
                   4431:                                if(V==[]){
                   4432:                                        for(VT=[],V=Var;V!=[];V=cdr(V)){
                   4433:                                                VV=str_cut(rtostr(car(V)[0]),2,3);
                   4434:                                                if(str_len(VV)==1)      VT=cons([car(V)[0],"\\partial_"+VV],VT);
                   4435:                                                else    VT=cons([car(V)[0],"\\partial_{"+VV+"}"],VT);
                   4436:                                        }
                   4437:                                        Var=reverse(VT);
                   4438:                                }
                   4439:                        }else
                   4440:                                if(Dif==2 && length(Var)>1) Dif=3;
                   4441:                }
                   4442:                if(Dif>0)       Dif--;
                   4443:        }
                   4444:        if(type(Var)>1 && Var!=[]){     /* as a polynomial of Var */
                   4445:                Add=getopt(add);
                   4446:                if(type(Add)>0){
                   4447:                        if(type(Add)!=7){
                   4448:                                Add=my_tex_form(Add);
                   4449:                                if(str_char(Add,0,"-")>=0 || str_char(Add,0,"+")>=0) Add="("+Add+")";
                   4450:                        }
                   4451:                        if(str_char(Add,0,"(")!=0) Add = " "+Add;
                   4452:                }else Add=0;
                   4453:                if(type(Var)!=4) Var=[Var];
                   4454:                if(length(Var)==2 && type(Var[1]) == 7)
                   4455:                        Var = [Var];
                   4456:                for(VV=VD=[]; Var!=[];Var=cdr(Var)){
                   4457:                        VT=(type(car(Var))==4)?car(Var):[car(Var)];
                   4458:                        VT0=var(car(VT));
                   4459:                        VV=cons(VT0,VV);
                   4460:                        if(length(VT)==1){
                   4461:                                VD=cons((TeX>=1)?my_tex_form(VT0):rtostr(VT0),VD);
                   4462:                        }else   VD=cons(VT[1],VD);
                   4463:                }
                   4464:                VV=reverse(VV);VD=reverse(VD);
                   4465:                Rev=(getopt(rev)==1)?1:0;
1.70      takayama 4466:                Rdic=0;
                   4467:                if((Dic=getopt(dic))==2){
                   4468:                        Dic=Rdic=1;
                   4469:                }else if(Dic!=1) Dic=0;
1.6       takayama 4470:                TT=terms(P,VV|rev=Rev,dic=Dic);
                   4471:                if(TeX==0){
                   4472:                        Pre="("; Post=")";
                   4473:                }else{
                   4474:                        Pre="{"; Post="}";
                   4475:                }
                   4476:                Out = string_to_tb("");
1.70      takayama 4477:                for(L=C=CC=0,Tm=TT;Tm!=[];C++,Tm=cdr(Tm)){
1.6       takayama 4478:                        for(I=0,PC=P,T=cdr(car(Tm)),PW="";T!=[];T=cdr(T),I++){
                   4479:                                PC=mycoef(PC,D=car(T),VV[I]);
                   4480:                                if(PC==0) continue;
                   4481:                                PT="";
                   4482:                                if(D!=0 && VD[I]!=""){
                   4483:                                        if(TeX==0 && PW!="") PW+="*";
                   4484:                                        if(D>1){
                   4485:                                                if(D>9) PT="^"+Pre+rtostr(D)+Post;
                   4486:                                                else    PT="^"+rtostr(D);
                   4487:                                        }
                   4488:                                        if(Dif>0)       PW+=(Dif==1)?"d":"\\partial ";
1.70      takayama 4489:                                        if(Rdic) PW=VD[I]+PT+PW;
                   4490:                                        else PW+=VD[I]+PT;
1.6       takayama 4491:                                }
                   4492:                        }
                   4493:                        D=car(Tm)[0];
                   4494:                        if(Dif>0 && D>0){
                   4495:                                Op=(Dif==1)?"\\frac{d":"\\frac{\\partial";
                   4496:                                if(D>1) Op+="^"+((D>9)?(Pre+rtostr(D)+Post):rtostr(D));
                   4497:                                PW=Op+Add+"}{"+PW+"}";
                   4498:                        }else if(Add!=0) PW=PW+Add;
1.69      takayama 4499:                        CD=0;
1.6       takayama 4500:                        if(TeX>=1){
                   4501:                                if(type(PC)==1 && ntype(PC)==0 && PC<0)
                   4502:                                        OC="-"+my_tex_form(-PC);
                   4503:                                else OC=fctrtos(PC|TeX=1,br=1);
1.69      takayama 4504:                                if(isint(PC)&&(PC<-1||PC>1)) CD=1;
1.6       takayama 4505:                        }else   OC=fctrtos(PC|br=1);
                   4506:                        if(PW!=""){
                   4507:                                if(OC == "1")        OC = "";
                   4508:                                else if(OC == "-1")  OC = "-";
                   4509:                        }
                   4510:                        if(TeX==0 && D!=0 && OC!="" && OC!="-") PW= "*"+PW;
                   4511:                        if((TOC=type(OC)) == 4){        /* rational coef. */
                   4512:                                if(Lim>0 && (texlen(OC[0])>Lim || texlen(OC[0])>Lim)){
                   4513:                                        OC = (Small==1)?"("+OC[0]+")/("+OC[1]+")"
                   4514:                                                        :"\\Bigl("+OC[0]+"\\Bigr)\\Bigm/\\Bigl("+OC[1]+"\\Bigr)";
                   4515:                                        TOC = 7;
                   4516:                                }else{
                   4517:                                        if(str_char(OC[0],0,"-")==0){
                   4518:                                                OC = fctrtos(-PC|TeX=1,br=1);
                   4519:                                                OC = "-\\frac{"+OC[0]+"}{"+OC[1]+"}";
                   4520:                                        }
                   4521:                                        else
                   4522:                                                OC = "\\frac{"+OC[0]+"}{"+OC[1]+"}";
                   4523:                                }
                   4524:                        }
                   4525:                        if(Lim>0){
1.70      takayama 4526:                                CC++;
1.6       takayama 4527:                                LL=texlen(OC)+texlen(PW);
                   4528:                                if(LL+L>=Lim){
                   4529:                                        if(L>0) str_tb(CR,Out);
                   4530:                                        if(LL>Lim){
1.70      takayama 4531:                                                if(TOC==7)      OC=texlim(OC,Lim|cut=[CR,CR2]);
1.73      takayama 4532:                                                if(length(Tm)!=1) PW+=CR;
                   4533:                                                L=0;
1.6       takayama 4534:                                        }else L=LL;
                   4535:                                }else L+=LL;
1.70      takayama 4536:                        }else if(length(Tm)!=1){
                   4537:                                CC++;
                   4538:                                PW += CR;       /* not final term */
                   4539:                        }
                   4540:                        if(CC>TeXPages) CR=CR2;
1.69      takayama 4541:                        if(TeX){
                   4542:                                OC=texsp(OC);
                   4543:                                if(CD){  /* 2*3^x */
                   4544:                                        CD=strtoascii(str_cut(PW,0,1));
                   4545:                                        if(length(CD)==2&&car(CD)==123&&isnum(CD[1])) OC+="\\cdots";
                   4546:                                }
                   4547:                        }
1.6       takayama 4548:                        if(str_chr(OC,0,"-") == 0 || C==0)      str_tb([OC,PW], Out);
                   4549:                        else{
                   4550:                                str_tb(["+",OC,PW],Out);
                   4551:                                if(LL<=Lim) L++;
                   4552:                        }
                   4553:                }
                   4554:                S=str_tb(0,Out);
                   4555:                if(S=="") S="0";
                   4556:        }else{          /* Var is not specified */
                   4557:                if((TP=type(P)) == 3){  /* rational function */
                   4558:                        P = red(P); Nm=nm(P); Dn=dn(P);
                   4559:                        Q=dn(ptozp(Nm|factor=1)[1]);
                   4560:                        if(Q>1){
                   4561:                                Nm*=Q;Dn*=Q;
                   4562:                        }
                   4563:                        if(TeX>0){
                   4564:                                return (TeX==2)?
                   4565:                                "\\frac\{"+fctrtos(Nm|TeX=1)+"\}\{"+fctrtos(Dn|TeX=1)+"\}"
                   4566:                                :[fctrtos(Nm|TeX=1),fctrtos(Dn|TeX=1)];
                   4567:                        }
                   4568:                        else{
                   4569:                                S=fctrtos(Nm);
                   4570:                                if(nmono(Nm)>1) S="("+S+")";
                   4571:                                return S+"/("+fctrtos(Dn)+")";
                   4572:                        }
                   4573:                }
                   4574:                if(imag(P)==0) P = fctr(P);             /* usual polynomial */
                   4575:                else P=[[P,1]];
                   4576:                S = str_tb(0,0);
1.69      takayama 4577:                for(J = N = CD = 0; J < length(P); J++){
                   4578:                        if(type(V=P[J][0]) <= 1){
                   4579:                                if(V == -1){
1.6       takayama 4580:                                        write_to_tb("-",S);
                   4581:                                        if(length(P) == 1)
                   4582:                                                str_tb("1", S);
1.69      takayama 4583:                                }else if(V != 1){
                   4584:                                        str_tb((TeX>=1)?my_tex_form(V):rtostr(V), S);
1.6       takayama 4585:                                        N++;
                   4586:                                }else if(length(P) == 1)
                   4587:                                        str_tb("1", S);
                   4588:                                else if(getopt(br)!=1 && length(P) == 2 && P[1][1] == 1){
                   4589:                                        str_tb((TeX>=1)?my_tex_form(P[1][0]):rtostr(P[1][0]), S);
                   4590:                                        J++;
                   4591:                                }
1.69      takayama 4592:                                if(J==0&&isint(V=P[J][0])&&(V<-1||V>1)) CD=1;
1.6       takayama 4593:                                continue;
                   4594:                        }
                   4595:                        if(N > 0 && TeX != 1 && TeX != 2 && TeX != 3)
                   4596:                                write_to_tb("*", S);
                   4597:                        SS=(TeX>=1)?my_tex_form(P[J][0]):rtostr(P[J][0]);
                   4598:                        N++;
                   4599:                        if(P[J][1] != 1){               /* (log(x))^2 */
                   4600:                                if(nmono(P[J][0])>1||
                   4601:                                        (!isvar(P[J][0])||vtype(P[J][0]))&&str_len(SS)>1) SS="("+SS+")";
                   4602:                                write_to_tb(SS,S);
1.70      takayama 4603:                                str_tb(["^", (TeX>=1)?rtotex(P[J][1]):monotos(P[J][1])],S);
1.6       takayama 4604:                        }else{
1.70      takayama 4605:                                if(nmono(P[J][0])>1&&length(P)>1) SS="("+SS+")";
1.69      takayama 4606:                                else if(CD&&J==1){ /* 2*3^x */
                   4607:                                        CD=strtoascii(str_cut(SS,0,1));
                   4608:                                        if(length(CD)==2&&car(CD)==123&&isnum(CD[1])) SS="\\cdot"+SS;
                   4609:                                }
1.6       takayama 4610:                                write_to_tb(SS,S);
                   4611:                        }
                   4612:                }
                   4613:                S = str_tb(0,S);
1.70      takayama 4614:                if((Lim>0 || TP!=2) && CR!="")  S=texlim(S,Lim|cut=[CR,CR2]);
1.6       takayama 4615:        }
                   4616:        if(TeX>0){
                   4617:                if(Small==1)    S=str_subst(S,"\\frac{","\\tfrac{");
                   4618:                if(Dvi==1){
1.70      takayama 4619:                        dviout(strip(S,"(",")")|eq=(Pages==1||Pages==2)?6:0); S=1;
1.6       takayama 4620:                }
                   4621:        }
                   4622:        return S;
                   4623: }
                   4624:
                   4625: def strip(S,S0,S1)
                   4626: {
                   4627:        SS=strtoascii(S);
                   4628:        if(length(SS)>1){
                   4629:                if(SS[0]==40&&SS[length(SS)-1]==41&&str_pair(SS,1,S0,S1)==length(SS)-1)
                   4630:                        S=str_cut(SS,1,length(SS)-2);
                   4631:        }
                   4632:        return S;
                   4633: }
                   4634:
                   4635: def texlim(S,Lim)
                   4636: {
                   4637:        /* extern TeXLim;       */
                   4638:        if(S==1 && Lim>10){
                   4639:                TeXLim=Lim;
                   4640:                mycat(["Set TeXLim =",Lim]);
                   4641:                return 1;
                   4642:        }
1.70      takayama 4643:        if(type(Out=getopt(cut))!=7){
                   4644:                if(type(Out)!=4) Out=Out2="\\\\\n&";
                   4645:                else{
                   4646:                        Out2=Out[1];Out=Out[0];
                   4647:                }
                   4648:        }
1.6       takayama 4649:        if(type(Del=getopt(del))!=7)    Del=Out;
                   4650:        if(Lim<30)      Lim=TeXLim;
                   4651:        S=ltov(strtoascii(S));
                   4652:        for(L=[0],I=F=0;F==0; ){
                   4653:                II=str_str(S,Del|top=I)+2;
                   4654:                if(II<2){
                   4655:                        F++;II=/* str_len(S) */ length(S)-1;
                   4656:                }
                   4657:                for(J=JJ=I+1;;JJ=K+1){
                   4658:                        K=str_char(S,JJ,43);    /* + */
                   4659:                        if((K1=str_char(S,JJ,45))>2 && K1<K){   /* - */
                   4660:                                if(S[K1-1]!=123 && S[K1-1]!=40) K=K1;   /* {, ( */
                   4661:                        }
                   4662:                        if((K1=str_char(S,JJ,40))>0 && K1-JJ>6 && K1<K && S[K1-1]!=43 && S[K1-1]!=45){  /* ( */
                   4663:                                T=str_char(S,K1-6,"\\");  /* \Big*(, \big*( */
                   4664:                                if((T==K1-6 || T==K1-5)
                   4665:                                  && (str_str(S,"big"|top=T+1,end=T+1)>0 || str_str(S,"Big"|top=T+1,end=T+1)>0))
                   4666:                                        K=T;
                   4667:                                else if(K1>0 && K1<K) K=K1;
                   4668:                        }
                   4669:                        if(K<0 || K>II) break;
                   4670:                        if(K-J>Lim && texlen(str_cut(S,J,K-1))>=Lim){
                   4671:                                J=K+1; L=cons(JJ-1,L); SL=0;
                   4672:                        }
                   4673:                }
                   4674:                I=II;
                   4675:        }
                   4676:        SS=str_tb(0,0);
                   4677:        L=cons(length(S),L);
                   4678:        L=reverse(L);
1.70      takayama 4679:        if(length(L)>TeXPages) Out=Out2;
1.6       takayama 4680:        for(I=0; L!=[]; I=J,L=cdr(L)){
                   4681:                str_tb((I==0)?"":Out,SS);
                   4682:                J=car(L);
                   4683:                str_tb(str_cut(S,I,J-1),SS);
                   4684:        }
                   4685:        return str_tb(0,SS);
                   4686: }
                   4687:
                   4688: def fmult(FN,M,L,N)
                   4689: {
                   4690:        Opt=getopt();
                   4691:        for(I = 0; I < length(M); I++)
                   4692:                M = call(FN, cons(M,cons(L[I],N))|option_list=Opt);
                   4693:        return M;
                   4694: }
                   4695:
                   4696: def radd(P,Q)
                   4697: {
                   4698:        if(type(P) <= 3 || type(Q) <= 3){
                   4699:                if(type(P) >= 5)
                   4700:                         return radd(Q,P);
                   4701:                if(type(Q) >= 5){
                   4702:                        R = dupmat(Q);
                   4703:                        if(P == 0)
                   4704:                                return R;
                   4705:                        if(type(Q) == 6){
                   4706:                                S = size(Q);
                   4707:                                if(S[0] != S[1])
                   4708:                                        return 0;
                   4709:                                for(I = 0; I < S[0]; I++)
                   4710:                                        R[I][I]  = radd(R[I][I], P);
                   4711:                        }else{
                   4712:                                for(I = length(R)-1; I >= 0; I--)
                   4713:                                        R[I] = radd(R[I],P);
                   4714:                        }
                   4715:                        return R;
                   4716:                }
                   4717:                /* P=red(P);Q=red(Q); */
                   4718:                if((P1=dn(P)) == (Q1=dn(Q))){
                   4719:                        if(P1==1) return P+Q;
                   4720:                        return red((nm(P)+nm(Q))/P1);
                   4721:                }
                   4722:                R=gcd(P1,Q1);S=tdiv(P1,R);
                   4723:                return red((nm(P)*tdiv(Q1,R)+nm(Q)*S)/(S*Q1));
                   4724:        }
                   4725:        if(type(P) == 5){
                   4726:                S = length(P);
                   4727:                R = newvect(S);
                   4728:                for(I = 0; I < S; I++)
                   4729:                        R[I] = radd(P[I],Q[I]);
                   4730:                return R;
                   4731:        }
                   4732:        if(type(P) == 6){
                   4733:                S = size(P);
                   4734:                R = newmat(S[0],S[1]);
                   4735:                for(I = 0; I < S[0]; I++){
                   4736:                        for(J = 0; J < S[1]; J++)
                   4737:                                R[I][J] = radd(P[I][J],Q[I][J]);
                   4738:                }
                   4739:                return R;
                   4740:        }
                   4741:        erno(0);
                   4742: }
                   4743:
                   4744: def getel(M,I)
                   4745: {
                   4746:        if(type(M) >= 4 && type(M) <= 6 && type(I) <= 1)
                   4747:                return M[I];
                   4748:        if(type(M) == 6 && type(I) == 5)
                   4749:                return M[I][J];
                   4750:        return M;
                   4751: }
                   4752:
                   4753: def ptol(P,X)
                   4754: {
                   4755:        F=(getopt(opt)==0)?0:1;
                   4756:        if(type(P) <= 3)
                   4757:                P = [P];
                   4758:        if(type(X) == 4){
                   4759:                for( ; X != []; X = cdr(X))
                   4760:                        P=ptol(P,car(X)|opt=F);
                   4761:                return P;
                   4762:        }
                   4763:        P = reverse(P);
                   4764:        for(R=[]; P != []; P = cdr(P)){
                   4765:                Q = car(P);
                   4766:                for(I = mydeg(Q,X); I >= 0; I--){
                   4767:                        S=mycoef(Q,I,X);
                   4768:                        if(F==1 || S!=0) R = cons(S,R);
                   4769:                }
                   4770:        }
                   4771:        return R;
                   4772: }
                   4773:
                   4774: def rmul(P,Q)
                   4775: {
                   4776:        if(type(P) <= 3 && type(Q) <= 3){
                   4777:                P=red(P);Q=red(Q);
                   4778:                P1=dn(P);P2=nm(P);Q1=dn(Q);Q2=nm(Q);
                   4779:                if(P1==1 && Q1==1)
                   4780:                        return P*Q;
                   4781:                if((R=gcd(P1,Q2)) != 1){
                   4782:                        P1=tdiv(P1,R);Q2=tdiv(Q2,R);
                   4783:                }
                   4784:                if((R=gcd(Q1,P2)) != 1){
                   4785:                        Q1=tdiv(Q1,R);P2=tdiv(P2,R);
                   4786:                }
                   4787:                return P2*Q2/(P1*Q1);
                   4788:        }
                   4789: #ifdef USEMODULE
                   4790:        return mmulbys(os_md.rmul,P,Q,[]);
                   4791: #else
                   4792:        return mmulbys(rmul,P,Q,[]);
                   4793: #endif
                   4794: }
                   4795:
                   4796: def mtransbys(FN,F,LL)
                   4797: {
                   4798:        Opt=getopt();
                   4799:        if(type(F) == 4){
                   4800:                F = ltov(F);
                   4801:                S = length(F);
                   4802:                R = newvect(S);
                   4803:                for(I = 0; I < S; I++)
                   4804:                        R[I] = mtransbys(FN,F[I],LL|option_list=Opt);
                   4805:                return vtol(R);
                   4806:        }
                   4807:        if(type(F) == 5){
                   4808:                S = length(F);
                   4809:                R = newvect(S);
                   4810:                for(I = 0; I < S; I++)
                   4811:                        R[I] = mtransbys(FN,F[I],LL|option_list=Opt);
                   4812:                return R;
                   4813:        }
                   4814:        if(type(F) == 6){
                   4815:                S = size(F);
                   4816:                R = newmat(S[0],S[1]);
                   4817:                for(I = 0; I < S[0]; I++){
                   4818:                        for(J = 0; J < S[1]; J++)
                   4819:                        R[I][J] = mtransbys(FN,F[I][J],LL|option_list=Opt);
                   4820:                }
                   4821:                return R;
                   4822:        }
                   4823:        if(type(F) == 7) return F;
                   4824:        return call(FN, cons(F,LL)|option_list=Opt);
                   4825: }
                   4826:
1.58      takayama 4827: def trcolor(S)
                   4828: {
                   4829:        if(type(S)!=7) return S;
                   4830:        return ((I=findin(S,LCOPT))>=0)?COLOPT[I]:0;
                   4831: }
                   4832:
1.61      takayama 4833: def mcolor(L,P)
                   4834: {
                   4835:        if(type(L)!=4) return L;
                   4836:        if(!P||(S=length(L))==1){
                   4837:                if(type(V=car(L))!=7) return V;
                   4838:                return trcolor(V);
                   4839:        }
                   4840:        P-=ceil(P)-1;
                   4841:        if(P==1){
                   4842:                if(type(V=L[S-1])!=7) return V;
                   4843:                return trcolor(V);
                   4844:        }
                   4845:        for(S=P*(S-1);S>1;S--,L=cdr(L));
                   4846:        if(getopt(disc)==1) S=0;
                   4847:        if(type(L0=L[0])==7) L0=trcolor(L0);
                   4848:        if(type(L1=L[1])==7) L1=trcolor(L1);
                   4849:        T=rint(iand(L0,0xff)*(1-S)+iand(L1,0xff)*S);
                   4850:        TT=iand(L0,0xff00)*(1-S)+iand(L1,0xff00)*S;
                   4851:        T+=rint(TT/0x100)*0x100;
                   4852:        TT=iand(L0,0xff0000)*(1-S)+iand(L1,0xff0000)*S;
                   4853:        return T+rint(TT/0x10000)*0x10000;
                   4854: }
                   4855:
1.6       takayama 4856: def drawopt(S,T)
                   4857: {
                   4858:        if(type(S)!=7) return -1;
                   4859:        if(T==0||T==1){
                   4860:                for(I=0,R=LCOPT;I<7;I++,R=cdr(R))
                   4861:                        if(str_str(S,car(R))>=0) return(T==0)?COLOPT[I]:car(R);
                   4862:                return -1;
                   4863:        }
                   4864:        if(T==2){
                   4865:                V0=V1=0;
                   4866:                for(I=0,R=LPOPT;R!=[];I++,R=cdr(R)){
                   4867:                        if(str_str(S,car(R))>=0){
                   4868:                                if(I==0) V1++;
                   4869:                                else if(I==1) V1--;
                   4870:                                else if(I==2) V0--;
                   4871:                                else V0++;
                   4872:                        }
                   4873:                }
                   4874:                if(V0==0&&V1==0) return -1;
                   4875:                return [V0,V1];
                   4876:        }
                   4877:        if(T==3){
                   4878:                V=0;
                   4879:                for(I=1,R=LFOPT;R!=[];R=cdr(R),I*=2){
                   4880:                        if(str_str(S,car(R))>=0) V+=I;
                   4881:                }
                   4882:                return (V==0)?-1:V;
                   4883:        }
                   4884:        return -1;
                   4885: }
                   4886:
1.58      takayama 4887: def openGlib(W)
                   4888: {
                   4889:        extern Glib_canvas_x;
                   4890:        extern Glib_canvas_y;
                   4891:        extern Glib_math_coordinate;
                   4892:
                   4893:        if(W==0){
                   4894:                glib_clear();
                   4895:                return;
                   4896:        }
                   4897:        if(type(W)==4&&length(W)==2){
                   4898:                Glib_canvas_x=W[0];
1.67      takayama 4899:                Glib_canvas_y=W[1];
1.58      takayama 4900:        }
                   4901:        Glib_math_coordinate=1;
                   4902:        if(getopt(null)!=1) return glib_open();
                   4903: }
                   4904:
1.6       takayama 4905: def execdraw(L,P)
                   4906: {
                   4907:        if((Proc=getopt(proc))!=1) Proc=0;
                   4908:        if(type(P)<2) P=[P];
                   4909:        if(L!=[]&&type(L[0])!=4) L=[L];
                   4910:                /* special command */
                   4911:        if(P[0]<0){
                   4912:                if(length(P)==1&&(P[0]==-1||P[0]==-2||P[0]==-3)){       /* Bounding Box */
                   4913:                        W=WS=N=LS=0;
                   4914:                        for(LL=L;LL!=[];LL=cdr(LL)){
                   4915:                                T=car(LL);
                   4916:                                if(P[0]!=-3 && T[0]==0){
                   4917:                                        if(length(T)>3) S="  by "+rtostr(T[3])+" cm";
                   4918:                                        else S="";
                   4919:                                        if(P[0]==-1){
                   4920:                                                mycat(["Windows : ",T[1][0],"< x <",T[1][1],", ",
                   4921:                                                        T[2][0],"< y <",T[2][1],S]);
                   4922:                                                if(length(T)>4 && type(T[4])==4) mycat(["ext :",T[4]]);
                   4923:                                                if(length(T)>5) mycat(["shift :",T[5]]);
                   4924:                                        }
                   4925:                                        return cdr(T);
                   4926:                                }
                   4927:                                if(type(T[0])==1){
                   4928:                                        if(T[0]==1){
                   4929:                                                for(TT=cdr(cdr(T));TT!=[];TT=cdr(TT)){
                   4930:                                                        D=car(TT);
                   4931:                                                        if(type(D[0][0])==4){
                   4932:                                                                for(DT=D;DT!=[];DT=cdr(DT)){
                   4933:                                                                        if(N++==0) W=ptbbox(car(DT));
                   4934:                                                                        else W=ptbbox(car(DT)|box=W);
                   4935:                                                                }
                   4936:                                                        }else{
                   4937:                                                                if(N++==0) W=ptbbox(D);
                   4938:                                                                else W=ptbbox(D|box=W);
                   4939:                                                        }
                   4940:                                                }
                   4941:                                        }else if(T[0]==2){
                   4942:                                                V=T[2];
                   4943:                                                if(type(V[0])>1||type(V[1])>1) continue;  /* not supported */
                   4944:                                                if((Sc=delopt(T[1],"scale"|inv=1))!=[]){
                   4945:                                                        Sc=car(Sc)[1];
                   4946:                                                        if(type(Sc)==1) V=[Sc*V[0],Sc*V[1]];
                   4947:                                                        else V=[Sc[0]*V[0],Sc[1]*V[1]];
                   4948:                                                }
                   4949:                                                if(LS==0) WS=ptbbox([V]);
                   4950:                                                else WS=ptbbox([V]|box=WS);
                   4951:                                                if(length(T)>4) S=T[4];
                   4952:                                                else if(type(S=T[3])==4){
                   4953:                                                        S=S[0];
                   4954:                                                        if(type(S)==4) S=S[length(S)-1];
                   4955:                                                        S=rtostr(S);
                   4956:                                                }
                   4957:                                                if(str_len(S)>LS) LS=str_len(S);
                   4958:                                        }else if(T[0]==3||T[0]==4){
                   4959:                                                if(N++==0) W=ptbbox(cdr(cdr(T)));
                   4960:                                                else W=ptbbox(cdr(cdr(T))|box=W);
                   4961:                                        }
                   4962:                                }
                   4963:                        }
                   4964:                        if(W!=0&&WS!=0) W=ptbbox([W,WS]|box=1);
                   4965:                        return (P[0]==-3)?[W,LS,WS]:W;
                   4966:                }else if(length(P)>1&&P[0]==-1){        /* set Bounding Box */
                   4967:                        P=cons(0,cdr(P));
                   4968:                        Ex=Sft=[0,0];
                   4969:                        if(type(X=getopt(ext))==4) Ex=X;
                   4970:                        if(type(X=getopt(shift))==4) Sft=X;
                   4971:                        if(Ex!=Sft||Ex!=[0,0]){
                   4972:                                if(Sft==[0,0]) Sft=[Ex];
                   4973:                                else Sft=[Ex,Sft];
                   4974:                                if(length(P)==3) Sft=cons(1,Sft);
                   4975:                                if(length(P)==3||length(P)==4) P=append(P,Sft);
                   4976:                        }
                   4977:                        return cons(P,delopt(L,0));
                   4978:                }
                   4979:                if(P[0]==-4){
                   4980:                        for(N=0,LT=L;LT!=[];LT=cdr(LT)){        /* count coord. */
                   4981:                                T=car(LT);
                   4982:                                if(T[0]==1){
                   4983:                                        for(T=cdr(cdr(T));T!=[];T=cdr(T)){
                   4984:                                                if(type((S=car(T))[0][0])==4) N+=length(S);
                   4985:                                                else for(;S!=[];S=cdr(S)) if(type(car(S))==4) N++;
                   4986:                                        }
                   4987:                                }else if(T[0]==2) N++;
                   4988:                                else if(T[0]==3||T[0]==4) N+=2;
                   4989:                        }
                   4990:                        return N;
                   4991:                }
                   4992:                if(P[0]==-5){                                           /* functions */
                   4993:                        for(N=0,R=[],LT=L;LT!=[];LT=cdr(LT)){
                   4994:                                T=car(LT);
                   4995:                                if(T[0]==0) N=ior(N,1);
                   4996:                                else if(type(T[0])==1){
                   4997:                                        if(T[0]>0) N=ior(N,2^T[0]);
                   4998:                                }
                   4999:                                else if(Type(T[0])==2){
                   5000:                                        if(findin(T[0],R)<0) R=cons(T[0],R);
                   5001:                                }
                   5002:                        }
                   5003:                        for(I=5;I>=0;I--) if(iand(N,2^I)) R=cons(I,R);
                   5004:                        return R;
                   5005:                }
                   5006:                return 0;
                   5007:        }
                   5008:
                   5009:        if(length(P)>1){
                   5010:                if(type(P[1])==6||(type(P[1])<2&&P[1]>0)) M=P[1];
                   5011:                else if(type(P[1])==4&&length(P[1])==2) M=diagm(2,P[1]);
                   5012:        }
                   5013:        if(length(P)>2&&type(P[2])==4){
                   5014:                Org=[["shift",P[2]]];
                   5015:                if(M==0) M=1;
                   5016:        }else Org=[];
                   5017:        if(P[0]==0||(type(P[0])==4&&P[0][0]==0)){               /* Risa/Asir */
                   5018:                PP=car(P);PPP=0;
                   5019:                if(type(PP)!=4) PP=[PP];
                   5020:                if(length(PP)<3){
                   5021:                        if(length(PP)==1 || type(PP[1])==4){
                   5022:                                if(ID_PLOT<0) ID_PLOT=ox_launch_nox(0,"ox_plot");
                   5023:                                Id=ID_PLOT;
                   5024:                                if(length(PP)==1&&type(Canvas)==4&&length(Canvas)==2)
                   5025:                                        PP=cons(PP[0],[Canvas]);
                   5026:                                if(length(PP)>1){
                   5027:                                        PPP=PP[1][0];
                   5028:                                        PPQ=(length(PP[1])==2)?PP[1][1]:PPP;
                   5029:                                        open_canvas(Id,[PPP,PPQ]);
                   5030:                                }else open_canvas(Id);
                   5031:                                Ind=ox_pop_cmo(Id);
                   5032:                        }else{
                   5033:                                Ind=PP[1];
                   5034:                                if(getopt(cl)==1) clear_canvas(Id,Ind);
                   5035:                        }
                   5036:                }else{
                   5037:                        Id=PP[1];Ind=PP[2];
                   5038:                        if(length(PP)>3 && type(PP[3])==1) PPP=PP[3];
                   5039:                        if(length(PP)>4 && type(PP[4])==1) PPQ=PP[4];
                   5040:                        if(getopt(cl)==1) clear_canvas(Id,Ind);
                   5041:                }
                   5042:                if(L==[]) return (PPP>0)? [0,Id,Ind,PPP,PPQ]:[0,Id,Ind];
                   5043:                Ex0=Ex0;Sft=[0,0];
                   5044:                if(length(P)>1&&P[1]==0&&length(P)<4){
                   5045:                        R=execdraw(L,-3);
                   5046:                        Ex0=Ex1=Ex2=10;
                   5047:                        if((U=R[1])>0){         /* string */
                   5048:                                if(U>20) U=16;                                  /* adj 16,8,2,7,15 */
                   5049:                                if(R[0][0][0]>R[2][0][0]-(R[0][0][1]-R[0][0][0])/256) Ex0+=8*U; /* adj 256 */
                   5050:                                else Ex0+=2*U;
                   5051:                                if(R[0][0][1]<R[2][0][1]+(R[0][0][1]-R[0][0][0])/256) Ex1+=7*U;
                   5052:                                else Ex1+=2*U;
                   5053:                                if(R[0][1][1]<R[2][1][1]+(R[0][1][1]-R[0][1][0])/256) Ex2+=15;
                   5054:                        }
                   5055:                        R=[R[0][0],R[0][1],0,[Ex0,Ex1],[0,-Ex2]];
                   5056:                        if(length(P)>2 && P[2]==1)
                   5057:                                mycat0(["Box:",[R[0],R[1]], ",  ext=",R[3],",  shift=",R[4]],1);
                   5058:                }else R=execdraw((length(P)>3)?P[3]:L,-2);      /* Windows */
                   5059:                XW=R[0];YW=R[1];
                   5060:                if(length(R)>3){
                   5061:                        if(R[3]!=0 && R[3]!=[0,0]) Ex=R[3];
                   5062:                        if(length(R)>4) Sft=R[4];
                   5063:                }
                   5064:                if(type(X=getopt(ext))==4)
                   5065:                        Ex=(Ex0)?[X[0]+Ex[0],X[1]+Ex[1]]:X;
                   5066:                if(type(M)<2){
                   5067:                        if(length(P)>1&&type(P[1])==1) M=P[1];
                   5068:                        else if((length(P)==1||P[1]==0||P[1]==1)&& PPP>0) M=PPP;
                   5069:                        if(M<2) M=400;
                   5070:                        if(Ex!=0 && type(Ex)==4){
                   5071:                                M-=Ex[0]+Ex[1];
                   5072:                        }
                   5073:                        M=(M/(XW[1]-XW[0]))*diagm(2,[1,-1]);
                   5074:                }
                   5075:                if(type(X=getopt(shift))==4) Sft=(Ex0)?[Sft[0]+X[0],Sft[1]+X[1]]:X;
                   5076:                if(type(Sft)==4) Sft=[Sft[0],-Sft[1]];
                   5077:                if(Ex!=0) Sft=[Sft[0]+Ex[0],Sft[1]];
                   5078:                Org=[["shift",ptaffine(M,[-XW[0],-YW[1]]|shift=Sft)]];
                   5079:                for(CT=0;CT<2;CT++){
                   5080:                  for(LT=L;LT!=[];LT=cdr(LT)){
                   5081:                        T=car(LT);
                   5082:                        if(!CT && T[0]!=2) continue;
                   5083:                        if(CT && T[0]==2) continue;
                   5084:                        if(T[0]==1){
                   5085:                                for(TT=cdr(cdr(T));TT!=[];TT=cdr(TT)){
                   5086:                                        D=car(TT);
                   5087:                                        if(type(D[0][0])==4){
                   5088:                                                for(DT=D;DT!=[];DT=cdr(DT)){
                   5089:                                                        V=car(DT);
                   5090:                                                        if(M) V=ptaffine(M,V|option_list=Org);
                   5091:                                                        draw_bezier(Id,Ind,V|option_list=T[1]);
                   5092:                                                }
                   5093:                                        }else{
                   5094:                                                if(M) D=ptaffine(M,D|option_list=Org);
                   5095:                                                draw_bezier(Id,Ind,D|option_list=T[1]);
                   5096:                                        }
                   5097:                                }
                   5098:                        }else if(T[0]==2){      /* put */
                   5099:                                if(length(T)<4) continue;
                   5100:                                V=T[2];
                   5101:                                if(type(VLB)==4&&V[0]=="_") V=VLB;
                   5102:                                else if(type(V[0])>1||type(V[1])>1) continue;   /* not supported */
                   5103:                                if(length(T)>3&&type(T[3])==4&&length(T[3])>1&&T[3][1]==1) VLB=V;
                   5104:                                F++;MM=M;
                   5105:                                if((Sc=delopt(T[1],"scale"|inv=1))!=[]){
                   5106:                                        if(!MM) MM=1;
                   5107:                                        Sc=car(Sc)[1];
                   5108:                                        if(type(Sc)==1) MM=MM*Sc;
                   5109:                                        else if(type(Sc)==6) MM=MM*diagm(2,Sc);
                   5110:                                }
                   5111:                                if(MM) V=ptaffine(MM,V|option_list=Org);
                   5112:                                if(type(S=S0=T[3])==4) S=S0[0];
                   5113:                                if(length(T)>4) S=T[4];                                         /* subst. string */
                   5114:                                if(type(S0)==4&&type(S0[0])==4){
                   5115:                                        if((Col=drawopt(S0[0][0],0))<0) Col=0;  /* attrib. */
                   5116:                                        if(type(S)!=7) S=rtostr(S0[0][1]);
                   5117:                                        S=str_subst(S,[["$\\bullet$","*"],["$\\times$","x"],["$",""]],0);
                   5118:                                        if(type(Pos=drawopt(S0[0][0],2))==4)
                   5119:                                                V=[V[0]+4*str_len(S)*Pos[0],V[1]-10*Pos[1]]; /* adjustable */
                   5120:                                }else S=str_subst(rtostr(S),[["$\\bullet$","*"],["$\\times$","x"],["$",""]],0);
                   5121:                                V=[V[0]-str_len(S)*4,V[1]-8];   /* adjustable */
                   5122:                                draw_string(Id,Ind,V,S,Col);
                   5123:                        }else if(T[0]==3){      /* arrow */
                   5124:                                F++;
                   5125:                                T1=T[2];T2=T[3];
                   5126:                                if(M){
                   5127:                                        T1=ptaffine(M,T1|option_list=Org);
                   5128:                                        T2=ptaffine(M,T2|option_list=Org);
                   5129:                                }
                   5130:                                draw_bezier(Id,Ind,[T1,T2]|option_list=T[1]);
                   5131:                        }else if(T[0]==4){      /* line */
                   5132:                                F++;
                   5133:                                T1=T[2];T2=T[3];
                   5134:                                if(M){
                   5135:                                        T1=ptaffine(M,T1|option_list=Org);
                   5136:                                        T2=ptaffine(M,T2|option_list=Org);
                   5137:                                }
                   5138:                                V=delopt(T1=T[1],"opt"|inv=1);
                   5139:                                if(V!=[]&&str_str(V[1],".")>=0)
                   5140:                                        T1=cons(["opt",cons("dotted,",V[1])],delopt(T1,"opt"));
                   5141:                                draw_bezier(Id,Ind,[T1,T2]|option_list=T1);
                   5142:                        }else if(T[0]==5){      /* TeX */
                   5143:                                mycat(rtostr(T[2]));
                   5144:                                if(F){
                   5145:                                        S=str_tb(0,Out);
                   5146:                                        Out=str_tb(0,0);
                   5147:                                        F=0;
                   5148:                                        if(S!=""){
                   5149:                                                if(P[0]==2) dviout(xyproc(S)|keep=1);
                   5150:                                                else LOut=cons(xyproc(S),LOut);
                   5151:                                        }
                   5152:                                        if(P[0]==2)     dviout(T[2]|option_list=T[1]);
                   5153:                                        else{
                   5154:                                                LOut=cons(T[2],Out);
                   5155:                                        }
                   5156:                                }
1.57      takayama 5157:                        }else if(T[0]==6){      /* plot */
                   5158:                                F++;
                   5159:                                if((T1=findin(T[1],LCOPT))>-1) T1=COLOPT(T1);
                   5160:                                else if(type(T1)!=1 && T1!=0) T1=0xffffff;
                   5161:                                for(T2=ptaffine(M,T[2]|option_list=Org);T2!=[];T2=cdr(T2))
                   5162:                                        draw_obj(Id,Ind,[rint(car(T2)[0]),rint(car(T2)[1])],T1);
1.6       takayama 5163:                        }else if(Proc==1&&type(T[0])==2){
                   5164:                                if(length(T)<3) call(T[0],T[1]);
                   5165:                                else call(T[0],T[1]|option_list=T[2]);
                   5166:                        }
                   5167:                }
                   5168:          }
                   5169:          S=(PPP>0)? [0,Id,Ind,PPP,PPQ]:[0,Id,Ind];
                   5170:          if(Ex==0&&Sft!=[0,0]) Ex=[0,0];
                   5171:          return (Ex!=0&&length(P)>2&&P[2]==-1)?
                   5172:                [S,0,0,[0,R[0],R[1],0,Ex,[Sft[0]-Ex[0],-Sft[1]]]]:S;
                   5173:        }
                   5174:        if(P[0]==1||P[0]==2){   /* TeX */
                   5175:                Out=str_tb(0,0);LOut=[];F=0;
                   5176:                if(getopt(cl)==1) dviout0(0);
                   5177:                for(;L!=[];L=cdr(L)){
                   5178:                        T=car(L);Opt=T[1];
                   5179:                        if(type(T[0])>=2) continue;
                   5180:                        if(T[0]==0){
                   5181:                                XW=T[1];YW=T[2];
                   5182:                                if(length(P)>1&&type(P[1])==1&&P[1]<0)
                   5183:                                        M=-P[1]/(XW[0]-XW[1]);
                   5184:                        }else if(T[0]==1){
                   5185:                                F++;
                   5186:                                for(TT=cdr(cdr(T));TT!=[];TT=cdr(TT)){
                   5187:                                        D=car(TT);
                   5188:                                        if(type(D[0][0])==4){
                   5189:                                                for(DT=D;DT!=[];DT=cdr(DT)){
                   5190:                                                        V=car(DT);
                   5191:                                                        if(M) V=ptaffine(M,V|option_list=Org);
                   5192:                                                        str_tb(xybezier(V|option_list=Opt),Out);
                   5193:                                                }
                   5194:                                        }else{
                   5195:                                                if(M) D=ptaffine(M,D|option_list=Org);
                   5196:                                                str_tb(xybezier(D|option_list=Opt),Out);
                   5197:                                        }
                   5198:                                }
                   5199:                        }else if(T[0]==2){
                   5200:                                F++;V=T[2];
                   5201:                                Opt=delopt(Opt,"scale"|inv=1);
                   5202:                                MM=M;
                   5203:                                if(Opt!=[]){
                   5204:                                        Opt=car(Opt)[1];
                   5205:                                        if(type(Opt)==1) Opt=[Opt,Opt];
                   5206:                                        if(Opt!=[1,1]){
                   5207:                                                if(!MM) MM=1;
                   5208:                                                MM=MM*diagm(2,[Opt[0],Opt[1]]);
                   5209:                                        }
                   5210:                                }
                   5211:                                if(MM) V=ptaffine(MM,V|option_list=Org);
1.74    ! takayama 5212:                                if(length(T)>3){
        !          5213:                                        if(type(T2=T[3])==7) T2=[T2];
        !          5214:                                        V=append(V,T2);
        !          5215:                                }
1.6       takayama 5216:                                str_tb(xyput(V),Out);
                   5217:                        }else if(T[0]==3){
                   5218:                                F++;
                   5219:                                T1=T[2];T2=T[3];
                   5220:                                if(M){
                   5221:                                        T1=ptaffine(M,T1|option_list=Org);
                   5222:                                        T2=ptaffine(M,T2|option_list=Org);
                   5223:                                }
                   5224:                                str_tb(xyarrow(T1,T2|option_list=Opt),Out);
                   5225:                        }else if(T[0]==4){
                   5226:                                F++;
                   5227:                                T1=T[2];T2=T[3];
                   5228:                                if(M){
                   5229:                                        T1=ptaffine(M,T1|option_list=Org);
                   5230:                                        T2=ptaffine(M,T2|option_list=Org);
                   5231:                                }
                   5232:                                str_tb(xyline(T1,T2|option_list=Opt),Out);
                   5233:                        }else if(T[0]==5){
                   5234:                                if(F){
                   5235:                                        S=str_tb(0,Out);
                   5236:                                        Out=str_tb(0,0);
                   5237:                                        F=0;
                   5238:                                        if(S!=""){
                   5239:                                                if(P[0]==2) dviout(xyproc(S)|keep=1);
                   5240:                                                else LOut=cons(xyproc(S),LOut);
                   5241:                                        }
                   5242:                                        if(P[0]==2)     dviout(T[2]|option_list=T[1]);
                   5243:                                        else LOut=cons(T[2],Out);
                   5244:                                }
1.57      takayama 5245:                        }else if(T[0]==6){      /* plot */
                   5246:                                F++;
                   5247:                                if(type(T[1])==7) T1=[T[1],"."];
                   5248:                                else T1=".";
                   5249:                                for(T2=ptaffine(M,T[2]|option_list=Org);T2!=[];T2=cdr(T2))
                   5250:                                        str_tb(xypos([car(T2)[0],car(T2)[1],T1]),Out);
1.6       takayama 5251:                        }else if(T[0]==-2)
                   5252:                                str_tb(["%",T[1],"\n"],Out);
1.57      takayama 5253:                         else if(Proc==1&&type(T[0])==2){
1.6       takayama 5254:                                if(length(T)<3) call(T[0],T[1]);
                   5255:                                else call(T[0],T[1]|option_list=T[2]);
                   5256:                        }
                   5257:                }
                   5258:                S=str_tb(0,Out);
                   5259:                if(P[0]==1){
                   5260:                        if(F) LOut=cons(xyproc(S),LOut);
                   5261:                        Out=str_tb(0,0);
                   5262:                        for(L=reverse(LOut);L!=[];L=cdr(L))
                   5263:                                str_tb(car(L),Out);
                   5264:                        return str_tb(0,Out);
                   5265:                }
                   5266:                if(F) dviout(xyproc(S));
                   5267:                else dviout(" ");
                   5268:        }
                   5269: }
                   5270:
                   5271: def execproc(L)
                   5272: {
                   5273:        if(type(N=getopt(var))!=1&&N!=0) N=2;
                   5274:        for(R=[];L!=[];L=cdr(L)){
                   5275:                P=car(L);
                   5276:                if(type(P[0])==2&&vtype(P[0])==3){
                   5277:                        if((VS=vars(cdr(P)))!=[]){
                   5278:                                for(I=0;I<N;I++){
                   5279:                                        V=makev(["v",I+1]);
                   5280:                                        if(findin(V,VS)>=0) P=mysubst(P,[V,R[I]]);
                   5281:                                }
                   5282:                        }
                   5283:                        if(length(P)<3) R=cons(call(P[0],P[1]),R);
                   5284:                        else R=cons(call(P[0],P[1]|option_list=P[2]),R);
                   5285:                }
                   5286:        }
                   5287:        return (getopt(all)==1)?R:car(R);
                   5288: }
                   5289:
                   5290: def myswap(P,L)
                   5291: {
                   5292:        X=makenewv(P);
                   5293:        for(L=reverse(L);length(L)>1;L=cdr(L))
                   5294:                P=subst(P,L[0],X,L[1],L[0],X,L[1]);
                   5295:        return P;
                   5296: }
                   5297:
                   5298: def mysubst(P,L)
                   5299: {
                   5300:        if(P==0) return 0;
1.29      takayama 5301:        if(getopt(lpair)==1||(type(L[0])==4&&length(L[0])>2)) L=lpair(L[0],L[1]);
1.6       takayama 5302:        Inv=getopt(inv);
                   5303:        if(type(L[0]) == 4){
                   5304:                while((L0 = car(L))!=[]){
                   5305:                        P = mysubst(P,(Inv==1)?[L0[1],L0[0]]:L0);
                   5306:                        L = cdr(L);
                   5307:                }
                   5308:                return P;
                   5309:        }
                   5310:        if(Inv==1) L=[L[1],L[0]];
                   5311:        if(type(P) > 3){
                   5312:                if(type(P)==7) return P;
                   5313:                if(type(P)>7)
                   5314:                        return subst(P,L[0],L[1]);
                   5315: #ifdef USEMODULE
                   5316:                return mtransbys(os_md.mysubst,P,[L]);
                   5317: #else
                   5318:                return mtransbys(mysubst,P,[L]);
                   5319: #endif
                   5320:        }
                   5321:        P = red(P);
                   5322:        if(type(P) == 3){
                   5323:                A=mysubst(nm(P),L);B=mysubst(dn(P),L);
                   5324:                return red(nm(A)/nm(B))*red(dn(B)/dn(A));
                   5325:        }
                   5326:        L1=(type(L[1])==3)?red(L[1]):L[1];X=L[0];
                   5327:        if(ptype(L1,X)==3){
                   5328:                LN=nm(L1);LD=dn(L1);
                   5329:                Deg=mydeg(P,X);
                   5330:                if(Deg <= 0) return P;
                   5331:                V = newvect(Deg+1);
                   5332:                for(V[I=Deg]=1;I >= 1;I--)
                   5333:                 V[I-1]=V[I]*LD;
                   5334:                for(R = 0, I = Deg; I >= 0; I--)
                   5335:                        R = R*LN + mycoef(P,I,X)*V[I];
                   5336:                return red(R/V[0]);
                   5337:        }
                   5338:        return subst(P,X,L1);
                   5339: }
                   5340:
                   5341: def mmulbys(FN,P,F,L)
                   5342: {
                   5343:        Opt=getopt();
                   5344:        if(type(F) <= 3){
                   5345:                if(type(P) <= 3)
                   5346:                        return call(FN, cons(P,cons(F,L))|option_list=Opt);
                   5347:                if(type(P) == 5){
                   5348:                        S = length(P);
                   5349:                        R = newvect(S);
                   5350:                        for(I = 0; I < S; I++)
                   5351:                                R[I] = call(FN, cons(P[I],cons(F,L))|option_list=Opt);
                   5352:                        return R;
                   5353:                }else if(type(P) == 6){
                   5354:                        S = size(P);
                   5355:                        R = newmat(S[0],S[1]);
                   5356:                        for(I = 0; I < S[0]; I++){
                   5357:                                for(J = 0; J < S[1]; J++)
                   5358:                                        R[I][J] = call(FN, cons(P[I][J],cons(F,L))|option_list=Opt);
                   5359:                        }
                   5360:                        return R;
                   5361:                }
                   5362:        }
                   5363:        if(type(F) == 5){
                   5364:                S = length(F);
                   5365:                if(type(P) <= 3){
                   5366:                        R = newvect(S);
                   5367:                        for(I = 0; I < S; I++)
                   5368:                                R[I] = call(FN, cons(P,cons(F[I],L))|option_list=Opt);
                   5369:                        return R;
                   5370:                }
                   5371:                if(type(P) == 5){
                   5372:                        for(J=R=0; J<S; J++)
                   5373:                                R = radd(R, call(FN, cons(P[J],cons(F[J],L)))|option_list=Opt);
                   5374:                        return R;
                   5375:                }
                   5376:                T = size(P);
                   5377:                R = newvect(T[0]);
                   5378:                for(I = 0; I < T[0]; I++){
                   5379:                        for(J = 0; J < S; J++)
                   5380:                                R[I] = radd(R[I], call(FN, cons(P[I][J],cons(F[J],L))|option_list=Opt));
                   5381:                }
                   5382:                return R;
                   5383:        }
                   5384:        if(type(F) == 6){
                   5385:                S = size(F);
                   5386:                if(type(P) <= 3){
                   5387:                        R = newmat(S[0],S[1]);
                   5388:                        for(I = 0; I < S[0]; I++){
                   5389:                                for(J = 0; J < S[1]; J++)
                   5390:                                        R[I][J] = call(FN, cons(P,cons(F[I][J],L))|option_list=Opt);
                   5391:                        }
                   5392:                        return R;
                   5393:                }
                   5394:                if(type(P) == 5){
                   5395:                        R = newvect(S[1]);
                   5396:                        for(J = 0; J < S[1]; J++){
                   5397:                                for(K = U = 0; K < S[0]; K++)
                   5398:                                        U = radd(U, call(FN, cons(P[K],cons(F[K][J],L))|option_list=Opt));
                   5399:                                R[J] = U;
                   5400:                        }
                   5401:                        return R;
                   5402:                }
                   5403:                T = size(P);
                   5404:                R = newmat(T[0],S[1]);
                   5405:                for(I = 0; I < T[0]; I++){
                   5406:                        for(J = 0; J < S[1]; J++){
                   5407:                                for(K = U = 0; K < S[0]; K++)
                   5408:                                        U = radd(U, call(FN, cons(P[I][K],cons(F[K][J],L)|option_list=Opt)));
                   5409:                                R[I][J] = U;
                   5410:                        }
                   5411:                }
                   5412:                return R;
                   5413:        }
                   5414:        erno(0);
                   5415:        return 0;
                   5416: }
                   5417:
                   5418: def appldo(P,F,L)
                   5419: {
1.56      takayama 5420:        if(getopt(Pfaff)==1){
                   5421:                L = vweyl(L);
                   5422:                X = L[0]; DX = L[1];
                   5423:                for(I=mydeg(P,DX);I>0;I--){
                   5424:                        if(!(TP=mycoef(P,D,DX))) continue;
                   5425:                        P=red(P+TP*(muldo(D^(I-1),F,L)-D^I));
                   5426:                }
                   5427:                return P;
                   5428:        }
1.6       takayama 5429:        if(type(F) <= 3){
                   5430:                if(type(L) == 4 && type(L[0]) == 4)
                   5431:                        return applpdo(P,F,L);
                   5432:                L = vweyl(L);
                   5433:                X = L[0]; DX = L[1];
                   5434:                J = mydeg(P,DX);
                   5435:                for(I = R = 0; I <= J; I++){
                   5436:                        if(I > 0)
                   5437:                                F = mydiff(F,X);
                   5438:                        R = radd(R,mycoef(P,I,DX)*F);
                   5439:                }
                   5440:                return R;
                   5441:        }
                   5442: #ifdef USEMODULE
                   5443:        return mmulbys(os_md.appldo,P,F,[L]);
                   5444: #else
                   5445:        return mmulbys(appldo,P,F,[L]);
                   5446: #endif
                   5447: }
                   5448:
                   5449: def appledo(P,F,L)
                   5450: {
                   5451:        if(type(F) <= 3){
                   5452:                L = vweyl(L);
                   5453:                X = L[0]; DX = L[1];
                   5454:                J = mydeg(P,DX);
                   5455:                for(I = R = 0; I <= J; I++){
                   5456:                        if(I > 0)
                   5457:                                F = myediff(F,X);
                   5458:                        R = radd(R,mycoef(P,I,DX)*F);
                   5459:                }
                   5460:                return R;
                   5461:        }
                   5462: #ifdef USEMODULE
                   5463:        mmulbys(os_md.appledo,P,F,[L]);
                   5464: #else
                   5465:        mmulbys(appledo,P,F,[L]);
                   5466: #endif
                   5467: }
                   5468:
                   5469: def muldo(P,Q,L)
                   5470: {
                   5471:        if(type(Lim=getopt(lim))!=1) Lim=100;
                   5472:        if(type(Q) <= 3){
                   5473:                if(type(L) == 4 && type(L[0]) == 4)
                   5474:                        return mulpdo(P,Q,L|lim=Lim);   /* several variables */
                   5475:                R = rmul(P,Q);
                   5476:                L = vweyl(L);
                   5477:                X = L[0]; DX = L[1];
                   5478:                if(X != 0){
                   5479:                        for(I = F = 1; ; I++){
                   5480:                                P = mydiff(P,DX);
                   5481:                                if(I>Lim){
                   5482:                                        mycat(["Over", Lim,"derivations!"]);
                   5483:                                        break;
                   5484:                                }
                   5485:                                if(P == 0)
                   5486:                                        break;
                   5487:                                Q = mydiff(Q,X);
                   5488:                                if(Q == 0)
                   5489:                                        break;
                   5490:                                F *= I;
                   5491:                                R = radd(R,P*Q/F);
                   5492:                        }
                   5493:                }
                   5494:                return R;
                   5495:        }
                   5496: #ifdef USEMODULE
                   5497:        return mmulbys(os_md.muldo,P,Q,[L]);
                   5498: #else
                   5499:        return mmulbys(muldo,P,Q,[L]);
                   5500: #endif
                   5501: }
                   5502:
                   5503: def jacobian(F,X)
                   5504: {
                   5505:        F=ltov(F);X=ltov(X);
1.30      takayama 5506:        N=length(F);L=length(X);
                   5507:        M=newmat(N,L);
1.6       takayama 5508:        for(I=0;I<N;I++)
1.30      takayama 5509:                for(J=0;J<L;J++) M[I][J]=red(diff(F[I],X[J]));
                   5510:        if(N!=L||getopt(mat)==1) return M;
1.6       takayama 5511:        return mydet(M);
                   5512: }
                   5513:
                   5514: def hessian(F,X)
                   5515: {
                   5516:        X=ltov(X);
                   5517:        N=length(X);
                   5518:        M=newmat(N,N);
                   5519:        for(I=0;I<N;I++){
                   5520:                G=red(diff(F,X[I]));
                   5521:                for(J=0;J<N;J++) M[I][J]=red(diff(G,X[J]));
                   5522:        }
                   5523:        if(getopt(mat)==1) return M;
                   5524:        return mydet(M);
                   5525: }
                   5526:
                   5527: def wronskian(F,X)
                   5528: {
                   5529:        N=length(F);
                   5530:        M=newmat(N,N);
                   5531:        for(I=0;F!=[];F=cdr(F),I++){
                   5532:                M[I][0]=car(F);
                   5533:                for(J=1;J<N;J++) M[I][J]=red(diff(M[I][J-1],X));
                   5534:        }
                   5535:        if(getopt(mat)==1) return M;
                   5536:        return mydet(M);
                   5537: }
                   5538:
                   5539: def adj(P,L)
                   5540: {
                   5541:        if(type(P) == 4)
                   5542: #ifdef USEMODULE
                   5543:                return map(os_md.adj,mtranspose(P),L);
                   5544: #else
                   5545:                return map(adj,mtranspose(P),L);
                   5546: #endif
                   5547:        if(type(L) == 4 && type(L[0]) == 4)
                   5548: #ifdef USEMODULE
                   5549:                return fmult(os_md.adj,P,L,[]);
                   5550: #else
                   5551:                return fmult(adj,P,L,[]);
                   5552: #endif
                   5553:        L = vweyl(L);
                   5554:        X = L[0]; DX = L[1];
                   5555:        P = R = subst(P, DX, -DX);
                   5556:        for(I = 1; (R = mydiff(mydiff(R, X), DX)/I) != 0 && I < 100; I++)
                   5557:                P = radd(P,R);
                   5558:        return P;
                   5559: }
                   5560:
                   5561: def laplace1(P,L)
                   5562: {
                   5563:        if(type(L) == 4 && type(L[0]) == 4)
                   5564: #ifdef USEMODULE
                   5565:                return fmult(os_md.laplace,P,L,[]);
                   5566: #else
                   5567:                return fmult(laplace,P,L,[]);
                   5568: #endif
                   5569:        L = vweyl(L);
                   5570:        X = L[0]; DX = L[1];
                   5571:        P = adj(P, L);
                   5572:        return subst(P,X,o_1,DX,X,o_1,DX);
                   5573: }
                   5574:
                   5575: def laplace(P,L)
                   5576: {
                   5577:        if(type(L) == 4 && type(L[0]) == 4)
                   5578: #ifdef USEMODULE
                   5579:                return fmult(os_md.laplace1,P,L,[]);
                   5580: #else
                   5581:                return fmult(laplace1,P,L,[]);
                   5582: #endif
                   5583:        L = vweyl(L);
                   5584:        X = L[0]; DX = L[1];
                   5585:        P = adj(P, L);
                   5586:        return subst(P,X,o_1,DX,-X,o_1,-DX);
                   5587: }
                   5588:
                   5589: def mce(P,L,V,R)
                   5590: {
                   5591:        L = vweyl(L);
                   5592:        X = L[0]; DX = L[1];
1.56      takayama 5593:        P = sftexp(laplace1(P,L),L,V,R|option_list=getopt());
1.6       takayama 5594:        return laplace(P,L);
                   5595: }
                   5596:
                   5597: def mc(P,L,R)
                   5598: {
1.56      takayama 5599:        return mce(P,L,0,R|option_list=getopt());
1.6       takayama 5600: }
                   5601:
                   5602: def rede(P,L)
                   5603: {
                   5604:        Q = ltov(fctr(nm(red(P))));
                   5605:        P = 1;
                   5606:        if(type(L) < 4)
                   5607:                L = [L];
                   5608:        if(type(L[0]) < 4)
                   5609:                L = [L];
                   5610:        for( ; L != []; L = cdr(L)){
                   5611:                DX = vweyl(car(L))[1];
                   5612:                for(I = 1; I < length(Q); I++){
                   5613:                        if(mydeg(Q[I][0],DX) > 0){
                   5614:                                P *= (Q[I][0])^(Q[I][1]);
                   5615:                                Q[I]=[1,0];
                   5616:                        }
                   5617:                }
                   5618:        }
                   5619:        return P;
                   5620: }
                   5621:
                   5622: def ad(P,L,R)
                   5623: {
                   5624:        L = vweyl(L);
                   5625:        DX = L[1];
                   5626:        K = mydeg(P,DX);
                   5627:        S = mycoef(P,0,DX);
                   5628:        Q = 1;
                   5629:        for(I=1; I <= K;I++){
                   5630:                Q = muldo(Q,DX-R,L);
                   5631:                S = radd(S,mycoef(P,I,DX)*Q);
                   5632:        }
                   5633:        return S;
                   5634: }
                   5635:
                   5636: def add(P,L,R)
                   5637: {
                   5638:        return rede(ad(P,L,R),L);
                   5639: }
                   5640:
                   5641:
                   5642: def vadd(P,L,R)
                   5643: {
                   5644:        L = vweyl(L);
                   5645:        if(type(R) != 4)
                   5646:                return 0;
                   5647:        N = length(R);
                   5648:        DN = 1; Ad = PW = 0;
                   5649:        for( ; R != []; R = cdr(R), PW++){
                   5650:                DN *= (T=1-car(R)[0]*L[0]);
                   5651:                Ad = Ad*T-car(R)[1]*x^PW;
                   5652:        }
                   5653:        Ad /= DN;
                   5654:        return add(P,L,Ad);
                   5655: }
                   5656:
                   5657: def addl(P,L,R)
                   5658: {
                   5659:        return laplace1(add(laplace(P,L),L,R),L);
                   5660: }
                   5661:
                   5662: def cotr(P,L,R)
                   5663: {
                   5664:        L = vweyl(L);
                   5665:        X = L[0]; DX = L[1];
                   5666:        T = 1/mydiff(P,DX);
                   5667:        K = mydeg(P,DX);
                   5668:        S = mysubst(mycoef(P,0,DX), [X, R]);
                   5669:        Q = 1;
                   5670:        for(I = 1; I <= K; I++){
                   5671:                Q = muldo(Q, K*DX, L);
                   5672:                S = radd(S,mysubst(mycoef(P,I,DX), [X, R])*Q);
                   5673:        }
                   5674: }
                   5675:
                   5676: def rcotr(P,L,R)
                   5677: {
                   5678:        return rede(cotr(P,L,R), L);
                   5679: }
                   5680:
                   5681: def muledo(P,Q,L)
                   5682: {
                   5683:        if(type(Q)>3)
                   5684: #ifdef USEMODULE
                   5685:                return mmulbys(os_md.muledo,P,Q,[L]);
                   5686: #else
                   5687:                return mmulbys(muledo,P,Q,[L]);
                   5688: #endif
                   5689:        R = P*Q;
                   5690:        L = vweyl(L);
                   5691:        X = L[0]; DX = L[1];
                   5692:        for(I = F = 1; I < 100; I++){
                   5693:                P = mydiff(P,DX);
                   5694:                if(P == 0)
                   5695:                        break;
                   5696:                Q = myediff(Q,X);
                   5697:                if(Q == 0)
                   5698:                        break;
                   5699:                F = rmul(F,I);
                   5700:                R = radd(R,P*Q/F);
                   5701:        }
                   5702:        return R;
                   5703: }
                   5704:
                   5705:
                   5706: #if 1
                   5707: def mulpdo(P,Q,L)
                   5708: {
                   5709:        if(type(Q)>3)
                   5710: #ifdef USEMODULE
                   5711:                return mmulbys(os_md.mulpdo,P,Q,[L]);
                   5712: #else
                   5713:                return mmulbys(mulpdo,P,Q,[L]);
                   5714: #endif
                   5715:        if(type(Lim=getopt(lim))!=1) Lim=100;
                   5716:        M = vweyl(car(L)); X= M[0]; DX = M[1];
                   5717:        L = cdr(L);
                   5718:        R = 0;
                   5719:        for(I = 0; Q != 0 && I <= Lim; I++){
                   5720:                if(I>Lim){
                   5721:                        mycat(["Over", Lim,"derivations!"]);
                   5722:                        break;
                   5723:                }
                   5724:                if(I > 0)
                   5725:                        P /= I;
                   5726:                if(length(L)==0)
                   5727:                        R = radd(R,P*Q);
                   5728:                else
                   5729:                        R = radd(R,mulpdo(P,Q,L));
                   5730:                if(X==0) break;
                   5731:                P = mydiff(P,DX);
                   5732:                if(P == 0)
                   5733:                        break;
                   5734:                Q = mydiff(Q,X);
                   5735:        }
                   5736:        if(I>Lim)       mycat(["Over", Lim,"derivations!"]);
                   5737:        return R;
                   5738: }
                   5739:
                   5740: #else
                   5741: def mulpdo(P,Q,L);
                   5742: {
                   5743:        if(type(Q)>3)
                   5744: #ifdef USEMODULE
                   5745:                return mmulbys(os_md.mulpdo,P,Q,[L]);
                   5746: #else
                   5747:                return mmulbys(mulpdo,P,Q,[L]);
                   5748: #endif
                   5749:        if(type(Lim=getopt(lim))!=1) Lim=100;
                   5750:        N  = length(L);
                   5751:        VO = newvect(2*N);
                   5752:        VN = newvect(2*N);
                   5753:        for(I = J = 0; I < N; J += 2, I++){
                   5754:                M = vweyl(L[I]);
                   5755:                P = subst(P, VO[J]=M[0], VN[J]=strtov("o_"+rtostr(V[J])),
                   5756:                        VO[J+1]=M[1], VN[J+1] = strtov("o_"+rtostr(V[J+1])));
                   5757:        }
                   5758:        for(PQ = P*Q, I = 0; I < 2*N; I += 2){
                   5759:                for(R = PQ, J = 1; J < Lim; J++){
                   5760:                        R = mydiff(R, VN[I+1])/J;
                   5761:                        if(R == 0)
                   5762:                                break;
                   5763:                        R = mydiff(R, VO[I]);
                   5764:                        if(R == 0)
                   5765:                                break;
                   5766:                        PQ = radd(PQ,R);
                   5767:                }
                   5768:                if(I==Lim)      mycat(["Over", Lim,"derivations!"]);
                   5769:                PQ = red(subst(PQ,VN[I],VO[I],VN[I+1],VO[I+1]));
                   5770:        }
                   5771: }
                   5772: #endif
                   5773:
                   5774: def transpdosub(P,LL,K)
                   5775: {
1.49      takayama 5776:        if(type(P)>3) return
                   5777: #ifdef USEMODULE
                   5778:                mtransbys(os_md.transpdosub,P,[LL,K]);
                   5779: #else
                   5780:                mtransbys(transpdosub,P,[LL,K]);
                   5781: #endif
1.6       takayama 5782:        Len = length(K)-1;
                   5783:        if(Len < 0 || P == 0)
                   5784:                return P;
                   5785:        KK=K[Len];
                   5786:        if(type(KK)==4){
                   5787:                KK0=KK[0]; KK1=KK[1];
                   5788:        }else{
                   5789:                L = vweyl(LL[Len]);
                   5790:                KK0=L[1]; KK1=K[Len];
                   5791:        }
                   5792:        Deg = mydeg(P,KK0);
                   5793:        K1 = reverse(cdr(reverse(K)));
                   5794:        R = transpdosub(mycoef(P,0,KK0),LL,K1);
                   5795:        for(I = M = 1; I <= Deg ; I++){
                   5796:                M = mulpdo(M,KK1,LL);
                   5797:                S = mycoef(P,I,KK0);
                   5798:                if(Len > 0)
                   5799:                        S = transpdosub(S,LL,K1);
                   5800:                R = radd(R,mulpdo(S,M,LL));
                   5801:        }
                   5802:        return R;
                   5803: }
                   5804:
                   5805: def transpdo(P,LL,K)
                   5806: {
                   5807:        Len = length(K)-1;
                   5808:        K1=K2=[];
                   5809:        if(type(LL)!=4) LL=[LL];
                   5810:        if(type(LL[0])!=4) LL=[LL];
1.49      takayama 5811:        if(type(car(K)) < 4 && length(LL)!=length(K)) K = [K];
1.6       takayama 5812:        if(getopt(ex)==1){
                   5813:                for(LT=LL, KT=K; KT!=[]; LT=cdr(LT), KT=cdr(KT)){
                   5814:                        L = vweyl(LL[J]);
                   5815:                        K1=cons([L[0],car(KT)[0]],K1);
                   5816:                        K2=cons([L[1],car(KT)[1]],K2);
                   5817:                }
                   5818:                K2=append(K1,K2);
                   5819:        }else{
1.49      takayama 5820:                if(length(LL)==length(K) && type(car(K))!=4){
                   5821:                        for(DV=V=TL=[],J=length(LL)-1;J>=0;J--){
                   5822:                                TL=cons(vweyl(LL[J]),TL);
                   5823:                                V=cons(car(TL)[0],V);
                   5824:                                DV=cons(car(TL)[1],DV);
                   5825:                        }
                   5826:                        LL=TL;
                   5827:                        if(type(RK=solveEq(K,V|inv=1))!=4) return TK;
                   5828:                        if(!isint(Inv=getopt(inv))) Inv=0;
                   5829:                        if(iand(Inv,1)){J=K;K=RK;RK=J;}
                   5830:                        M=jacobian(RK,V|mat=1);
                   5831:                        M=mulsubst(M,[V,K]|lpair=1);
                   5832:                        RK=vtol(M*ltov(DV));
                   5833:                        if(Inv>1) return RK;
                   5834:                        K=lpair(K,RK);
                   5835:                }
1.6       takayama 5836:                for(J = length(K)-1; J >= 0; J--){
                   5837:                        L = vweyl(LL[J]);
1.49      takayama 5838:                        if(L[0]!= K[J][0]) K1=cons([L[0],K[J][0]],K1);
1.6       takayama 5839:                        K2 = cons(K[J][1],K2);
                   5840:                }
                   5841:                P = mulsubst(P, K1);
                   5842:        }
                   5843:        return transpdosub(P,LL,K2);
                   5844: }
                   5845:
                   5846: def translpdo(P,LL,M)
                   5847: {
                   5848:        S=length(LL);
                   5849:        L0=newvect(S);L1=newvect(S);
                   5850:        K=newvect(S);
                   5851:        for(J=0;J<S;J++){
                   5852:                L = vweyl(LL[J]);
                   5853:                L0[J]=L[0];
                   5854:                L1[J]=L[1];
                   5855:        }
                   5856:        K=rmul(M,L0);
                   5857:        for(T=[],J=0;J<S;J++)
                   5858:                T=cons([L0[J],K[J]],T);
                   5859:        P=mulsubst(P,T);
                   5860:        K=rmul(myinv(M),L1);
                   5861:        for(T=[],J=0;J<S;J++)
                   5862:                T=cons([L1[J],K[J]],T);
                   5863:        return mulsubst(P,T);
                   5864: }
                   5865:
                   5866: /*
                   5867:                return [R, M, S] : R = M*P - S*Q
                   5868:                deg(R,X) < deg(Q,X)
                   5869: */
                   5870: def rpdiv(P,Q,X)
                   5871: {
                   5872:        if(P == 0)
                   5873:                return [0,1,0];
                   5874:        DQ = mydeg(Q,X);
                   5875:        CO = mycoef(Q,DQ,X);
                   5876:        S  = 0;
                   5877:        while((DP = mydeg(P,X)) >= DQ){
                   5878:                R = mycoef(P,DP,X)/CO;
                   5879:                S = radd(S,R*X^(DP-DQ));
                   5880:                P = radd(P, -R*Q*X^(DP-DQ));
                   5881:        }
                   5882:        Lcm = lcm(dn(S),dn(P));
                   5883:        Gcd = gcd(nm(S),nm(P));
                   5884:        return [red(P*Lcm/Gcd), red(Lcm/Gcd),red(S*Lcm/Gcd)];
                   5885: }
                   5886:
                   5887: def texbegin(T,S)
                   5888: {
                   5889:        if(type(Opt=getopt(opt))==7) Opt="["+Opt+"]\n";
                   5890:        else Opt="\n";
1.47      takayama 5891:        U=(str_chr(S,str_len(S)-1,"\n")<0)?"%\n":"";
                   5892:        return "\\begin{"+T+"}"+Opt+S+U+"\\end{"+T+"}\n";
1.6       takayama 5893: }
                   5894:
                   5895: def mygcd(P,Q,L)
                   5896: {
                   5897:        if((Dvi=getopt(dviout))==3 || Dvi==-3){ /* dviout=3 */
                   5898:                if((Rev=getopt(rev))!=1) Rev=0;
                   5899:                R=mygcd(P,Q,L|rev=Rev);
                   5900:                if(type(L)<2) Var=0;
                   5901:                else if(type(L)==2){
                   5902:                        Val=L;L=[0,L];
                   5903:                }else if(type(L)==4){
                   5904:                        L=vweyl(L);
                   5905:                        Var=[[L[1],"\\partial"]];
                   5906:                }
                   5907:                S=mat([P],[Q]);T=mat([R[0]],[0]);
                   5908:                M=mat([R[1],R[2]],[R[3],R[4]]);
                   5909:                if(type(Val)==4)
                   5910:                        N=mdivisor(M,L|trans=1)[1];
                   5911:                else N=myinv(M);
                   5912:                Tb=str_tb(mtotex(S|var=Var),0);
                   5913:                str_tb("&="+mtotex(N|var=Var)+mtotex(T|var=Var)+",\\\\\n",Tb);
                   5914:                str_tb(mtotex(T|var=Var),Tb);
                   5915:                str_tb("&="+mtotex(M|var=Var)+mtotex(S|var=Var)+".",Tb);
                   5916:                Out=str_tb(0,Tb);
                   5917:                if(Dvi<0) return Out;
                   5918:                dviout(Out|eq="align*");
                   5919:                return 1;
                   5920:        }
                   5921:        if((type(Dvi)==1||Dvi==0) && getopt(rev)!=1)    V=[[P,Q]];
                   5922:        else V=0;
                   5923:        if(L==0){       /* integer case */
                   5924:                if(type(P) > 1 || type(Q) > 1 || Q==0  /* P <= 0 || Q <= 0 */
                   5925:                        || dn(P) > 1 || dn(Q) > 1)
                   5926:                        return 0;
                   5927:                        CPP = CQQ = 1; CQP = CPQ = 0;
                   5928:                        P1 = P; Q1 = Q;
                   5929:                /* P1 = CPP*P + CPQ*Q
                   5930:                   Q1 = CQP*P + CQQ*Q */
                   5931:                while(Q1 != 0){
                   5932:                        Div1 = idiv(P1,Q1); Div2 = irem(P1,Q1);
                   5933:                        if(type(V)==4) V=cons([Div1,Div2],V);
                   5934:                        P1 = Q1 ; Q1 = Div2;
                   5935:                        TP = CQP; TQ = CQQ;
                   5936:                        CQP = CPP-Div1*CQP;
                   5937:                        CQQ = CPQ-Div1*CQQ;
                   5938:                        CPP = TP; CPQ = TQ;
                   5939:                }
                   5940:                if(V!=0){
                   5941:                        V=reverse(V);
                   5942:                        if((DVI=abs(Dvi))==0) return V;
                   5943:                        PT=P;QT=Q;
                   5944:                        if(DVI==1 || DVI==2){
                   5945:                                Tb=str_tb(0,0);
                   5946:                                for(C=0,V=cdr(V);V!=[];V=cdr(V)){
                   5947:                                        T=car(V);
                   5948:                                        if(C++) str_tb(texcr(11),Tb);
                   5949:                                        if(DVI==1){
                   5950:                                                Qs=rtostr(QT);
                   5951:                                                if(QT<0) Qs="("+Qs+")";
                   5952:                                                if(T[1]>0) Qs=Qs+"+";
                   5953:                                                if(T[1]!=0) Qs=Qs+rtostr(T[1]);
                   5954:                                                str_tb(rtostr(PT)+"&="
                   5955:                                                        +rtostr(T[0])+"\\times"+Qs,Tb);
                   5956:                                        }else{
                   5957:                                                N=mat([T[0],1],[1,0]);
                   5958:                                                if(C==1){
                   5959:                                                        str_tb(S0=mtotex(mat([PT],[QT])),Tb);
                   5960:                                                        M=N;
                   5961:                                                }
                   5962:                                                str_tb("&=",Tb);
                   5963:                                                if(C>1) str_tb(mtotex(M),Tb);
                   5964:                                                str_tb(mtotex(N),Tb);
                   5965:                                                str_tb(S=mtotex(mat([QT],[T[1]])),Tb);
                   5966:                                                if(C>1){
                   5967:                                                        str_tb("=",Tb);
                   5968:                                                        str_tb(mtotex(M=M*N),Tb);
                   5969:                                                        str_tb(S,Tb);
                   5970:                                                }
                   5971:                                        }
                   5972:                                        PT=QT;QT=T[1];
                   5973:                                }
                   5974:                                if(DVI==2){
                   5975:                                        str_tb(texcr(43)+S+"&=",Tb);
                   5976:                                        str_tb(mtotex(myinv(M)),Tb);
                   5977:                                        str_tb(S0,Tb);
                   5978:                                }
                   5979:                                Out=str_tb(0,Tb);
                   5980:                                if(Dvi>0){
                   5981:                                        dviout(Out|eq="align*");
                   5982:                                        return 1;
                   5983:                                }
                   5984:                                return Out;
                   5985:                        }
                   5986:                }
                   5987:                if(P1<0) return [-P1,-CPP,-CPQ,CQP,CQQ];
                   5988:                return [P1, CPP, CPQ, CQP, CQQ];
                   5989:        }
                   5990:        if(type(L) == 2)        /* polynomical case */
                   5991:                L = [0,L];
                   5992:        if(getopt(rev)==1 && L[0]!=0){
                   5993:                R=mygcd(adj(P,L),adj(Q,L),L);
                   5994:                return [adj(R[0],L),adj(R[1],L),adj(R[2],L),adj(R[3],L),adj(R[4],L)];
                   5995:        }
                   5996:        if(type(P) == 3)
                   5997:                P = red(P);
                   5998:        if(type(Q) == 3)
                   5999:                Q = red(Q);
                   6000:        CP=newvect(2,[1/dn(P),0]); CQ=newvect(2,[0,1/dn(Q)]);
                   6001:        P=PT=nm(P); Q =QT=nm(Q);
                   6002:        L = vweyl(L);
                   6003:        while(Q != 0){
                   6004:                R = divdo(P,Q,L);
                   6005:                if(type(V)==4) V=cons(R,V);
                   6006: /* R[1] = R[2]*P - R[0]*Q
                   6007:                = R[2]*(CP[0]*P0+CP[1]*Q0) - R[0]*(CQ[0]*P0+CQ[1]*Q0) */
                   6008: /*
                   6009:   P(n)     |0        1 |  P(n-1)
                   6010:          = |           |
                   6011:   R[1]     |R[2]  -R[0]|  P(n)
                   6012:   P(n+1) = R[1], P(n) = P, P(n-1) = Q
                   6013: */
                   6014:                P = Q;
                   6015:                Q = R[1];
                   6016:                {
                   6017:                        CT = dupmat(CQ);
                   6018:                        CQ = [R[2]*CP[0]-muldo(R[0],CQ[0],L),
                   6019:                                        R[2]*CP[1]-muldo(R[0],CQ[1],L)];
                   6020:                        CP = CT;
                   6021:                }
                   6022:        }
                   6023:        if(V!=0){
                   6024:                V=reverse(V);
                   6025:                if((DVI=abs(Dvi))==0) return V;
                   6026:                if(type(L[0])<1) Var=L[1];
                   6027:                else Var=[L[1],"\\partial"];
                   6028:                if(DVI==1 || DVI==2){
                   6029:                        Tb=str_tb(0,0);
                   6030:                        PT=car(V)[0];QT=car(V)[1];
                   6031:                        for(C=0,V=cdr(V);V!=[];V=cdr(V)){
                   6032:                                T=car(V);
                   6033:                                if(C++) str_tb(texcr(11),Tb);
                   6034:                                if(DVI==1){
                   6035:                                        if(T[2]!=1){
                   6036:                                                str_tb(monototex(T[2]),Tb);
                   6037:                                                str_tb("(",Tb);
                   6038:                                                str_tb(fctrtos(PT|var=Var,TeX=2),Tb);
                   6039:                                                str_tb(")&=",Tb);
                   6040:                                        }else{
                   6041:                                                str_tb(fctrtos(PT|var=Var,TeX=2),Tb);
                   6042:                                                str_tb("&=",Tb);
                   6043:                                        }
                   6044:                                        str_tb("(",Tb);
                   6045:                                        str_tb(fctrtos(T[0]|var=Var,TeX=2),Tb);
                   6046:                                        str_tb(")(",Tb);
                   6047:                                        str_tb(fctrtos(QT|var=Var,TeX=2),Tb);
                   6048:                                        if(T[1]!=0){
                   6049:                                                str_tb(")+(",Tb);
                   6050:                                                str_tb(fctrtos(T[1]|var=Var,TeX=2),Tb);
                   6051:                                        }
                   6052:                                        str_tb(")",Tb);
                   6053:                                }else{
                   6054:                                        N=mat([red(T[0]/T[2]),1],[1,0]);
                   6055:                                        if(C==1){
                   6056:                                                str_tb(S0=mtotex(mat([PT],[QT])|var=Var),Tb);
                   6057:                                                M=N;
                   6058:                                        }
                   6059:                                        str_tb("&=",Tb);
                   6060:                                        if(C>1) str_tb(mtotex(M),Tb);
                   6061:                                        str_tb(mtotex(N|var=Var),Tb);
                   6062:                                        str_tb(S=mtotex(mat([QT],[T[1]])|var=Var),Tb);
                   6063:                                        if(C>1){
                   6064:                                                str_tb("=",Tb);
                   6065:                                                str_tb(mtotex(M=muldo(M,N,L)|var=Var),Tb);
                   6066:                                                str_tb(S,Tb);
                   6067:                                        }
                   6068:                                }
                   6069:                                PT=QT;QT=T[1];
                   6070:                        }
                   6071:                        if(DVI==2){
                   6072:                                FT=fctr(PT);
                   6073:                                for(R=1;FT!=[];FT=cdr(FT)){
                   6074:                                        if(mydeg(car(FT)[0],L[1])<1)
                   6075:                                                for(J=car(FT)[1];J>0;J--) R*=car(FT)[0];
                   6076:                                }
                   6077:                                if(R!=1){
                   6078:                                        str_tb(texcr(79),Tb);
                   6079:                                        M=muldo(M,mat([R,0],[0,1]),L);
                   6080:                                        str_tb(mtotex(M|var=Var),Tb);
                   6081:                                        str_tb(S=mtotex(mat([PT/R],[QT])|var=Var),Tb);
                   6082:                                }
                   6083:                                str_tb(texcr(43)+S+"&=",Tb);
                   6084:                                if(type(Var)==4){
                   6085:                                        N=mdivisor(M,L|trans=1);
                   6086:                                        N=N[1];
                   6087:                                }else
                   6088:                                        N=myinv(M);
                   6089:                                str_tb(mtotex(N|var=Var),Tb);
                   6090:                                str_tb(S0,Tb);
                   6091:                        }
                   6092:                        Out=str_tb(0,Tb);
                   6093:                        if(Dvi>0){
                   6094:                                dviout(Out|eq="align*");
                   6095:                                return 1;
                   6096:                        }
                   6097:                        return Out;
                   6098:                }
                   6099:        }
                   6100:        Q = rede(P,L);
                   6101:        R = red(P/Q);
                   6102:        return [Q,red(CP[0]/R),red(CP[1]/R),red(CQ[0]/R),red(CQ[1]/R)];
                   6103: }
                   6104:
                   6105: def mylcm(P,Q,L)
                   6106: {
                   6107:        Rev=(getopt(rev)==1)?1:0;
                   6108:        if(Rev==1){
                   6109:                P=adj(P); Q=adj(Q);
                   6110:        }
                   6111:        R = mygcd(P,Q,L);
                   6112:        S=(type(L)<=2)?R[3]*P:muldo(R[3],P,L);
                   6113:        S = nm(S);
                   6114:        if(type(S) <= 1 && type(L) <= 1){
                   6115:                if(S<0) S = -S;
                   6116:                return S;
                   6117:        }
                   6118:        if(type(L) == 2)
                   6119:                return easierpol(S,L);
                   6120:        S=rede(easierpol(S,L[1]),L);
                   6121:        return (Rev==1)?adj(S):S;
                   6122: }
                   6123:
                   6124: def sftpexp(P,LL,F,Q)
                   6125: {
                   6126:        if(type(LL[0]) < 4)
                   6127:                LL = [LL];
                   6128:        for(L0=L1=[],LT=LL;LT!=[];LT=cdr(LT)){
                   6129:                W=vweyl(car(LT));
                   6130:                L0=cons(W,L0);
                   6131:                D=mydiff(F,W[0]);
                   6132:                if(D!=0) L1=cons(W[1]+Q*D/F,L1);
                   6133:                else L1=cons(W[1],L1);
                   6134:        }
                   6135:        return rede(transpdosub(P,L0,L1),L0);
                   6136: }
                   6137:
                   6138: def applpdo(P,F,LL)
                   6139: {
                   6140:        if(type(F)>3)
                   6141: #ifdef USEMODULE
                   6142:                return mmulbys(os_md.applpdo,P,F,[LL]);
                   6143: #else
                   6144:                return mmulbys(applpdo,P,F,[LL]);
                   6145: #endif
                   6146:        L = vweyl(LL[0]);
                   6147:        LL = cdr(LL);
                   6148:        Deg = deg(P,L[1]);
                   6149:        S = F;
                   6150:        for(I = R = 0; I <= Deg ; I++){
                   6151:                if(I > 0)
                   6152:                        S = mydiff(S,L[0]);
                   6153:                if(LL == [])
                   6154:                        R = radd(R,mycoef(P,I,L[1])*S);
                   6155:                else
                   6156:                        R = radd(R,applpdo(mycoef(P,I,L[1]), S, LL));
                   6157:        }
                   6158:        return R;
                   6159: }
                   6160:
                   6161: def tranlpdo(P,L,M)
                   6162: {
                   6163:        N = length(L);
                   6164:        R = size(M);
                   6165:        if(R[0] != N || R[1] != N){
                   6166:                print("Strange size");
                   6167:                return;
                   6168:        }
                   6169:        InvM = M;
                   6170:        if(InvM[1] == 0){
                   6171:                print("Not invertible");
                   6172:                return;
                   6173:        }
                   6174:        XL = newvector(N);
                   6175:        DL = newvector(N);
                   6176:        for(I = 0; I < 0; I++){
                   6177:                R = vweyl(L[I]);
                   6178:                XL[I] = R[0];
                   6179:                DL[I] = R[1];
                   6180:        }
                   6181:        for(I = 0; I < N; I++){
                   6182:                for(J = XX = D0 = 0; J < N; J++){
                   6183:                        XX = radd(XX,M[I][J]*XL[J]);
                   6184:                        DD = radd(DD, red(InvM[0][I][J]/InvM[1])*DL[J]);
                   6185:                        P = mysubst(P,[[XL[I],XX],[DL[I],DD]]);
                   6186:                }
                   6187:        }
                   6188:        return P;
                   6189: }
                   6190:
                   6191: def divdo(P,Q,L)
                   6192: {
                   6193:        if(L==0){
                   6194:                R=P-idiv(P,Q)*Q;
                   6195:                if(R<0){
                   6196:                        if(Q>0) R+=Q;
                   6197:                        else R-=Q;
                   6198:                }
                   6199:                return [(P-R)/Q,R,1];
                   6200:        }
                   6201:        L = vweyl(L);
                   6202:        if(getopt(rev)==1){
                   6203:                R=divdo(adj(P,L),adj(Q,L),L);
                   6204:                return [adj(R[0],L),adj(R[1],L),R[2]];
                   6205:        }
                   6206:        X = L[0]; DX = L[1];
                   6207:        S = 0;
                   6208:        M = 1;
                   6209:        I = mydeg(Q,DX);
                   6210:        CQ = mycoef(Q,I,DX);
                   6211:        while((J=mydeg(P,DX)) >= I){
                   6212:         C = mycoef(P,J,DX);
                   6213:         SR = red(C/CQ);
                   6214:                 if(dn(SR) != 1){
                   6215:                        M *= dn(SR);
                   6216:                        P *= dn(SR);
                   6217:                        S *= dn(SR);
                   6218:                        SR = nm(SR);
                   6219:                }
                   6220:                P -= muldo(SR*(DX)^(J-I),Q,L);
                   6221:                S += SR*(DX)^(J-I);
1.70      takayama 6222:     }
1.6       takayama 6223:        return [S,P,M];
                   6224: }
                   6225:
                   6226: def qdo(P,Q,L)
                   6227: {
                   6228:        L = vweyl(L); DX = L[1]; OD = deg(P,DX);
                   6229:        V = newvect(OD+1);
                   6230:        for(I = 0; I <= OD; I++){
                   6231:                if(I)
                   6232:                        Q = muldo(DX,Q,L);
                   6233:                S = divdo(Q,P,L);
                   6234:                V[I] = S[1]*DX-S[2]*zz^I;
                   6235:        }
                   6236:        for(K = [], I = OD; I >= 0; I--)
                   6237:                K = cons(DX^(I+1), K);
                   6238:        R = lsol(V,K);
                   6239:        S = length(R);
                   6240:        for(I = P1 = 0; I < S; I++){
                   6241:                if(type(R[I]) < 4 && mydeg(R[I],DX) == 0 && R[I] != 0
                   6242:                        && (mydeg(R[I],zz) <= mydeg(P,DX)))
                   6243:                                P1 = R[I];
                   6244:                else if(type(R[I]) == 4 && R[I][0] == DX)
                   6245:                                P2 = R[I][1];
                   6246:        }
                   6247:        T=fctr(P1);
                   6248:        for(I=0, S=length(T), P1=1; I<S; I++){
                   6249:                if(mydeg(T[I][0],zz) > 0)
                   6250:                        P1 *= T[I][0]^(T[I][1]);
                   6251:        }
                   6252:        return subst([P1,P2],zz,DX);
                   6253: }
                   6254:
                   6255: def sqrtdo(P,L)
                   6256: {
                   6257:        L = vweyl(L);
                   6258:        P = toeul(P,L,0);
                   6259:        V = -1;
                   6260:        for(R = 0, Ord = mydeg(P,L[1]); Ord >= 0; Ord--){
                   6261:                Q = coef(P,Ord,L[1]);
                   6262:                M = mydeg(Q,L[0]);
                   6263:                N = mymindeg(Q,L[0]);
                   6264:                if(V < 0)
                   6265:                        V = M+N;
                   6266:                else if(V != M+N){
                   6267:                        print("Cannot be transformed!");
                   6268:                        return;
                   6269:                }
                   6270:                Q = tohomog(red(Q/L[0]^N), [L[0]], z_z);
                   6271:                if(irem(Ord,2))
                   6272:                        B = x-z_z;
                   6273:                else
                   6274:                        B = x+z_z;
                   6275:                Q = substblock(Q,x,B,z_zz);
                   6276:                if(mydeg(Q,x) > 0){
                   6277:                        print("Cannot be transformed!");
                   6278:                        return;
                   6279:                }
                   6280:                R += mysubst(Q,[z_zz,x])*L[1]^Ord;
                   6281:        }
                   6282:        return fromeul(R,L,0);
                   6283: }
                   6284:
                   6285: def ghg(A,B)
                   6286: {
                   6287:        R = dx;
                   6288:        while(length(B)>0){
                   6289:                R = muldo(x*dx+car(B),R,[x,dx]);
                   6290:                B = cdr(B);
                   6291:        }
                   6292:        T = 1;
                   6293:        while(length(A)>0){
                   6294:                T = muldo(x*dx+car(A),T,[x,dx]);
                   6295:                A = cdr(A);
                   6296:        }
                   6297:        return R-T;
                   6298: }
                   6299:
                   6300: def ev4s(A,B,C,S,T)
                   6301: {
                   6302:  R4 = x^2*(x-1)^2;
                   6303:  R3 = x*(x-1)*((2*A-2*B-8)*x-2*A+5);
                   6304:  R2 = (-3/2*(A^2+B^2)+3*A*B+9*A-9*B-29/2+1/4*(S^2+T^2))*x^2
                   6305:        +(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
                   6306:        - (2*A+2*C-5)*(2*A-2*C-3)/4;
                   6307:  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
                   6308:         +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
                   6309: #if 1
                   6310:         + A^2*B
                   6311: #endif
                   6312:         - B*C^2 - A^3/2+(2*A-3)*(S^2+T^2)/8;
                   6313: /* OK? for the above term added */
                   6314:  R0 = -(A-B-1-S)*(A-B-1+S)*(A-B-1-T)*(A-B-1+T)/16;
                   6315:  return (R4*dx^4-R3*dx^3-R2*dx^2-R1*dx-R0);
                   6316: }
                   6317:
                   6318: def b2e(A,B,C,S,T)
                   6319: {
                   6320:        R4 = x^2*(x-1)^2;
                   6321:        R3 = x*(x-1)*(2*x-1)*(2*c-5);
                   6322:        R2 = (-6*C^2+24*C-25+1/2*S^2+1/2*T^2)*x^2
                   6323:                        +(6*C^2-24*C+25-1/2*S^2-1/2*T^2-A^2+B^2+A-B)*x
                   6324:                        +A^2-C^2-A+4*C-15/4;
                   6325:        R1 = (2*C-3)*(2*C^2-6*C+5-1/2*S^2-1/2*T^2)*x
                   6326:                        +(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);
                   6327:        R0 = -(2-2*C+S+T)*(2-2*C-S-T)*(2-2*C+S-T)*(2-2*C-S+T)/16;
                   6328:  return (R4*dx^4-R3*dx^3-R2*dx^2-R1*dx-R0);
                   6329: }
                   6330:
                   6331:
                   6332: /*
                   6333:        T^m = T(T-1)....(T-m+1)
                   6334:        f(t) -> g(t)
                   6335:
                   6336:        f(t)   = a_mt^m + ... + a_1t+a_0
                   6337:        g(x*dx) = a_m*x^m*dx^m + ... + a_1*x*dx+a_0
                   6338:
                   6339:        ret: x(x-1)...(x-i+1)
                   6340:  */
                   6341: def sftpow(X,I)
                   6342: {
                   6343:         R = 1;
                   6344:         for(J=0;J<I;J++)
                   6345:                R *= X-J;
                   6346:         return(R);
                   6347: }
                   6348:
                   6349: /*
                   6350:        ret: x(x+K)(x+2*k)...(x+(i-1)*k)
                   6351: */
                   6352: def sftpowext(X,I,K)
                   6353: {
                   6354:         R = 1;
                   6355:         for(J=0;J<I;J++)
                   6356:                R *= X+K*J;
                   6357:         return(R);
                   6358: }
                   6359:
                   6360: def polinsft(F,A)
                   6361: {
                   6362:         R = 0;
                   6363:         while(F != 0){
                   6364:                 D = mydeg(F,A);
                   6365:                 C = mycoef(F,D,A);
                   6366:                 R += C*A^D;
                   6367:                 F -= C*sftpow(A,D);
                   6368:         }
                   6369:         return R;
                   6370: }
                   6371:
                   6372: def pol2sft(F,A)
                   6373: {
                   6374:        S=getopt(sft);
                   6375:        if(type(S)<0 || type(S)>2) S=1;
                   6376:        R = 0;
                   6377:        for(I = mydeg(F,A); I >= 0; I--)
                   6378:                R = R*(A-I*S) + mycoef(F,I,A);
                   6379:        return R;
                   6380: }
                   6381:
                   6382: def binom(P,N)
                   6383: {
1.20      takayama 6384:        if(type(N)!=1 || N<=0) return 1;
1.6       takayama 6385:        for(S=1;N>0;N--,P-=1)   S*=P/N;
                   6386:        return red(S);
                   6387: }
                   6388:
                   6389: def expower(P,R,N)
                   6390: {
                   6391:        if(type(N)!=1 || N<0) return 0;
                   6392:        for(S=S0=K=1;K<=N;K++,R-=1){
                   6393:                S0*=P*R/K;S+=S0;
                   6394:        }
                   6395:        return red(S);
                   6396: }
                   6397:
                   6398: def seriesHG(A,B,X,N)
                   6399: {
1.20      takayama 6400:        if(N==0) return 1;
1.6       takayama 6401:        if(type(N)!=1 || N<0) return 0;
                   6402:        if(type(X)<4){
                   6403:                for(K=0,S=S0=1;K<N;K++){
                   6404:                        for(T=A; T!=[]; T=cdr(T))       S0*=car(T)+K;
                   6405:                        for(T=B; T!=[]; T=cdr(T))       S0/=car(T)+K;
                   6406:                        S0=red(S0*X/(K+1));
                   6407:                        DN=dn(S0);
                   6408:                        S=red((red(S*DN)+nm(S0))/DN);
                   6409:                }
                   6410:                return S;
                   6411:        }
                   6412:        S=0;
                   6413:        for(K=0;K<=N;K++){
                   6414:                for(I=0;I<=N-K;I++){
                   6415:                        C=1/sftpowext(1,I,1)/sftpowext(1,J,1);
                   6416:                        for(T=A[0];T!=[];T=cdr(T)) C*=sftpowext(car(T),I+K,1);
                   6417:                        for(T=A[1];T!=[];T=cdr(T)) C*=sftpowext(car(T),I,1);
                   6418:                        for(T=A[2];T!=[];T=cdr(T)) C*=sftpowext(car(T),K,1);
                   6419:                        for(T=B[0];T!=[];T=cdr(T)) C/=sftpowext(car(T),I+K,1);
                   6420:                        for(T=B[1];T!=[];T=cdr(T)) C/=sftpowext(car(T),I,1);
                   6421:                        for(T=B[2];T!=[];T=cdr(T)) C/=sftpowext(car(T),K,1);
                   6422:                        S+=red(C*X[0]^I*X[1]^K);
                   6423:                }
                   6424:        }
                   6425:        return S;
                   6426: }
                   6427:
                   6428: def evalred(F)
                   6429: {
                   6430:        Opt=getopt(opt);
                   6431:        if(type(Opt)!=4){
                   6432:                 Opt=[];
                   6433:        }else if(length(Opt)==2 && type(Opt[0])!=4)     Opt=[Opt];
                   6434:        for(;;){
1.17      takayama 6435:                G=mysubst(F,[[tan(0),0],[asin(0),0],[atan(0),0],[sinh(0),0],[tanh(0),0],
                   6436:                        [log(1),0],[cosh(0),1],[exp(0),1]]);
1.6       takayama 6437:                for(Rep=Opt; Rep!=[]; Rep=cdr(Rep))
                   6438:                        G=subst(G,car(Rep)[0],car(Rep)[1]);
                   6439:                Var=vars(G);
                   6440:                for(V=Var; V!=[]; V=cdr(V)){
1.17      takayama 6441:                        if(!(VV=args(CV=car(V)))) continue;
                   6442:                        if((functor(CV)==sin||functor(CV)==cos)){
                   6443:                                P=2*red(VV[0]/@pi);
                   6444:                                if(functor(CV)==sin) P=1-P;
                   6445:                                if(isint(P)){
                   6446:                                        if(iand(P,1)) G=subst(G,CV,0);
                   6447:                                        else if(!iand(P,3)) G=subst(G,CV,1);
                   6448:                                        else G=subst(G,CV,-1);
                   6449:                                        continue;
                   6450:                                }
                   6451:                                if(isint(P*=3/2)){
                   6452:                                        if(iand(P,3)==1) G=subst(G,CV,1/2);
                   6453:                                        else G=subst(G,CV,-1/2);
                   6454:                                }
                   6455:                        }
                   6456:                        for(;VV!=[];VV=cdr(VV))
                   6457:                                if(car(VV)!=(TV=evalred(car(VV)))) G=subst(G,car(VV),TV);
                   6458:                        if(functor(CV)!=pow || (args(CV)[0])!=1) continue;
                   6459:                        G=subst(G,CV,1);
1.6       takayama 6460:                }
                   6461:                if(G==F) return F;
                   6462:                F=G;
                   6463:        }
                   6464: }
                   6465:
                   6466: def seriesMc(F,N,V)
                   6467: {
                   6468:        if(type(V)<4) V=[V];
                   6469:        V=reverse(V);
                   6470:        L=length(V);
                   6471:        if(type(Opt=getopt(evalopt))!=4) Opt=[];
                   6472:        P=newvect(L);
                   6473:        G=newvect(L+1);
                   6474:        G[0]=F;
                   6475:        for(I=0;I<L;I++)
                   6476:                G[I+1]=eval(evalred(subst(G[I],V[I],0)|opt=Opt));
                   6477:        R=G[L];
                   6478:        for(;;){
                   6479:                for(M=0,I=0;I<L;I++){
                   6480:                        M+=P[I];
                   6481:                        if(M==N) break;
                   6482:                }
                   6483:                if(M<N){
                   6484:                        P[L-1]++;
                   6485:                        G[L-1]=mydiff(G[L-1],V[L-1]);
                   6486:                        G[L]=eval(evalred(mysubst(G[L-1],[V[L-1],0])|opt=Opt));
                   6487:                }else{
                   6488:                        if(I--==0) break;
                   6489:                        P[I]++;
                   6490:                        G[I]=mydiff(G[I],V[I]);
                   6491:                        while(I++<L){
                   6492:                                G[I]=eval(evalred(mysubst(G[I-1],[V[I-1],0])|opt=Opt));
                   6493:                                if(I<L) P[I]=0;
                   6494:                        }
                   6495:                }
                   6496:                K=1;
                   6497:                for(I=0;I<L;I++) K*=V[I]^P[I]/fac(P[I]);
                   6498:                R+=G[L]*K;
                   6499:        }
                   6500:        return R;
                   6501: }
                   6502:
                   6503: def seriesTaylor(F,N,V)
                   6504: {
                   6505:        G=F;
                   6506:        if(isvar(V)) V=[V];
                   6507:        if(length(V)==2 && type(car(V))!=4 && !isvar(V[1])) V=[V];
                   6508:        for(V0=V1=[];V!=[];V=cdr(V)){
                   6509:                if(type(T=car(V))!=4) T=[T];
                   6510:                V0=cons(X=car(T),V0);
                   6511:                if(length(T)==1 || T[1]==0){
                   6512:                        V1=cons(X,V1);continue;
                   6513:                }
                   6514:                S=my_tex_form(-T[1]);
                   6515:                if(str_char(S,0,"-")!=0) S="+"+S;
                   6516:                S="("+my_tex_form(X)+S+")";
                   6517:                V1=cons([X,S],V1);
                   6518:                F=red(subst(F,T[0],T[0]+T[1]));
                   6519:        }
                   6520:        V0=reverse(V0);V1=reverse(V1);
                   6521:        F=seriesMc(F,N,V0|option_list=getopt());
                   6522:        if(getopt(frac)==0) F=frac2n(F);
                   6523:        T=getopt(dviout);
                   6524:        if(type(T)!=1) T=0;
                   6525:        F=fctrtos(F|var=V1,rev=1,TeX=(T==0||T==2)?2:3);
                   6526:        if(getopt(small)==1) F=str_subst(F,"\\frac{","\\tfrac{");
                   6527:        if(T<0 || T==1) F="\\begin{align}\\begin{split}\n"+
                   6528:                my_tex_form(G)+"&="+F+"+\\cdots\n\\end{split}\\end{align}\n";
                   6529:        if(T==1) dviout(F);
                   6530:        else if(T==1) dviout(F|eq=4);
                   6531:        return F;
                   6532: }
                   6533:
1.27      takayama 6534: def mulpolyMod(P,Q,X,N)
                   6535: {
                   6536:        Red=(type(P)>2||type(Q)>2)?1:0;
                   6537:        for(I=R=0;I<=N;I++){
                   6538:                P0=mycoef(P,I,X);
                   6539:                for(J=0;J<=N-I;J++){
                   6540:                        R+=P0*mycoef(Q,J,X)*X^(I+J);
                   6541:                        if(Red) R=red(R);
                   6542:                }
                   6543:        }
                   6544:        return R;
                   6545: }
                   6546:
1.46      takayama 6547: def solveEq(L,V)
                   6548: {
                   6549:        Inv=0;K=length(V);
                   6550:        H=(getopt(h)==1)?1:0;
                   6551:        if(getopt(inv)==1){
                   6552:                if(K!=length(L)) return -5;
                   6553:                Inv=1;
                   6554:                VN=makenewv(vars(L)|num=K);
                   6555:                for(TL=[],I=K-1;I>=0;I--) TL=cons(VN[I]-L[I],TL);
                   6556:                S=solveEq(TL,V|h=H);
                   6557:                if(type(S)!=4) return S;
                   6558:                return mysubst(S,[VN,V]|lpair=1);
                   6559:        }
                   6560:        for(TL=[];L!=[];L=cdr(L)) TL=cons(nm(red(car(L))),TL);
                   6561:        S=gr(TL,reverse(V),2);
                   6562:        if(length(S)!=K) return -1;
                   6563:        for(R=[],I=F=0;I<K;I++){
                   6564:                TS=S[I];
                   6565:                VI=lsort(vars(TS),V,2);
                   6566:                if(length(VI)!=1) return -2;
                   6567:                if((VI=car(VI))!=V[I]) return -3;
                   6568:                if(mydeg(TS,VI)!=1){
                   6569:                        F=1;R=cons([VI,TS],R);
                   6570:                }else R=cons(-red(mycoef(TS,0,VI)/mycoef(TS,1,VI)),R);
                   6571:        }
                   6572:        R=reverse(R);
                   6573:        if(!F||H==1) return R;
                   6574:        return -4;
                   6575: }
                   6576:
1.45      takayama 6577: /* Opt: f, var, ord, to, in, TeX */
                   6578: def baseODE(L)
                   6579: {
1.47      takayama 6580:        SV=SVORG;
1.45      takayama 6581:        if(type(TeX=getopt(TeX))!=1) TeX=0;
                   6582:        if(type(F=getopt(f))!=1) F=0;
1.46      takayama 6583:        if(isint(In=getopt(in))!=1) In=0;
1.45      takayama 6584:        if(type(Ord=getopt(ord))!=1&&Ord!=0) Ord=2;
1.70      takayama 6585:        Pages=getopt(pages);
                   6586:        if(Pages!=1&&Pages!=2) Pages=0;
1.45      takayama 6587:        if(Ord>3){
                   6588:                Ord-=4; Hgr=1;
1.47      takayama 6589:        }else Hgr=0;
1.70      takayama 6590:        if(type(car(L0=L))==4&&type(L[1])==7){
1.45      takayama 6591:                Tt=L[1];L=car(L);
                   6592:        }
1.47      takayama 6593:        M=N=length(L);  SV=SVORG;
                   6594:        if(type(Var=getopt(var))==4&&(In>0||length(Var)==N)){
1.45      takayama 6595:                SV=Var;
                   6596:                M=length(SV);
                   6597:                if(type(car(SV))==2){
                   6598:                        for(R=[];SV!=[];SV=cdr(SV)) R=cons(rtostr(car(SV)),R);
                   6599:                        SV=reverse(R);
                   6600:                }
1.47      takayama 6601:        }else{
                   6602:                if(N>10){
                   6603:                        R=[];
                   6604:                        for(K=M-1;K>9;K++) R=cons(SV[floor(K/10)-1]+SV[K%10],R);
                   6605:                        SV=append(SV,R);
                   6606:                }
                   6607:                for(Var=[],I=M-1;I>=0;I--) Var=cons(makev([SV[I]]),Var);
                   6608:        }
                   6609:        if(type(To=getopt(to))<2||type(To)>4) To=0;
1.70      takayama 6610:        if(Ord<0){      /* cancell y1, z1,... by baseODE0() */
1.73      takayama 6611:                if(Ord==-1) Ord=2;
                   6612:                if(type(To)==4||!isvar(To)){
                   6613:                        L=L0=baseODE(L0|to=To,f=-3)[1];
                   6614:                        To=0;
                   6615:                }
1.70      takayama 6616:                R=baseODE0(L|option_list=
                   6617:                        delopt(getopt(),[["var",Var],["ord",Ord]]|inv=1));
                   6618:                if(TeX){
                   6619:                        if(type(R)==4&&length(R)>1&&type(R[1])==4) R=R[1];
1.73      takayama 6620:                        if(type(To)==2 && !isvar(To)){
                   6621:                                S0=baseODE(L0|TeX=1,f=-1,to=To);
                   6622:                                V=baseODE0(L|step=-1,to=To);
                   6623:                        }else{
                   6624:                                S0=baseODE(L0|TeX=1,f=-1);
                   6625:                                V=baseODE0(L|step=-1,to=To);
                   6626:                        }
1.70      takayama 6627:                        T=eqs2tex(R,[V,2,Pages]);
                   6628:                        S=((F==1)?(Tt+"\n"):S0)+texbegin("align*",T);
                   6629:                        if(TeX==2) dviout(S);
                   6630:                        return S;
                   6631:                }
                   6632:                return R;
                   6633:        }
                   6634:        if(To&&!isvar(To)){
1.49      takayama 6635:                if(type(To)!=4){
                   6636:                        To=red(To);
                   6637:                        for(K=0;K<length(Var);K++){
                   6638:                                I=mydeg(nm(To),Var[K]);J=mydeg(dn(To),Var[K]);
                   6639:                                if(I+J>0&&I<2&&J<2) break;
                   6640:                        }
                   6641:                        if(K==length(Var)) return -9;
                   6642:                        J=To;
                   6643:                        for(To=[],I=length(Var)-1;I>=0;I--)
                   6644:                                if(I!=K) To=cons(Var[I],To);
                   6645:                        To=cons(J,To);
                   6646:                }
1.47      takayama 6647:                if(type(To)==4){
                   6648:                        if(type(car(To))==4){
                   6649:                                R=1;To=car(To);
                   6650:                        }else R=0;
1.48      takayama 6651:                        if(type(IL=solveEq(To,Var|inv=1))!=4) return IL;
1.47      takayama 6652:                        if(R==1){
                   6653:                                R=To;To=IL;IL=R;
                   6654:                        }
                   6655:                        L=mulsubst(L,[Var,IL]|lpair=1);
                   6656:                        if(!In){   /* X_i'=\sum_j(\p_{x_j}X_i)*x_j' */
                   6657:                                for(TL=[],I=M-1;I>=0;I--){
                   6658:                                        P=To[I];Q=mydiff(P,t);
                   6659:                                        for(J=0;J<M;J++) Q=red(Q+mydiff(P,Var[J])*L[J]);
                   6660:                                        TL=cons(Q,TL);
                   6661:                                }
                   6662:                                L=TL;
                   6663:                        }else{  /* x_i'=\sum_j(\p_{X_j}x_i)*X_j' */
                   6664:                                for(I=M-1;I>=0;I--){
                   6665:                                        P=IL[I];Q=mydiff(P,t);
                   6666:                                        for(J=0;J<M;J++){
                   6667:                                                V=makev([SV[J],1]);
                   6668:                                                Q=red(Q+mydiff(P,V)*V);
                   6669:                                        }
                   6670:                                        L=mysubst(L,[makev([SV[I],1]),TL[I]]);
                   6671:                                }
                   6672:                                for(TL=L,L=[],I=M-1;I>=0;I--) L=cons(num(TL[I]),L);
                   6673:                        }
                   6674:                }
1.45      takayama 6675:        }
1.73      takayama 6676:        if(F==-3&&!TeX) return [Var,L];
1.48      takayama 6677:        for(I=0;I<M;I++) L=subst(L,Var[I],makev([SV[I],0]));
1.45      takayama 6678:        if(TeX){
                   6679:                for(TL=L,I=0;I<M;I++)
1.47      takayama 6680:                        TL=subst(TL,makev([SV[I],0]),Var[I]);
1.45      takayama 6681:                for(I=0;I<N;I++){
                   6682:                        if(I) S0+=",\\\\\n";
                   6683:                        if(In) S0+=" "+my_tex_form(TL[I])+"=0";
                   6684:                        else S0+=" "+SV[I]+"'\\!\\!\\! &= "+my_tex_form(TL[I]);
                   6685:                }
                   6686:                S0+=".\n";
                   6687:                S0=texbegin("cases", S0);
                   6688:                S0=texbegin("align",S0);
                   6689:                if(type(Tt)==7) S0=Tt+"\n"+S0;
1.47      takayama 6690:                if(F<0){
1.70      takayama 6691:                        if(TeX==2)dviout(S0);
1.45      takayama 6692:                        return S0;
                   6693:                }
                   6694:        }
1.47      takayama 6695:        for(I=0,TL=[];L!=[];L=cdr(L),I++){
                   6696:                T=car(L);
                   6697:                if(!In) T=makev([SV[I],1])-T;
                   6698:                TL=cons(nm(red(T)),TL);
1.45      takayama 6699:        }
1.47      takayama 6700:        if(isvar(To)){
1.48      takayama 6701:                T=rtostr(To);
1.45      takayama 6702:                IT=findin(T,SV);
                   6703:                if(IT>=0 && IT<M){
                   6704:                        R=[SV[IT]];
                   6705:                        for(J=0;SV!=[];SV=cdr(SV),J++){
                   6706:                                if(J==IT) continue;
                   6707:                                R=cons(car(SV),R);
                   6708:                        }
                   6709:                        SV=reverse(R);
                   6710:                }else{
                   6711:                        IT=0;
                   6712:                        mycat(["Cannot find variable", T, "!\n"]);
                   6713:                }
                   6714:        }
                   6715:        for(S=1;S<M;S++){
                   6716:                L=append(TL,L);
                   6717:                TL=reverse(TL);
                   6718:                for(RL=[];TL!=[];TL=cdr(TL)){
                   6719:                        if(In==0&&S==N-1&&length(TL)!=N-IT) continue;
1.47      takayama 6720:                        T=car(TL);R=mydiff(V,t);
1.45      takayama 6721:                        for(I=0;I<M;I++){
                   6722:                                for(J=0;J<=S;J++){
                   6723:                                        V=makev([SV[I],J]|num=1);
1.47      takayama 6724:                                        if((DR=mydiff(T,V))!=0) R+=DR*makev([SV[I],J+1]|num=1);
1.45      takayama 6725:                                }
                   6726:                        }
                   6727:                        RL=cons(R,RL);
                   6728:                }
                   6729:                TL=RL;
                   6730:        }
                   6731:        L=append(TL,L);
1.48      takayama 6732:        for(I=0;I<M;I++) L=subst(L,makev([SV[I],0]),Var[I]);
1.70      takayama 6733:        if(!isint(Vl=getopt(vl))) Vl=0;
                   6734:        if(!Vl||Vl==1){
                   6735:                V=[makev([SV[0]])];
                   6736:                for(VV=[],J=1;J<=M;J++)
                   6737:                        V=cons(makev([SV[0],J]),V);
                   6738:                for(I=1;I<M;I++)
                   6739:                        V=cons(makev([SV[I]]),V);
1.45      takayama 6740:                if(F==-2){
                   6741:                        VV=cons(V,VV);
                   6742:                        V=[];
                   6743:                }
1.70      takayama 6744:                for(I=1;I<M;I++){
                   6745:                        for(J=1;J<M;J++) V=cons(makev((!Vl)?[SV[I],J]:[SV[J],I]),V);
                   6746:                        if(In) V=cons(makev([SV[0],M]),V);
                   6747:                        if(F==-2){
                   6748:                                VV=cons(V,VV);
                   6749:                                V=[];
                   6750:                        }
                   6751:                }
                   6752:        }else{
                   6753:                for(V=VV=[],I=0;I<M;I++){
                   6754:                        for(J=0;J<M;J++) V=cons(J?makev([SV[I],J]):makev([SV[I]]),V);
                   6755:                        if(!I||In) V=cons(makev([SV[0],M]),V);
                   6756:                        if(F==-2){
                   6757:                                VV=cons(V,VV);
                   6758:                                V=[];
                   6759:                        }
                   6760:                }
1.45      takayama 6761:        }
                   6762:        if(F>=0&&!chkfun("gr",0)){
                   6763:                mycat("load(\"gr\"); /* <- do! */\n");
                   6764:                F=-1;
                   6765:        }
                   6766:        if(F==-2) return [VV,L];
                   6767:        if(F<0) return [V,L];
1.70      takayama 6768:        LL=(Hgr==1)?hgr(L,V,Ord):gr(L,V,Ord);
1.45      takayama 6769:        if(F==2) return [V,L,LL];
                   6770:        if(Ord==2) P=LL[0];
                   6771:        else{
                   6772:                P=LL[length(LL)-1];
                   6773:                for(RV=reverse(V), I=0;I<M+1;I++) RV=cdr(RV);
                   6774:                if(lsort(vars(P),RV,2)!=[]){
                   6775:                        LL=tolex_tl(LL,V,Ord,V,2);P=LL[0];
                   6776:                }
                   6777:        }
                   6778:        if(TeX){
1.70      takayama 6779:                for(V0=[],I=1;I<=M;I++) V0=cons(makev([car(SV),I]),V0);
                   6780:                T=eqs2tex(P,[V0,2,Pages]);
                   6781:                if(!Vl||Vl==1){
                   6782:                        for(I=1,K=0;I<length(LL);I++){
                   6783:                                TV=makev([SV[I-K]]);
                   6784:                                if(findin(TV,vars(LL[I]))<0){
                   6785:                                                K++;continue;
                   6786:                                }
                   6787:                                T+=eqs2tex(LL[I],[cons(TV,V0),2,Pages,1]);
                   6788:                        }
                   6789:                }
                   6790:                S=((F==1)?(Tt+"\n"):S0)+texbegin("align*",T);
1.45      takayama 6791:                if(TeX==2) dviout(S);
                   6792:                return S;
                   6793:        }
                   6794:        return (F==1)? P:[P,V,L,LL];
                   6795: }
                   6796:
1.70      takayama 6797:
                   6798: def eqs2tex(P,L)
                   6799: {
                   6800:        if(isvar(L)) L=[0,L];
                   6801:        if(type(L)!=4) L=[];
                   6802:        Sgn=0;
                   6803:        if(L!=[]){
1.71      takayama 6804:                if(car(L)==0) L=[L];
                   6805:                else if(length(L)>1 && isvar(L[1])) L=[L];
1.70      takayama 6806:                R=car(L);L=cdr(L);Sgn=1;
                   6807:        }else R=[];
                   6808:        if(type(R)==4&&car(R)==0){
                   6809:                Sgn=0;R=cdr(R);
                   6810:        }
                   6811:        if(L!=[]){
                   6812:                Dic=car(L);L=cdr(L);
                   6813:        }
                   6814:        if(L!=[]){
                   6815:                Pages=car(L);L=cdr(L);
                   6816:        }
                   6817:        if(L!=[]) Cont=car(L);
                   6818:        if(type(P)==4){
                   6819:                for(S="";P!=[];P=cdr(P)){
                   6820:                        S+=eqs2tex(car(P),[R,Dic,Pages,Cont]);
                   6821:                        if(!Cont) Cont=1;
                   6822:                }
1.73      takayama 6823: /*             S=str_subst(S,"\\\\&,\\\\",",\\\\&"); */
1.70      takayama 6824:                if(getopt(dviout)==1) dviout(S|eq=6);
                   6825:                return S;
                   6826:        }
                   6827:        if(type(R)==2) R=[R];
                   6828:        if(Sgn){
                   6829:                for(;R!=[];R=cdr(R))
                   6830:                        if((Deg=mydeg(P,car(R)))>0) break;
                   6831:                if(Deg>0){
                   6832:                        CP=mycoef(P,Deg,car(R));
                   6833:                        if(cmpsimple(-CP,CP)<0) P=-P;
                   6834:                }
                   6835:        }
                   6836:        S="&\\!\\!\\!";
                   6837:        if(Cont)
                   6838:                 S=(Pages?",\\allowdisplaybreaks":",")+"\\\\\n"+S;
                   6839:        S+=fctrtos(P|var=R,dic=Dic,TeX=3,pages=Pages);
                   6840:        if(getopt(dviout)==1) dviout(S|eq=6);
                   6841:        return S;
                   6842: }
                   6843:
1.71      takayama 6844: /* Opt: var, opt, dbg */
1.70      takayama 6845: def res0(P,Q,X)
                   6846: {
1.71      takayama 6847:        if(!isvar(X)){
                   6848:                if(!isvar(P)) return -1;
                   6849:                Y=P;P=Q;Q=X;X=Y;
                   6850:        }
                   6851:        if(isvar(Var=getopt(var))) Var=[Var];
1.73      takayama 6852:        else if(type(Var)!=4) Var=0;
                   6853:        if(type(W=getopt(w))!=4) W=[];
                   6854:        if(!isint(Opt=getopt(opt))&&type(Opt)!=4) Opt=0;
1.72      takayama 6855:        if(type(Dbg=getopt(dbg))==4){
                   6856:                Fct=Dbg[1];Dbg=Dbg[0];
                   6857:        }
                   6858:        if(!isint(Dbg)) Dbg=0;
1.70      takayama 6859:        P=nm(P);Q=nm(Q);
1.71      takayama 6860:        Fctr=isfctr(P)*isfctr(Q);
1.70      takayama 6861:        DP=deg(P,X);DQ=deg(Q,X);
1.71      takayama 6862:        if(DP==DQ&&nmono(coef(P,DP,X))<nmono(coef(Q,DQ,X))){
                   6863:                R=P;P=Q;Q=R;
                   6864:                R=DP;DP=DQ;DQ=R;
                   6865:        }
1.70      takayama 6866:        while(DQ>0){
                   6867:                if(DP<DQ){
                   6868:                        R=P;P=Q;Q=R;
                   6869:                        R=DP;DP=DQ;DQ=R;
                   6870:                        if(Opt==-1) return [P,Q,DP,DQ];
                   6871:                        if(DQ<1) break;
                   6872:                }
1.72      takayama 6873:                if(Dbg){
                   6874:                        if(Dbg>=2) mycat([DP,"(",nmono(P), nmono(coef(P,DP,X)),") :",
                   6875:                                DQ, "(",nmono(Q),nmono(coef(Q,DQ,X)), ")"]);
                   6876:                        else mycat0([DP,":",DQ,","],0);
                   6877:                }
1.70      takayama 6878:                TQ=coef(Q,DQ,X);TP=coef(P,DP,X);
1.71      takayama 6879:                if(Fctr){
                   6880:                        T=gcd(TP,TQ);M=red(TQ/T);
                   6881:                        if(Var&&M!=car(W)&&type(TV=vars(M))==4&&lsort(TV,Var,2)!=[]) W=cons(M,W);
                   6882:                        P=M*(P-coef(P,DP,X)*X^DP)-red(TP/T)*X^(DP-DQ)*(Q-coef(Q,DQ,X)*X^DQ);
                   6883:                        if(Var){
1.72      takayama 6884: #if 1
                   6885:                                if(Dbg>2) mycat0(">",0);
                   6886:                                for(S=SS=fctr(P),P=1,C=0;S!=[];S=cdr(S)){
1.71      takayama 6887:                                        TV=vars(S0=car(S)[0]);
                   6888:                                        if(type(TV)==4&&lsort(TV,Var,2)!=[]){
1.72      takayama 6889:                                                for(TW=W;TW!=[];TW=cdr(TW)){
1.71      takayama 6890:                                                        if(gcd(car(TW),S0)!=1){
                   6891:                                                                S0=1;break;
                   6892:                                                        }
1.72      takayama 6893:                                                }
                   6894:                                                if(Dbg>1){
                   6895:                                                        if(S0==1) mycat(["Reduced by :",nmono(car(TW))]);
                   6896:                                                        else if(C++>0){
                   6897:                                                                mycat(["Product :", nmono(P), nmono(S0)]);
                   6898:                                                                if(Dbg==3){
                   6899:                                                                        if(!Fct||Fct==[]){
1.73      takayama 6900:                                                                                if(C>1) P=1;
1.72      takayama 6901:                                                                        }else{
                   6902:                                                                                if(car(Fct)==C){
                   6903:                                                                                        C=10000;Fct=cdr(Fct);P=1;
                   6904:                                                                                }else S0=1;
                   6905:                                                                        }
                   6906:                                                                }else if(Dbg==4) return [SS,Q,DP,DQ,W];
                   6907:                                                        }
                   6908:                                                }
1.71      takayama 6909:                                                P*=S0;
                   6910:                                        }
                   6911:                                }
1.72      takayama 6912: #else
                   6913:                                for(TW=W;TW!=[];TW=cdr(TW)){
                   6914:                                        if((C=gcd(P,car(TW)))!=1){
                   6915:                                                P=red(P/C);
                   6916:                                                if(Dbg>=2&&nmono(Q)>1) mycat(["Reduce :",nmono(C)]);
                   6917:                                        }
                   6918:                                }
                   6919: #endif
1.70      takayama 6920:                        }
1.71      takayama 6921:                }else{
                   6922:                        if(type(TQ)==1){
                   6923:                                Q/=TQ;
                   6924:                                P=P-TP*X^(DP-DQ)*Q;
                   6925:                        }else P=TQ*P-TP*X^(DP-DQ);
                   6926:                        if(deg(P,X)==DP) P-=coef(P,DP,X)*X^DP;
1.70      takayama 6927:                }
                   6928:                DP=deg(P,X);
1.73      takayama 6929:                if(Opt==-2||(type(Opt)==4&&Opt[0]==DP&&Opt[1]==DQ)) return [P,Q,DP,DQ,W];
1.72      takayama 6930:        }
                   6931:        if(Dbg){
                   6932:                if(Dbg>1)  mycat([DP,"(",nmono(P), nmono(coef(P,DP,X)),") :",
                   6933:                        DQ, "(",nmono(Q), nmono(coef(Q,DQ,X)), ")"]);
                   6934:                else mycat0([DP,":",DQ," "],0);
1.70      takayama 6935:        }
1.73      takayama 6936:        if(Opt==1) Q=[P,Q,DP,DQ,W];
1.70      takayama 6937:        return (DQ==0)?Q:0;
                   6938: }
                   6939:
1.72      takayama 6940: /* Opt : f, var, ord, ord, step, f, to */
1.70      takayama 6941: def baseODE0(L)
                   6942: {
1.73      takayama 6943:        if(!isint(Ord=getopt(ord))) Ord=-1;
                   6944:        if(Ord==-1) Ord=2;
                   6945:        if(Ord<O) Ord++;
1.70      takayama 6946:        if(!isint(F=getopt(f))) F=0;
1.73      takayama 6947:        if(!isint(Dbg=getopt(dbg))) Dbg=0;
                   6948:        if(type(Step=getopt(step))==4) Dstep=Step;
                   6949:        else Dstep=0;
                   6950:        if(!isint(Step)) Step=0;
1.70      takayama 6951:        if(F<0) Step=1;
                   6952:        if(Step>0&&Ord>0) Ord=-1;
                   6953:        N=length(L);
                   6954:        if(type(To=getopt(to))==4&&length(To)==N){
                   6955:                V=cdr(To);To=car(To);
                   6956:        }
1.72      takayama 6957:        if(!isvar(To)) To=V=0;
1.70      takayama 6958:        if(type(SV=Var=getopt(var))!=4){
                   6959:                SV=SVORG;
                   6960:                if(N>10){
                   6961:                        R=[];
                   6962:                        for(K=N-1;K>9;K++) R=cons(SV[floor(K/10)-1]+SV[K%10],R);
                   6963:                        SV=append(SV,R);
                   6964:                }
                   6965:                for(Var=[],I=N-1;I>=0;I--) Var=cons(makev([SV[I]]),Var);
                   6966:        }
                   6967:        if((J=findin(To,Var))>0){
                   6968:                TV=TL=[];
                   6969:                for(I=N-1;I>=0;I--){
                   6970:                        if(I!=J){
                   6971:                                TV=cons(Var[I],TV);TL=cons(L[I],TL);
                   6972:                        }
                   6973:                }
                   6974:                Var=cons(Var[J],TV);L=cons(L[J],TL);
                   6975:        }
                   6976:        if(!To) To=car(SV);
                   6977:        Q=car(L);
                   6978:        V0=makev([To,1]);
                   6979:        R=[V0-Q];V0=[V0];
                   6980:        for(I=2;I<=N;I++){
                   6981:                P=diff(t,Q);
                   6982:                if(type(P)==3) P=red(P);
                   6983:                for(TV=Var,TL=L;TV!=[];TV=cdr(TV),TL=cdr(TL)){
                   6984:                        P+=diff(Q,car(TV))*car(TL);
                   6985:                        if(type(P)==3) P=red(P);
                   6986:                }
                   6987:                Q=P;
                   6988:                TV=makev([To,I]);
                   6989:                R=cons(nm(TV-Q),R);
                   6990:                V0=cons(TV,V0);
                   6991:        }
                   6992:        if(Step==-1) return V0;
                   6993:        if(!V) V=cdr(Var);
                   6994:        if(Ord<0){
                   6995:                for(C=1,R0=[];V!=[];V=cdr(V),C++){
                   6996:                        TR=R=reverse(R);
                   6997:                        if(length(R)>1){        /* reduce common factor */
                   6998:                                P=car(TR);TR=cdr(TR);
1.72      takayama 6999:                                for(;TR!=[]&&P!=1;TR=cdr(TR))
1.70      takayama 7000:                                        P=gcd(P,car(TR));
                   7001:                                if(P!=1){
                   7002:                                        for(TR=[];R!=[];R=cdr(R)) TR=cons(red(car(R)/P),TR);
                   7003:                                        R=reverse(TR);
                   7004:                                }
                   7005:                        }
                   7006:                        TR=[];
                   7007:                        TV=car(V);
                   7008:                        if(length(V)==1) V0=[car(V0)];
                   7009:                        if(C==Step) return [append(V,V0),R];
                   7010:                        while(R!=[]&&findin(TV,vars(car(R)))<0){
                   7011:                                TR=cons(car(R),TR);
                   7012:                                R=cdr(R);
                   7013:                        }
1.72      takayama 7014:                        R0=(F==2)?append(R,R0):cons(car(R),R0);
1.70      takayama 7015:                        if(R!=[]){
1.73      takayama 7016:                                for(W=[],P=car(R),R=cdr(R); R!=[]; R=cdr(R)){
1.72      takayama 7017:                                        if(Dbg) mycat0(["\nStep ",C,"-",length(R)," ",TV,
                   7018:                                                (type(Dbg)==4||Dbg>=2)?"\n":" "],0);
1.70      takayama 7019:                                        if(findin(TV,vars(car(R)))<0){
                   7020:                                                TR=cons(car(R),TR);
                   7021:                                                continue;
                   7022:                                        }
                   7023:                                        if(Ord>-3){
1.73      takayama 7024:                                                if(Dstep&&Dstep[0]==C&&Dstep[1]==length(R))
                   7025:                                                        return res0(P,car(R),TV|var=V0,opt=cdr(cdr(Dstep)),dbg=Dbg);
                   7026:                                                else TQ=res0(P,car(R),TV|var=V0,opt=1,dbg=Dbg,w=W);
1.72      takayama 7027:                                                if(Dbg==4&&type(car(TQ))==4) return TQ;
1.70      takayama 7028:                                                if(Ord==-2) P=car(TQ);
1.73      takayama 7029:                                                W=TQ[4];TQ=TQ[1];
1.72      takayama 7030:                                        }else{
                   7031:                                                TQ=res(TV,P,car(R));
                   7032:                                                Q=fctr(TQ);     /* irreducible one */
                   7033:                                                for(TQ=1;Q!=[];Q=cdr(Q))
                   7034:                                                        if(lsort(V0,vars(car(Q)[0]),2)!=[]) TQ*=car(Q)[0];
                   7035:                                        }
1.70      takayama 7036:                                        TR=cons(TQ,TR);
                   7037:                                }
                   7038:                        }
                   7039:                        R=TR;
                   7040:                }
1.71      takayama 7041:                if(Dbg==1) mycat([]);
1.72      takayama 7042:                return (F==1)?car(R):(F==2?append(R,R0):cons(car(R),R0));
1.70      takayama 7043:        }
                   7044:        V=append(V,[makev([To,N])]);
                   7045:        if(Step==1) return [R,V];
                   7046:        R=gr(R,V,Ord);
                   7047:        return (F==1)?car(R):R; /* hgr(R,V,Ord); */
                   7048: }
                   7049:
                   7050:
1.26      takayama 7051: def taylorODE(D){
                   7052:        Dif=(getopt(dif)==1)?1:0;
                   7053:        if(D==0) return Dif?f:f_00;
1.27      takayama 7054:        if(type(T=getopt(runge))!=1||ntype(T)!=0) T=0;
1.26      takayama 7055:        if(type(F=getopt(f))!=7&&type(F)<2) F="f_";
                   7056:        if(type(D)!=1||ntype(D)!=0||D<0||D>30) return 0;
                   7057:        if(type(H=getopt(taylor))==4&&length(H)==2){
1.27      takayama 7058:                if(type(Lim=getopt(lim))==2) DD=D;
                   7059:                else if(type(Lim)==4){
                   7060:                        DD=Lim[1];Lim=Lim[0];
                   7061:                }else Lim=0;
                   7062:                for(R=I=0;I<=D;I++){
                   7063:                        if(I){
                   7064:                                if(Lim) H0=mulpolyMod(H0,H[0],Lim,DD);
                   7065:                                else H0*=H[0];
                   7066:                        }else  H0=1;
                   7067:                        if(type(F)!=7) G=I?mydiff(G,x):F;
                   7068:                        for(J=0;J<=D-I;J++){
                   7069:                                if(J){
                   7070:                                        if(Lim) H1=mulpolyMod(H1,H[1],Lim,DD);
                   7071:                                        else H1*=H[1];
                   7072:                                }else H1=H0;
                   7073:                                if(type(F)==7) G=makev([F,I,J]);
                   7074:                                else if(J) G=mydiff(G,y);
                   7075:                                R+=G*H1/fac(I)/fac(J);
1.26      takayama 7076:                        }
                   7077:                }
1.27      takayama 7078:                if(Lim) R=os_md.polcut(R,DD,Lim);
                   7079:                return R;
1.26      takayama 7080:        }else{
                   7081:                if(type(H=getopt(series))>=0||getopt(list)==1){
                   7082:                        if(type(F)!=7){
                   7083:                                for(PP=[F],I=1;I<D;I++)
                   7084:                                        PP=cons(mydiff(car(PP),x)+mydiff(car(PP),y)*F,PP);
                   7085:                                if(type(H)<0) return PP;
                   7086:                                for(R=0,DD=D;DD>=1;DD--,PP=cdr(PP)) R+=car(PP)*H^DD/fac(DD);
                   7087:                                return red(R);
                   7088:                        }
                   7089:                        if(type(H)>=0) D--;
                   7090:                        PP=taylorODE(D-1|list=1);
                   7091:                        if(type(PP)!=4) PP=[PP];
                   7092:                        P=car(PP);
                   7093:                }else P=taylorODE(D-1);
                   7094:                for(R=I=0;I<D;I++){
                   7095:                        for(J=0;J<D-I;J++){
                   7096:                                Q=diff(P,makev([F,I,J]));
                   7097:                                if(Q!=0) R+=Q*(f_00*makev([F,I,J+1])+makev([F,I+1,J]));
                   7098:                        }
                   7099:                }
                   7100:                if(getopt(list)==1){
                   7101:                        R=cons(R,PP);
                   7102:                        if(Dif!=1) return R;
                   7103:                }else if(type(H)>=0){
                   7104:                        R=y+R*H^(D+1)/fac(D+1);
                   7105:                        for(DD=D;DD>0;PP=cdr(PP),DD--) R+=car(PP)*H^(DD)/fac(DD);
                   7106:                        if(T){
1.35      takayama 7107:                                if(T<0){
                   7108:                                        Dif=0;TT=-T;
                   7109:                                }else TT=T;
1.26      takayama 7110:                                K=newvect(TT);K[0]=Dif?f:f_00;
1.35      takayama 7111:                                if(getopt(c1)==1) K[0]=taylorODE(D|taylor=[c_1*H,0]);
1.26      takayama 7112:                                for(I=1;I<TT;I++){
                   7113:                                        for(S=J=0;J<I;J++) S+=makev(["a_",I+1,J+1])*K[J];
1.35      takayama 7114:                                        K[I]=taylorODE(D|taylor=[makev(["c_",I+1])*H,S*H],lim=[H,D]);
1.26      takayama 7115:                                }
                   7116:                                for(S=I=0;I<TT;I++) S+=makev(["b_",I+1])*K[I];
                   7117:                                S=S*H+y;
                   7118:                                R=S-R;
                   7119:                                if(T<0){
                   7120:                                        for(V=[H],I=0;I<=D;I++)
                   7121:                                                for(J=0;J<=D-I;J++) V=cons(makev([F,I,J]),V);
                   7122:                                        return os_md.ptol(R,reverse(V)|opt=0);
                   7123:                                }
                   7124:                        }else T=0;
                   7125:                }
                   7126:        }
                   7127:        if(Dif){
                   7128:                for(I=0;I<=D;I++){
                   7129:                        for(J=0;J<=D;J++){
                   7130:                                if(I==0&&J==0){
                   7131:                                        R=subst(R,f_00,f);
                   7132:                                        continue;
                   7133:                                }
                   7134:                                V=makev([F,str_times("x",I),str_times("y",J)]);
                   7135:                                R=subst(R,makev([F,I,J]),V);
                   7136:                        }
                   7137:                }
                   7138:        }
                   7139:        return R;
                   7140: }
                   7141:
1.6       takayama 7142: def toeul(F,L,V)
                   7143: {
                   7144:        L = vweyl(L);
                   7145:        X = L[0]; DX = L[1];
                   7146:        I = mydeg(F,DX);
1.56      takayama 7147:        if(getopt(raw)!=1){
1.6       takayama 7148:                for(II=I; II>=0; II--){
1.56      takayama 7149:                        J = mydeg(P=mycoef(F,II,DX),X);
1.6       takayama 7150:                        if(II==I) S=II-J;
                   7151:                        else if(P!=0 && II-J>S) S=II-J;
                   7152:                }
                   7153:                F *= X^S;
1.56      takayama 7154:        }
                   7155:        if(V == "infty"){
                   7156:                for(R=0; I >= 0; I--)
1.6       takayama 7157:                         R += red((mysubst(mycoef(F,I,DX),[X,1/X])*(x*DX)^I));
                   7158:                return(subst(pol2sft(R,DX),DX,-DX));
                   7159:        }
1.56      takayama 7160:        for(R=0; I >= 0; I--)
1.6       takayama 7161:                R += (red(mycoef(F,I,DX)/X^I))*DX^I;
                   7162:        return pol2sft(R,DX);
                   7163: }
                   7164:
                   7165: /*
                   7166: def topoldif(P,F,L)
                   7167: {
                   7168:        L = vweyl(L);
                   7169:        P = nm(red(P));
                   7170:        while(deg(P,L[1]) > 0){
                   7171:                R = coef(P,0,L[0]);
                   7172:                Q = red((P-R)/(F*L[0]);
                   7173:                P = nm(Q)*zz+F*R*dn(Q);
                   7174:        }
                   7175: }
                   7176: */
                   7177:
                   7178: def fromeul(P,L,V)
                   7179: {
                   7180:        if(P == 0)
                   7181:                return 0;
                   7182:        L = vweyl(L);
                   7183:        X = L[0]; DX = L[1];
                   7184:        I = mydeg(P,DX);
                   7185:        if(V == "infty"){
                   7186:                P = subst(P,DX,-DX);
                   7187:                J = mydeg(P,X);
                   7188:                P = red(mysubst(P,[X,1/X])*X^J);
                   7189:        }
                   7190:        R = mycoef(P,0,DX);
                   7191:        S = 1;
                   7192:        for(S = J = 1; J <= I; J++){
                   7193:                S = DX*(S*X + mydiff(S,DX));
                   7194:                R += mycoef(P,J,DX)*S;
                   7195:        }
1.56      takayama 7196:        if(getopt(raw)!=1){
                   7197:                while(mycoef(R,0,X) == 0)
                   7198:                        R = tdiv(R,X);
                   7199:        }
1.6       takayama 7200:        if(V != "infty" && V != 0)
                   7201:                R = mysubst(R,[X,X-V]);
                   7202:        return R;
                   7203: }
                   7204:
                   7205: def sftexp(P,L,V,N)
                   7206: {
                   7207:        L = vweyl(L); DX = L[1];
1.56      takayama 7208:        P = mysubst(toeul(P,L,V|opt_list=getpt()),[DX,DX+N]);
1.70      takayama 7209:        return fromeul(P,L,V|option_list=getopt());
1.6       takayama 7210: }
                   7211:
                   7212:
                   7213: def fractrans(P,L,N0,N1,N2)
                   7214: {
                   7215:        L = vweyl(L);
                   7216:        if(N2 != "infty"){
                   7217:                if(N0 == "infty")
                   7218:                        N0 = 0;
                   7219:                else
                   7220:                        N0 = red(1/(N0-N2));
                   7221:                if(N1 == "infty")
                   7222:                        N1 = 0;
                   7223:                else
                   7224:                        N1 = red(1/(N1-N2));
                   7225:                P = mysubst(P,[L[0],L[0]+N2]);
                   7226:                P = fromeul(toeul(P,L,"infty"),L,0);
                   7227:        }
                   7228:        if(N0 != 0){
                   7229:                P = mysubst(P,[L[0],L[0]+N0]);
                   7230:                N1 -= N0;
                   7231:        }
                   7232:        if(N1 != 1)
                   7233:                P = mysubst(P,[[L[0],L[0]/N1],[L[1],L[1]*N1]]);
                   7234:        return P;
                   7235: }
                   7236:
                   7237: def soldif(P,L,V,Q,N)
                   7238: {
                   7239:        L = vweyl(L); X = L[0]; DX = L[1];
                   7240:        P = mysubst(toeul(P,L,V),[DX,DX+Q]);
                   7241:        DEG = mydeg(P,X);
                   7242:        P0 = newvect(DEG+1);
                   7243:        for(I = 0; I <= DEG; I++)
                   7244:                P0[I] = coef(P,I,X);
                   7245:        if(P0[0] == 0)
                   7246:                return 0;
                   7247:        if(subst(P0[0],DX,0) != 0){
                   7248:                mycat([Q,"is not the exponent at", V])$
                   7249:                return 0;
                   7250:        }
                   7251:        R = newvect(N+1);
                   7252:        R[0] = 1;
                   7253:        for(I = 1; I <= N; I++){
                   7254:                for(S = 0, K = 1; K <= DEG && K <= I; K++)
                   7255:                        S += mysubst(P0[K],[DX,I-K])*R[I-K];
                   7256:                S = red(S);
                   7257:                M = mysubst(P0[0],[DX,I]);
                   7258:                if(M != 0){
                   7259:                        R[I] = -red(S/M);
                   7260:                        if(R1 != 0){
                   7261:                                for(S = 0, K = 1; K <= DEG && K <= I; K++)
                   7262:                                        S += mysubst(P0[K],[DX,I-K])*R1[I-K] +
                   7263:                                                         mysubst(P1[K],[DX,I-K])*R[I-K];
                   7264:                                R1[I] = -red(S/M);
                   7265:                        }
                   7266:                }else{
                   7267:                        if(S == 0){
                   7268:                                if(R1 != 0){
                   7269:                                        for(S = 0, K = 1; K <= DEG && K <= I; K++)
                   7270:                                                 S += mysubst(P0[K],[DX,I-K])*R1[I-K] +
                   7271:                                                                 mysubst(P1[K],[DX,I-K])*R[I-K];
                   7272:                                }
                   7273:                                if(S == 0)
                   7274:                                        continue;
                   7275:                        }
                   7276:                        R1 = newvect(N+1);
                   7277:                        for(K = 0; K < I; K++){
                   7278:                                R1[K] = R[K];
                   7279:                                R[K] = 0;
                   7280:                        }
                   7281:                        R1[I] = 0;
                   7282:                        P1 = newvect(DEG);
                   7283:                        for(K = 0; K <= DEG; K++)
                   7284:                                P1[K] = mydiff(P0[K], DX);
                   7285:                        M = mysubst(P1[0],[DX,I]);
                   7286:                        if(M == 0){
                   7287:                                cat(["multiple log at ", I])$
                   7288:                                return 0;
                   7289:                        }
                   7290:                        R[I] = -red(S/M);
                   7291:                }
                   7292:        }
                   7293:        if(R1 != 0)
                   7294:                return [R1, R];
                   7295:        else
                   7296:                return R;
                   7297: }
                   7298:
                   7299: def chkexp(P,L,V,Q,N)
                   7300: {
                   7301:        L = vweyl(L); X = L[0]; DX = L[1];
                   7302:        P = mysubst(toeul(P,L,V),[DX,DX+Q]);
                   7303:        P = fromeul(P,L,0);
                   7304:        D = mydeg(P,DX);
                   7305:        Z = mindeg(mycoef(P,D,DX), X) - (D-N);
                   7306:        R = [];
                   7307:        for(I = 0; I < Z; I++){
                   7308:                S = mycoef(P,I,X);
                   7309:                if(S != 0){
                   7310:                        for(J = mydeg(S,DX); J >= 0; J--){
                   7311:                                T = mycoef(S,J,DX);
                   7312:                                if(T != 0)
                   7313:                                        R = cons(T,R);
                   7314:                        }
                   7315:                }
                   7316:        }
                   7317:        return R;
                   7318: }
                   7319:
                   7320:
                   7321: def sqrtrat(P)
                   7322: {
                   7323:        if(P==0) return 0;
                   7324:        if(type(P)==3||type(P)==2){
                   7325:                P=red(P);
                   7326:                if(imag(dn(P))!=0||imag(nm(P))!=0){
                   7327:                        if(imag(dn(P))==0&&real(P)!=0){
                   7328:                                F=red(imag(P)/real(P));
                   7329:                                if(F==3^(1/2)||F==-3^(1/2)){
                   7330:                                        if(eval(real(P))<0)
                   7331:                                                return -real(P)+imag(P)*@i;
                   7332:                                        else{
                   7333:                                                if(eval(imag(P))>0) return imag(P)+real(P)*@i;
                   7334:                                                else return -imag(P)-real(P)*@i;
                   7335:                                        }
                   7336:                                }
                   7337:                        }
                   7338:                        return [];
                   7339:                }
                   7340:                F=fctr(dn(P));
                   7341:                R=sqrtrat(car(F)[0]);
                   7342:                for(F=cdr(F);F!=[];F=cdr(F)){
                   7343:                        if(!iand(car(F)[1],1)) R*=car(F)[0]^(car(F)[1]/2);
                   7344:                        else return [];
                   7345:                }
                   7346:                F=fctr(nm(P));
                   7347:                R=sqrtrat(car(F)[0])/R;
                   7348:                for(F=cdr(F);F!=[];F=cdr(F)){
                   7349:                        if(!iand(car(F)[1],1)) R*=car(F)[0]^(car(F)[1]/2);
                   7350:                        else return [];
                   7351:                }
                   7352:                return R;
                   7353:        }
                   7354:        if(ntype(P)==4){
                   7355:                P0=real(P);P1=imag(P)/2;
                   7356:                X=makenewv(P);
                   7357:                for(R=fctr(X^4-P0*X^2-P1^2);R!=[];R=cdr(R)){
                   7358:                        RT=car(R)[0];
                   7359:                        if(deg(RT,X)==1){
                   7360:                                X=-mycoef(RT,0,X)/mycoef(RT,1,X);
                   7361:                                return X+P1/X*@i;
                   7362:                        }
                   7363:                        if(deg(RT,X)==2){
                   7364:                                if((D=mycoef(RT,1,X)^2-4*mycoef(RT,2,X)*mycoef(RT,0,X))<0) continue;
                   7365:                                X=(-mycoef(RT,1,X)+sqrtrat(D))/(2*mycoef(RT,2,X));
                   7366:                                return X+P1*sqrt2rat(1/X)*@i;
                   7367:                        }
                   7368:                }
                   7369:                D=P0^2+4*P1^2;
                   7370:                if(P1>0) return ((sqrtrat(D)+P0)/2)^(1/2)+((sqrtrat(D)-P0)/2)^(1/2)*@i;
                   7371:                return ((sqrtrat(D)+P0)/2)^(1/2)-((sqrtrat(D)-P0)/2)^(1/2)*@i;
                   7372:        }else if(ntype(P)!=0) return [];
                   7373:        if(P==1) return P;
                   7374:        Dn=dn(P);Nm=nm(P);C=R=1;
                   7375:        N=pari(factor,Dn);
                   7376:        if(N){
                   7377:                for(II=car(size(N))-1;II>=0;II--){
                   7378:                        if(iand(K=N[II][1],1)){
                   7379:                                R*=N[II][0];
                   7380:                                K++;
                   7381:                        }
                   7382:                        C/=N[II][0]^(K/2);
                   7383:                }
                   7384:        }
                   7385:        N=pari(factor,Nm);
                   7386:        if(N){
                   7387:                for(II=car(size(N))-1;II>=0;II--){
                   7388:                        if(N[II][0]==-1){
                   7389:                                C*=@i;
                   7390:                        continue;
                   7391:                        }
                   7392:                        K=N[II][1];
                   7393:                        if(iand(K,1)){
                   7394:                                R*=N[II][0];
                   7395:                                K--;
                   7396:                        }
                   7397:                        if(K!=0) C*=N[II][0]^(K/2);
                   7398:                }
                   7399:        }
                   7400:        if(R!=1) C*=R^(1/2);
                   7401:        return C;
                   7402: }
                   7403:
                   7404: def fctri(F)
                   7405: {
                   7406:        R=(iscoef(F,os_md.israt))?fctr(F):[[1,1],[F,1]];
                   7407:        if(!iscoef(F,os_md.iscrat)||chkfun("af_noalg",0)==0) return R;
                   7408:        X=makenewv(vars(F));
                   7409:        for(S=[];R!=[];R=cdr(R)){
                   7410:                if(length(Var=vars(R0=car(R)[0])) == 1 && (D=mydeg(R0,Var=car(Var))) > 0){
                   7411:                        if(imag(T=mycoef(R0,D,Var))!=0) R0/=T;
                   7412:                        T=af_noalg(real(R0)+imag(R0)*X,[[X,X^2+1]]);
                   7413:                        if(length(T)>1||T[0][1]>1){
                   7414:                                T=subst(T,X,@i);
                   7415:                                for(; T!=[];T=cdr(T)){
                   7416:                                        if(vars(T[0])!=[])
                   7417:                                                S=cons([car(T)[0],car(T)[1]*car(R)[1]],S);
                   7418:                                }
                   7419:                                continue;
                   7420:                        }
                   7421:                }
                   7422:                S=cons(R[0],S);
                   7423:        }
                   7424:        return reverse(S);
                   7425: }
                   7426:
                   7427: def getroot(F,X)
                   7428: {
                   7429:        S=[];
                   7430:        if(type(Cpx=getopt(cpx))!=1) Cpx=0;
                   7431:        M=getopt(mult);
                   7432:        if(type(F) == 3)
                   7433:                F = nm(red(F));
                   7434:        for(R=fctri(F); length(R)>0; R = cdr(R)){
                   7435:                T=car(R);
                   7436:                P=car(T);
                   7437:                I=car(cdr(T));
                   7438:                if(mydeg(P,X)>0){
                   7439:                        if(mydeg(P,X)==1){
                   7440:                                C = mycoef(P,1,X);
                   7441:                                P = X - red(P/C);
                   7442:                        }else if(mydeg(P,X)==2 && Cpx>0){
                   7443:                                C2=mycoef(P,2,X);C1=mycoef(P,1,X);C0=mycoef(P,0,X);
                   7444:                                C=sqrt2rat(C1^2-4*C0*C2);
                   7445:                                C0=[];
                   7446:                                if(type(C)==0&&ntype(C)==0&&pari(issquare,-C)) C0=sqrt(C);
                   7447:                                else if(Cpx>1) C0=sqrtrat(C);
                   7448:                                if(C0==[]&&Cpx>2) C0=C^(1/2);
                   7449:                                if(C0!=[]){
                   7450:                                        if(M==1)
                   7451:                                                S=cons([I,sqrt2rat((-C1+C0)/(2*C2))],S);
                   7452:                                        else{
                   7453:                                                for(II=I; II>0; II--)
                   7454:                                                        S=cons(sqrt2rat((-C1+C0)/(2*C2)),S);
                   7455:                                        }
                   7456:                                        P=sqrt2rat((-C1-C0)/(2*C2));
                   7457:                                }
                   7458:                        }else if(mydeg(P,X)==3 && Cpx>1){
                   7459:                                Omg=(-1+3^(1/2)*@i)/2;
                   7460:                                PP=P/mycoef(P,3,X);
                   7461:                                C2=mycoef(PP,2,X)/3;
                   7462:                                PP=subst(PP,X,X-C2);
                   7463:                                if((C1=mycoef(PP,1,X))==0){
                   7464:                                        C0=mycoef(PP,0,X);
                   7465:                                        if(real(C0)==0||imag(C0)==0){
                   7466:                                                if(real(C0)==0){
                   7467:                                                        PP=getroot(X^3+imag(C0),X);
                   7468:                                                        if(length(PP)==3){
                   7469:                                                                for(;PP!=[];PP=cdr(PP)){
                   7470:                                                                        if(imag(PP[0])==0){
                   7471:                                                                                C0=PP[0]*@i;
                   7472:                                                                                break;
                   7473:                                                                        }
                   7474:                                                                }
                   7475:                                                                if(PP==[]) C0=0;
                   7476:                                                        }
                   7477:                                                }else{
                   7478:                                                        if(C0>0) C0=C0^(1/3);
                   7479:                                                        else C0=-(-C0)^(1/3);
                   7480:                                                }
                   7481:                                                if(C0!=0){
                   7482:                                                        if(M==1){
                   7483:                                                                S=cons([I,C0-C2],S);
                   7484:                                                                S=cons([I,C0*Omg-C2],S);
                   7485:                                                                S=cons([I,C0*(-1-Omg)-C2],S);
                   7486:                                                        }else{
                   7487:                                                                for(II=I; II>0; II--){
                   7488:                                                                        S=cons(C0-C2,S);
                   7489:                                                                        S=cons(C0*Omg-C2,S);
                   7490:                                                                        S=cons(C0*(-1-Omg)-C2,S);
                   7491:                                                                }
                   7492:                                                        }
                   7493:                                                        continue;
                   7494:                                                }
                   7495:                                        }
                   7496:                                }
                   7497:                                if(Cpx>2){
                   7498:                                        Q=X^2+(mycoef(PP,1,X)/3)*X+mycoef(PP,0,X)^3;
                   7499:                                        SQ=getroot(Q,X|cpx=2);
                   7500:                                        SQ=SQ[0]^(1/3);SQ2=mycoef(PP,0,X)/SQ;
                   7501:                                        if(M==1){
                   7502:                                                S=cons([I,SQ+SQ2-C2],S);
                   7503:                                                S=cons([I,SQ*Omg+SQ2*(-1-Omg)-C2],S);
                   7504:                                                S=cons([I,SQ*(-1-Omg)+SQ2*Omg-C2],S);
                   7505:                                        }else{
                   7506:                                                for(II=I; II>0; II--){
                   7507:                                                        S=cons(SQ+SQ2-C2,S);
                   7508:                                                        S=cons(SQ*Omg+SQ2*(-1-Omg)-C2,S);
                   7509:                                                        S=cons(SQ*(-1-Omg)+SQ2*Omg-C2,S);
                   7510:                                                }
                   7511:                                        }
                   7512:                                        continue;
                   7513:                                }
                   7514:                        }else if(mydeg(P,X)==4 && Cpx>0){
                   7515:                                C2=mycoef(P,3,X)/(4*mycoef(P,4,X));
                   7516:                                PP=subst(P,X,X-C2);
                   7517:                                if(mycoef(PP,1,X)==0){
                   7518:                                        PP=mycoef(PP,4,X)*X^2+mycoef(PP,2,X)*X+(SQ2=mycoef(PP,0,X));
                   7519:                                        SQ=getroot(PP,X|cpx=2);
                   7520:                                        if(length(SQ)==2){
                   7521:                                                if((C0=sqrtrat(SQ[0]))==[]){
                   7522:                                                        if(mycoef(PP,1,X)==0){
                   7523:                                                                if(SQ2<0) C0=(-SQ2)^(1/4);
                   7524:                                                                else C0=SQ2^(1/4)*(1+@i)/2;
                   7525:                                                        }
                   7526:                                                        else if(Cpx>2) C0=SQ[0]^(1/2);
                   7527:                                                        else C0=0;
                   7528:                                                }
                   7529:                                                if((C1=sqrtrat(SQ[1]))==[]){
                   7530:                                                        if(mycoef(PP,1,X)==0) C1=-C0;
                   7531:                                                        else C1=SQ[1]^(1/2);
                   7532:                                                }
                   7533:                                                if(C0!=0){
                   7534:                                                        if(M==1)
                   7535:                                                                S=append([[I,C0-C2],[I,-C0-C2],[I,C1-C2],[I,-C1-C2]],S);
                   7536:                                                        else{
                   7537:                                                                for(II=I; II>0; II--)
                   7538:                                                                        S=append([C0-C2,-C0-C2,C1-C2,-C1-C2],S);
                   7539:                                                        }
                   7540:                                                        continue;
                   7541:                                                }
                   7542:                                        }
                   7543:                                }else{
                   7544:                                        PP/=mycoef(PP,4,X);
                   7545:                                        CC=mycoef(PP,2,X);C1=mycoef(PP,1,X);C0=mycoef(PP,0,X);
                   7546:                                        SQ=getroot(X*(CC+X)^2-4*C0*X-C1^2,X|cpx=Cpx);
                   7547:                                        if(length(SQ)>1){
                   7548:                                                SQ=sqrt2rat(SQ[0]);
                   7549:                                                SQ2=getroot(X^2-SQ,X|cpx=Cpx);
                   7550:                                                if(length(SQ2)>1){
                   7551:                                                        C1=SQ2[0]*X-C1/SQ2[0]/2;
                   7552:                                                        C0=getroot(X^2+CC/2+SQ/2+C1,X|cpx=Cpx);
                   7553:                                                        C1=getroot(X^2+CC/2+SQ/2-C1,X|cpx=Cpx);
                   7554:                                                        if(length(C0)>1&&length(C1)>1){
                   7555:                                                                C0=[sqrt2rat(C0[0]-C2),sqrt2rat(C0[1]-C2),
                   7556:                                                                        sqrt2rat(C1[0]-C2),sqrt2rat(C1[1]-C2)];
                   7557:                                                                if(M==1) for(II=0;II<4;II++) S=cons([I,C0[II]],S);
                   7558:                                                                else for(II=I; II>0; II--) S=append(C0,S);
                   7559:                                                                continue;
                   7560:                                                        }
                   7561:                                                }
                   7562:                                        }
                   7563:                                }
                   7564:                        }
                   7565:                        if(M==1)
                   7566:                                S=cons([I,P],S);
                   7567:                        else for( ; I>0; I--) S=cons(P,S);
                   7568:                }
                   7569:        }
                   7570:        S=qsort(S);
                   7571:        if(M==1) S=reverse(S);
                   7572:        return S;
                   7573: }
                   7574:
                   7575: def expat(F,L,V)
                   7576: {
                   7577:         L = vweyl(L);
                   7578:         if(V == "?"){
                   7579:                 Ans = [];
                   7580:
                   7581:                 F = nm(red(F));
                   7582:                 S = fromeul(toeul(F,L,"infty"),L,0);
                   7583:                 S = mycoef(S,mydeg(S,L[1]),L[1]);
                   7584:                 if(mydeg(S,L[0]) > 0)
                   7585:                         Ans = cons(["infty", expat(F,L,"infty")],Ans);
                   7586:
                   7587:                 S = mycoef(F,mydeg(F,L[1]), L[1]);
                   7588:                 R = getroot(S,L[0]);
                   7589:                 for(I = 0; I < length(R); I++){
                   7590:                         if(I > 0 && R[I-1] == R[I])
                   7591:                                 continue;
                   7592:                         if(mydeg(R[I], L[0]) <= 0)
                   7593:                                 Ans = cons([R[I], expat(F,L,R[I])], Ans);
                   7594:                         else
                   7595:                                 Ans = cons([R[I]], Ans);
                   7596:                 }
                   7597:                 return Ans;
                   7598:         }
                   7599:         return getroot(subst(toeul(F,L,V),L[0],0),L[1]);
                   7600: }
                   7601:
                   7602: def polbyroot(P,X)
                   7603: {
1.49      takayama 7604:        if(isvar(V=getopt(var))&&length(P)>1&&isint(car(P))){
                   7605:                for(Q=[],I=car(P);I<=P[1];I++) Q=cons(makev([V,I]),Q);
                   7606:                P=Q;
                   7607:        }
1.6       takayama 7608:        R = 1;
                   7609:        while(length(P)){
                   7610:                R *= X-car(P);
                   7611:                if(type(R)>2) R = red(R);
                   7612:                P = cdr(P);
                   7613:        }
                   7614:        return R;
                   7615: }
                   7616:
                   7617: def polbyvalue(P,X)
                   7618: {
                   7619:        R = 1; S = 0;
                   7620:        while(length(P)){
                   7621:                T = car(P);
                   7622:                V0 = T[1] - mysubst(S,[X,T[0]]);
                   7623:                if(V0 != 0){
                   7624:                        if(type(R) > 2) R = red(R);
                   7625:                        V1 = mysubst(R,[X,T[0]]);
                   7626:                        if(V1 == 0){
                   7627:                                erno(0);
                   7628:                                return 0;
                   7629:                        }
                   7630:                        S += (V0/V1)*R;
                   7631:                        if(type(S) > 2) S = red(S);
                   7632:                }
                   7633:                R *= X - T[0];
                   7634:                P = cdr(P);
                   7635:        }
                   7636:        return S;
                   7637: }
                   7638:
                   7639:
                   7640: def pcoef(P,L,Q)
                   7641: {
                   7642:        if(L==0)
                   7643:                return 1;
                   7644:        Coef=TP=0;
                   7645:        if(type(Q)>=4){
                   7646:                TP=1;
                   7647:                V=Q[0];
                   7648:                if(type(V)==4)
                   7649:                        V=ltov(V);
                   7650:                else V=dupmat(V);
                   7651:                N=length(V);
                   7652:                if(type(Q[1])==5) MR=dupmat(Q[1]);
                   7653:                else{
                   7654:                        MR=newvect(N);
                   7655:                        for(K=Q[1], I=0; I< N; I++){
                   7656:                                MR[I] = car(K);
                   7657:                                K = cdr(K);
                   7658:                        }
                   7659:                }
                   7660:        }else{
                   7661:                V=ltov(vars(P));
                   7662:                N=length(V);
                   7663:                MR=newvect(N);
                   7664:                for(I=0;I<N;I++){
                   7665:                        MR[I]=mydeg(Q,V[I]);
                   7666:                        Q=mycoef(Q,MR[I],V[I]);
                   7667:                }
                   7668:                if(type(Q)>1) return 0;
                   7669:        }
                   7670:        if(L==1){
                   7671:                for(I=0;I<N;I++)
                   7672:                        P=mycoef(P,MR[I],V[I]);
                   7673:                return P;
                   7674:        }
                   7675:        for(I=1;I<N;I++){  /* sorted by required degrees */
                   7676:                for(K1=MR[I],K2=V[I],J=I-1; J>=0 && MR[J]<K1; J--);
                   7677:                for(II=I-1;II>J;II--){
                   7678:                        MR[II+1]=MR[II];V[II+1]=V[II];
                   7679:                }
                   7680:                MR[II+1]=K1;V[II+1]=K2;
                   7681:        }
                   7682:        for(NN=N; N>0 && MR[N-1]==0; N--);
                   7683:        Mon=[];Coe=[];Q=P;
                   7684:        while(Q!=0){
                   7685:                M=newvect(N);
                   7686:                for(R=Q,F=I=0,MT=1;I<NN;I++){
                   7687:                        K=mydeg(R,V[I]);
                   7688:                        R=mycoef(R,K,V[I]);
                   7689:                        if(I<N) M[I]=K;
                   7690:                        if(K>0) MT*=V[I]^K;
                   7691:                        if(K>MR[I]) F=1;
                   7692:                }
                   7693:                Q -= R*MT;
                   7694:                if(F==0){
                   7695:                        Mon=cons(M,Mon);
                   7696:                        Coe=cons(R,Coe);
                   7697:                }
                   7698:        }
                   7699:        Mon=ltov(reverse(Mon));
                   7700:        Coe=ltov(reverse(Coe));
                   7701:        Len=length(Mon);
                   7702:        S=newvect(Len);
                   7703:        for(JL=0; JL<Len;JL++){
                   7704:                if(L*Mon[JL][0]<MR[0]) break;
                   7705:        }
                   7706:        S[0]=L;
                   7707:
                   7708:        K0=Mon[0][0];
                   7709:        K=L*K0-MR[0];
                   7710:        for(I=II=0;II<Len && K>=0;II++){
                   7711:                if((K1=K0-Mon[0][II])>0){
                   7712:                        while(K>K1 && S[I]>0){
                   7713:                                S[I]--;S[II]++;
                   7714:                                K-=K1;
                   7715:                                I=II;
                   7716:                                K0=Mon[0][II];
                   7717:                        }
                   7718:                }else break;
                   7719:        }
                   7720:
                   7721:        I=0;
                   7722:        while(1){
                   7723:         for(T=T0=J=JP=0; J<Len; J++){
                   7724:                 if(S[J]!=0){
                   7725:                         if(T0==0 && J>=JL) return Coef;
                   7726:                         JP=J;T0=1;
                   7727:                         T+=S[J]*Mon[J][I];
                   7728:                 }
                   7729:         }
                   7730:         if(T==MR[I]){
                   7731:                 if(++I<N) continue;
                   7732:                 for(TT=1,J=1; J<=L; J++)  /* find a solution */
                   7733:                         TT*=J;
                   7734:                 for(J=0;J<Len;J++){
                   7735:                         if(S[J]!=0){
                   7736:                                 TT*=Coe[J]^S[J];
                   7737:                                 for(II=S[J]; II>1; II--)
                   7738:                                         TT/=II;
                   7739:                         }
                   7740:                 }
                   7741:                 Coef+=TT;
                   7742:                 if(TP==1 && type(Coef)==3) Coef=red(Coef);
                   7743:                 if(JP<Len-2 && S[JP]>1){
                   7744:                         S[JP]-=2;S[JP+1]++;S[JP+2]++;
                   7745:                 }else{
                   7746:                         for(JT=JP-1;JT>=0&&S[JT]==0;JT--);
                   7747:                         if(JT<0) break;
                   7748:                         if(JT==JP-1){
                   7749:                                 S[JT]--;
                   7750:                                 if(JP<Len-1)
                   7751:                                         S[JP+1]++;
                   7752:                                 else
                   7753:                                         S[JP]++;
                   7754:                         }else{
                   7755:                                 S[JT]--;
                   7756:                                 S[JT+1]+=S[JP]+1;
                   7757:                                 S[JP]=0;
                   7758:                         }
                   7759:                 }
                   7760:                 I=0;
                   7761:                 continue;
                   7762:         }
                   7763:         if(JP<Len-1){
                   7764:                 for(JP1=JP+1;JP1<Len-1;JP1++){
                   7765:                                if(Mon[JP1][I]!=Mon[JP][I]) break;
                   7766:                 }
                   7767:
                   7768:                 if(I>0 && Mon[JP1][0] < Mon[JP][0]){
                   7769:                         S[JP]--;S[Len-1]++;JP=JP-1;
                   7770:                 }else{
                   7771:
                   7772:                         S[JP]--;
                   7773:                         if(JP1<Len){
                   7774:                                 S[JP1]++;
                   7775:                         }else{
                   7776:                                 S[JP1-1]++;
                   7777:                         }
                   7778:                 }
                   7779:         }
                   7780:         if(JP==Len-1){
                   7781:                 for(JT=JP-1;JT>=0 && S[JT]==0;JT--);
                   7782:                 if(JT<0) break;
                   7783:                 S[JT]--;
                   7784:                 if(JT==JP-1){
                   7785:                         S[JP]++;
                   7786:                 }else{
                   7787:                         S[JT+1]+=S[JP]+1;
                   7788:                         S[JP]=0;
                   7789:                 }
                   7790:         }
                   7791:         I=0;
                   7792:        }
                   7793:        return Coef;
                   7794: }
                   7795:
1.58      takayama 7796: def pmaj(P)
                   7797: {
                   7798:        if(type(P)==4){
1.68      takayama 7799:                Opt=getopt(var);
                   7800:                Opt=(isvar(Opt))?[["var",Opt]]:[];
                   7801:                for(Q=[];P!=[];P=cdr(P)) Q=cons(pmaj(car(P)|option_list=Opt),Q);
                   7802:                if(Opt==[]) return reverse(Q);
1.58      takayama 7803:                X=Opt[0][1];
1.68      takayama 7804:                D=mydeg(Q,X);
                   7805:                for(S=0;D>=0;D--) S+=lmax(mycoef(Q,D,X))*X^D;
1.58      takayama 7806:                return S;
                   7807:        }
                   7808:        V=vars(P);
1.71      takayama 7809:        Y=getopt(var);
                   7810:        Abs=(Y==1)?1:0;
                   7811:        if(!(K=length(V))) return Y==1?1:abs(P);
1.58      takayama 7812:        for(R=0,D=deg(P,X=V[0]);D>=0;D--){
                   7813:                Q=coef(P,D,X);
1.71      takayama 7814:                if(Q!=0) R+=((type(Q)>1)?pmaj(Q|var=Abs):(Y==1?1:abs(Q)))*X^D;
1.58      takayama 7815:        }
1.71      takayama 7816:        if(isvar(Y)) for(;V!=[];V=cdr(V)) R=subst(R,car(V),Y);
1.58      takayama 7817:        return R;
                   7818: }
                   7819:
1.6       takayama 7820: def prehombf(P,Q)
                   7821: {
                   7822:        if((Mem=getopt(mem))!=1 && Mem!=-1)
                   7823:                return prehombfold(P,Q);
                   7824:        if(Q==0) Q=P;
                   7825:        V=ltov(vars(P));
                   7826:        N=length(V);
                   7827:        for(I=1;I<N;I++){  /* sorted by required degrees */
                   7828:                for(K=mydeg(P,V[I]),K1=V[I],J=I-1; J>=0 && mydeg(P,V[J])<K; J--);
                   7829:                for(II=I-1;II>J;II--) V[II+1]=V[II];
                   7830:                V[II+1]=K1;
                   7831:        }
                   7832:        S=newvect(N);T=newvect(N);U=newvect(N);
                   7833:        for(R=P,M=1,Deg=I=0;I<N;I++){  /* extreme vector */
                   7834:                Deg+=(S[I]=mydeg(R,V[I]));
                   7835:                R=mycoef(R,S[I],V[I]);
                   7836:        }
                   7837:        DR=[[-1,0]];
                   7838:        if((R1=N/Deg)!=1){
                   7839:                DR=cons([-R1,0],DR);
                   7840:                Sft=1;
                   7841:        }else Sft=0;
                   7842:        if(Deg%2==0) Sg=1;
                   7843:        else Sg=-1;
                   7844:        for(I=0,R=R2=1,QQ=Q; 2*I+Sft < Deg; I++){
                   7845:                if(Mem==-1){
                   7846:                        print(I+1,0);print("/",0);print(idiv(Deg-Sft+1,2),0);print(" ",2);
                   7847:                }
                   7848:                Coef=0;
                   7849:                Q=QQ;
                   7850:                while(Q!=0){
                   7851:                        for(R=Q,J=0,RR=1;J<N;J++){
                   7852:                                T[J]=mydeg(R,V[J]);
                   7853:                                R=mycoef(R,T[J],V[J]);
                   7854:                                if(T[J]>0) RR*=V[J]^T[J];
                   7855:                        }
                   7856:                        Q-=R*RR;
                   7857:                        for(J=0,CC=R;J<N;J++){
                   7858:                                U[J]=I*S[J]+T[J];
                   7859:                                for(II=0; II<T[J]; II++)
                   7860:                                        CC*=(U[J]-II);
                   7861:                        }
                   7862:                        CC*=pcoef(P,I+1,[V,U]);
                   7863:                        if(Mem==-1) print("*",2);
                   7864:                        Coef+=CC;
                   7865:                }
                   7866:                DR=cons([I,Coef],DR);
                   7867:                DR=cons([-R1-1-I,Sg*Coef],DR);
                   7868:                if(Mem==-1) print("");
                   7869:        }
                   7870:        P = polbyvalue(DR,s);
                   7871:        return fctr(P);
                   7872: }
                   7873:
                   7874: def prehombfold(P,Q)
                   7875: {
                   7876:        V = vars(P);
                   7877:        if(Q==0) Q=P;
                   7878:        for(Deg=0, R=P, V1=V, DD=[]; V1!=[]; V1=cdr(V1)){
                   7879:                VT = car(V1);
                   7880:                D = mydeg(R,VT);
                   7881:                R = mycoef(R,D,VT);
                   7882:                Deg += D;
                   7883:                X = makev(["d",VT]);
                   7884:                Q = subst(Q,VT,X);
                   7885:                DD=cons([VT,X],DD);
                   7886:        }
                   7887:        DR=[[-1,0]];
                   7888:        NV=length(V);
                   7889:        if((R1=NV/Deg)!=1){
                   7890:                DR=cons([-R1,0],DR);
                   7891:                Sft=1;
                   7892:        }else
                   7893:                Sft=0;
                   7894:        if(Deg%2==0)
                   7895:                Sg=1;
                   7896:        else Sg=-1;
                   7897:        for(I = 0, R=R2=1; 2*I+Sft < Deg; I++){
                   7898:                R = R2;
                   7899:                R2 = R*P;
                   7900:                S = appldo(Q,R2,DD);
                   7901:                QQ = sdiv(S,R);
                   7902:                DR=cons([I,QQ],DR);
                   7903:                DR=cons([-R1-1-I,Sg*QQ],DR);
                   7904:        }
                   7905:        P = polbyvalue(DR,s);
                   7906:        return fctr(P);
                   7907: }
                   7908:
                   7909: def sub3e(P0,P1,P2,N0,N1,N)
                   7910: {
                   7911:        R = x^N0*(x-1)^N1*dx^N;
                   7912:        for(V = I = 1, J = 1; I <= N; I++){
                   7913:                S = 0;
                   7914:                M = N-I;
                   7915:                if(I <= N0){
                   7916:                        T = mycoef(P0,N0-I,x);
                   7917:                        S += T;
                   7918:                        R += T*x^(N0-I)*(x-1)^N1*dx^M;
                   7919:                        K1 = N0-I+1;
                   7920:                }else
                   7921:                        K1 = 0;
                   7922:                if(I <= N1){
                   7923:                        T = mycoef(P1,N1-I,x);
                   7924:                        S += T;
                   7925:                        R += T*x^N0*(x-1)^(N1-I)*dx^M;
                   7926:                        K2 = N0-1;
                   7927:                }else
                   7928:                        K2 = N-I;
                   7929:                for(K = K1; K <= K2; K++){
                   7930:                        if(K == K2){
                   7931:                                R += (mycoef(P2,N-I,x)-S)*x^K*(x-1)^(M-K)*dx^M;
                   7932:                                continue;
                   7933:                        }
                   7934:                        R += strtov("r"+rtostr(V))*x^K*(x-1)^(M-K)*dx^M;
                   7935:                        S += strtov("r"+rtostr(V++));
                   7936:                }
                   7937:        }
                   7938:        if(V > 1)
                   7939:                mycat([V-1, "accessory parameters: r1,r2,..."]);
                   7940:        return R;
                   7941: }
                   7942:
                   7943: def fuchs3e(P,Q,R)
                   7944: {
                   7945:        return getbygrs([R,P,Q],3);
                   7946: }
                   7947:
                   7948: def okubo3e(P,Q,R)
                   7949: {
                   7950:        if(getopt(opt)==1){
                   7951:                N=length(R);
                   7952:                M1=N-length(P);M2=N-length(Q);
                   7953:                V=(M1-1)*(M2-1);
                   7954:                if(V>0) mycat([V, "accessory parameters"]);
                   7955:                return getbygrs([R,cons([M1,0],P),cons([M2,0],Q)],3);
                   7956:        }
                   7957:        S = 0;
                   7958:        V = -1;
                   7959:        L = newvect(3,[[],[],[]]);
                   7960:        N = newvect(3,[0,0,0]);
                   7961:        if(type(R) < 4){
                   7962:                I = -1;
                   7963:                V = 3;
                   7964:        }else{
                   7965:                I = 2;
                   7966:                V = -1;
                   7967:        }
                   7968:        for( ; I >= 0; I--){
                   7969:                if(I == 2)
                   7970:                        U = R;
                   7971:                else if(I == 1)
                   7972:                        U = Q;
                   7973:                else
                   7974:                        U = P;
                   7975:                for( ; length(U); U = cdr(U)){
                   7976:                        T = car(U);
                   7977:                        if( T == "?"){
                   7978:                                if(V < 0)
                   7979:                                        V = I;
                   7980:                                else
                   7981:                                        return 0;
                   7982:                        }else{
                   7983:                                if(I == 2)
                   7984:                                        L[I] = cons(-T, L[I]);
                   7985:                                else
                   7986:                                        L[I] = cons(T, L[I]);
                   7987:                                S += T;
                   7988:                        }
                   7989:                        N[I]++;
                   7990:                }
                   7991:        }
                   7992:        if(V == 3){
                   7993:                N[2] = N[0] + N[1];
                   7994:                P2 = x^N;
                   7995:                for(I = 1; I <= N; I++)
                   7996:                        P2 += makev([R,I])*x^(N-I);
                   7997:        }else{
                   7998:                if(N[0]+N[1] != N[2]){
                   7999:                        print("Number of exponents are wrong",0);
                   8000:                        return -1;
                   8001:                }
                   8002:                S -= N[0]*N[1];
                   8003:                if(V < 0){
                   8004:                        if(S != 0){
                   8005:                                mycat(["Viorate Fuchs relation ->",S]);
                   8006:                                return -2;
                   8007:                        }
                   8008:                }else{
                   8009:                        if(V != 2)
                   8010:                                S = -S;
                   8011:                        L[V] = cons(S, L[V]);
                   8012:                }
                   8013:                P2 = polinsft(polbyroot(L[2],x),x);
                   8014:        }
                   8015:        P0 = polinsft(mysubst(polbyroot(L[0],x),[x,x+N[1]]),x);
                   8016:        P1 = polinsft(mysubst(polbyroot(L[1],x),[x,x+N[0]]),x);
                   8017:        return sub3e(P0,P1,P2,N[0],N[1],N[2]);
                   8018: }
                   8019:
                   8020: /*    N = 2*M (N-M = M)  or  2*M+1 (N-M = M+1)
                   8021:                0 : 0   1 ..... M-1 B B+1 ... B+N-M-2 A
                   8022:                1 : C C+1 ... C+M-1 0   1 ....  N-M-2 N-M-1
                   8023:  */
                   8024: def eosub(A,B,C,N)
                   8025: {
                   8026:        M = N%2;
                   8027:        P = [];
                   8028:        Q = [];
                   8029:        P = cons(A,P);
                   8030:        for(I = 0; I < N-M-1; I++)
                   8031:                P = cons(B+I,P);
                   8032:        for(I = 0; I < M; I++)
                   8033:                Q = cons(C+I,Q);
                   8034:        P = okubo3e(P,Q,s);
                   8035:
                   8036:        C  = newvect(2);
                   8037:        L  = newvect(2);
                   8038:        C[1] = chkexp(P,[x,dx],0,b,N-M-1);
                   8039:        C[0] = chkexp(P,[x,dx],1,c,M);
                   8040:        for(LL = K = 0; K < 2; K++){
                   8041:                L[K] = length(C[K]);
                   8042:                C[K] = ltov(C[K]);
                   8043:                if(L[K] > LL)
                   8044:                        LL = L[K];
                   8045:        }
                   8046:        JJ = 0;
                   8047:
                   8048:        for(I = 1; Do; I++){
                   8049:                Do = 0;
                   8050:                S = makev(["r",I]);
                   8051:                for(J = JJ; J < LL; J++){
                   8052:                        JJ = LL;
                   8053:                        for(K = 0; K < 2; K++){
                   8054:                                if(J >= L[K] || C[K][J] == 0)
                   8055:                                        continue;
                   8056:                                if(J < JJ)
                   8057:                                        JJ = J;
                   8058:                                if(Do == 1){
                   8059:                                        CC = C[K];
                   8060:                                        CC[J] = mysubst(CC[J], [S, Var]);
                   8061:                                        continue;
                   8062:                                }
                   8063:                                if(mydeg(C[K][J]) >= 1){
                   8064:                                        if(mydeg(C[K][J]) > 1){
                   8065:                                                print("Internal error");
                   8066:                                                return;
                   8067:                                        }
                   8068:                                        Var = getroot(C[K][J],S);
                   8069:                                        Var = Var[0];
                   8070:                                        CC = C[K];
                   8071:                                        CC[J] = 0;
                   8072:                                        P = mysubst(P, [S, Var]);
                   8073:                                        Do = 1;
                   8074:                                        J = JJ - 1;
                   8075:                                        K++;
                   8076:                                }
                   8077:                        }
                   8078:                }
                   8079:        }
                   8080:        if(JJ != L){
                   8081:                print("Internal error (non Rigid)");
                   8082:                return;
                   8083:        }
                   8084:        return P;
                   8085: }
                   8086:
                   8087: def even4e(X,Y){
                   8088:        if(length(X) != 4 || length(Y) != 2){
                   8089:                print("Usage: even4e([a,b,c,d],[e,f])");
                   8090:                print("0:     0 1 e f");
                   8091:                print("1;     0 1 * *+1");
                   8092:                print("infty: a b c d");
                   8093:                return;
                   8094:        }
                   8095:        S = -3;
                   8096:        for(I = 0; I < 4; I++){
                   8097:                S += X[I];
                   8098:                if(I < 2)
                   8099:                        S += Y[I];
                   8100:        }
                   8101:        S = -S/2;
                   8102:        P = okubo3e(Y,[S,"?"],X);
                   8103:        T = chkexp(P,x,1,S,2);
                   8104:        T = getroot(T[0],r1);
                   8105:        return mysubst(P,[r1,T[0]]);
                   8106: }
                   8107:
                   8108: def odd5e(X,Y)
                   8109: {
                   8110:        if(length(X) != 5 || length(Y) != 2){
                   8111:                print("Usage: spec6e([a,b,c,d,e],[f,g])");
                   8112:                print("0:     0  1  f  g g+1");
                   8113:                print("1:     0  1  2  * *+1");
                   8114:                print("infty: a  b  c  d  e");
                   8115:                return;
                   8116:        }
                   8117:        S = -4;
                   8118:        for(I = 0; I < 5; I++){
                   8119:                S += X[I];
                   8120:                if(I < 2)
                   8121:                        S += Y[I];
                   8122:        }
                   8123:        S = -(S + Y[1])/2;
                   8124:        P = okubo3e([Y[0],Y[1],Y[1]+1],[S,"?"],X);
                   8125:        T = chkexp(P,x,1,S,2);
                   8126:        T = getroot(T[0],r1);
                   8127:        P = mysubst(P,[r1,T[0]]);
                   8128:        T = chkexp(P,x,0,Y[1],2);
                   8129:        T = getroot(T[0],r2);
                   8130:        return mysubst(P,[r2,T[0]]);
                   8131: }
                   8132:
                   8133: def extra6e(X,Y)
                   8134: {
                   8135:        if(length(X) != 6 || length(Y) != 2){
                   8136:                print("Usage: extra6e([a,b,c,d,e,f],[g,h])");
                   8137:                print("0:     0  1  g g+1 h h+1");
                   8138:                print("1:     0  1  2  3  * *+1");
                   8139:                print("infty: a  b  c  d  e  f");
                   8140:                return;
                   8141:        }
                   8142:        S = -5;
                   8143:        for(I = 0; I < 6; I++){
                   8144:                S += X[I];
                   8145:                if(I < 2)
                   8146:                        S += 2*Y[I];
                   8147:        }
                   8148:        S = -S/2;
                   8149:        P = okubo3e([Y[0],Y[0]+1,Y[1],Y[1]+1],[S,"?"],X);
                   8150:        T = chkexp(P,x,1,S,2);
                   8151:        T = getroot(T[0],r1);
                   8152:        P = mysubst(P,[r1,T[0]]);
                   8153:        T = chkexp(P,x,0,Y[0],2);
                   8154:        T = getroot(T[0],r3);
                   8155:        P = mysubst(P,[r3,T[0]]);
                   8156:        T = chkexp(P,x,0,Y[1],2);
                   8157:        T = getroot(T[0],r2);
                   8158:        return mysubst(P,[r2,T[0]]);
                   8159: }
                   8160:
                   8161: def rigid211(X,Y,Z)
                   8162: {
                   8163:        if(length(X) != 2 || length(Y) != 2 || length(Z) != 2){
                   8164:                print("Usage: rigid211([a,b],[c,d],[e,f])");
                   8165:                print("0:     0  1   a  b");
                   8166:                print("1:     0  1   c  d");
                   8167:                print("infty: e  e+1 f  *");
                   8168:                return;
                   8169:        }
                   8170:        P = okubo3e(X,Y,[Z[0],Z[0]+1,Z[1],"?"]);
                   8171:        T = chkexp(P,x,"infty",Z[0],2);
                   8172:        T = getroot(T[0],r1);
                   8173:        return mysubst(P,[r1,T[0]]);
                   8174: }
                   8175:
                   8176: def solpokuboe(P,L,N)
                   8177: {
                   8178:        if(type(N) > 1 || ntype(N) != 0 || dn(N) != 1){
                   8179:                mycat(["Irrigal argument :", N]);
                   8180:                return 0;
                   8181:        }
                   8182:        L = vweyl(L);
                   8183:        DD=N+1;
                   8184:        for(U = S = L[0]^N; U != 0; ){
                   8185:                D = mydeg(U,L[0]);
                   8186:                if(D>=DD){
                   8187:                        mycat(["Internal Error",D,DD]);
                   8188:                        return -1;
                   8189:                }
                   8190:                DD=D;
                   8191:                UU = L[0]^D;
                   8192:                R  = appldo(P,UU,L);
                   8193:                if(mydeg(R,L[0]) > D){
                   8194:                        printf("Bad operator\n");
                   8195:                        return 0;
                   8196:                }
                   8197:                CC = mycoef(R,D,L[0]);
                   8198:                if(D == N){
                   8199:                        P -= (E = CC);
                   8200:                        U = R-E*U;
                   8201:                        continue;
                   8202:                }
                   8203:                if(CC == 0){
                   8204:                        printf("No polynomial\n");
                   8205:                        return 0;
                   8206:                }
                   8207:                CC= mycoef(U,D,L[0])/CC;
                   8208:                S = red(S - UU*CC);
                   8209:                U = red(U - R*CC);
                   8210:        }
                   8211:        return [nm(S),E];
                   8212: }
                   8213:
                   8214: def stoe(M,L,N)
                   8215: {
                   8216:        L = vweyl(L);
                   8217:        Size = size(M);
                   8218:        S = Size[0];
                   8219:        NN = 0;
                   8220:        if(type(N) == 4){
                   8221:                NN=N[0]; N=N[1];
                   8222:        }else if(N < 0){
                   8223:                NN=-N; N=0;
                   8224:        }
                   8225:        if(S != Size[1] || N >= S || NN >= S)
                   8226:                return;
                   8227:        D = newmat(S+1,S+1);
                   8228:        MN = dupmat(M);
                   8229:        MD = newmat(S,S);
                   8230:        DD = D[0];
                   8231:        DD[N] = 1; DD[S] = 1;
                   8232:        for(Lcm = I = 1; ; ){
                   8233:                DD = D[I];
                   8234:                MM = MN[N];
                   8235:                for(J = 0; J < S; J++){
                   8236:                        DD[J] = MM[J];
                   8237:                        Lcm = lcm(dn(DD[J]),Lcm);
                   8238:                }
                   8239:                DD[S] = L[1]^I;
                   8240:                for(J = 0; J <= S; J++)
                   8241:                         DD[J] = red(DD[J]*Lcm);
                   8242:                if(I++ >= S)
                   8243:                        break;
                   8244:                if(I==S && NN>0){
                   8245:                        DD = D[I];
                   8246:                        DD[0]=-z_zz; DD[NN]=1;
                   8247:                        break;
                   8248:                }
                   8249:                Mm = dupmat(MN*M);
                   8250:                for(J = 0; J < S; J++){
                   8251:                        for(K = 0; K < S; K++)
                   8252:                                MN[J][K] = red(diff(MN[J][K],L[0])+Mm[J][K]);
                   8253:                }
                   8254:        }
                   8255: #if 0
                   8256:        P = fctr(mydet2(D));
                   8257: #else
                   8258:        P = fctr(det(D));
                   8259: #endif
                   8260:        for(I = R = 1; I < length(P); I++){
                   8261:                if(mydeg(P[I][0],L[1]) > 0)
                   8262:                         R *= P[I][0]^P[I][1];
                   8263:        }
                   8264:        if(NN > 0)
                   8265:                R = -red(coef(R,0,z_zz)/coef(R,1,z_zz));
                   8266:        return R;
                   8267: }
                   8268:
                   8269: def dform(L,X)
                   8270: {
                   8271:        if(type(X)==2) X=[X];
                   8272:        if(type(L[0])!=4) L=[L];
                   8273:        if(type(X)==4) X=ltov(X);
                   8274:        M=length(X);
                   8275:        if(length(car(L))==2){
                   8276:                R=newvect(M);
                   8277:                for(LL=L; LL!=[]; LL=cdr(LL)){
                   8278:                        for(I=0; I<M; I++){
                   8279:                                RT=rmul(car(LL)[0],mydiff(car(LL)[1],X[I]));
                   8280:                                R[I] = (R[I]==0)?RT:radd(R[I],RT);
                   8281:                        }
                   8282:                }
                   8283:                Dif=getopt(dif);
                   8284:                for(RR=[], I=M-1; I>=0; I--){
                   8285:                        if(Dif==1) RR=cons([1,R[I],X[I]],RR);
                   8286:                        else RR=cons([R[I],X[I]],RR);
                   8287:                }
                   8288:                if(Dif==1) RR=dform(RR,X);
                   8289:                return RR;
                   8290:        }else if(length(car(L))!=3) return L;
                   8291:        N=M*(M-1)/2;
                   8292:        R=newvect(N);
                   8293:        S=newvect(N);
                   8294:        for(LL=L; LL!=[]; LL=cdr(LL)){
                   8295:                for(I=K=0; I<M; I++){
                   8296:                        for(J=I+1; J<M; J++, K++){
                   8297:                                if(LL==L) S[K]=[X[I],X[J]];
                   8298:                                LT=car(LL);
                   8299:                                R1=mydiff(LT[2],X[J]);
                   8300:                                R2=mydiff(-LT[2],X[I]);
                   8301:                                if(R2==0){
                   8302:                                        if(R1==0) continue;
                   8303:                                        R1=rmul(mydiff(LT[1],X[I]),R1);
                   8304:                                }else if(R1==0){
                   8305:                                        R1=rmul(mydiff(LT[1],X[J]),R2);
                   8306:                                }else
                   8307:                                        R1=rmul(mydiff(LT[1],X[I]),R1)+rmul(mydiff(LT[1],X[J]),R2);
                   8308:                                R1=rmul(LT[0],R1);
                   8309:                                R[K] = (R[K]==0)?R1:radd(R[K],R1);
                   8310:                        }
                   8311:                }
                   8312:        }
                   8313:        for(RR=[],I=N-1; I>=0; I--)
                   8314:                RR=cons([R[I],S[I][0],S[I][1]],RR);
                   8315:        return RR;
                   8316: }
                   8317:
                   8318: def polinvsym(P,Q,Sym)
                   8319: {
                   8320:        N  = length(Q);
                   8321:        T  = polbyroot(Q,zz);
                   8322:        for(I = 1; I <= N; I++){
                   8323:                P = mysubst(P,[makev([Sym,I]), (-1)^I*coef(T,N-I,zz)]);
                   8324:        }
                   8325:        return P;
                   8326: }
                   8327:
                   8328: def polinsym(P,Q,Sym)
                   8329: {
                   8330:        if(type(P) == 3){
                   8331:                P = red(P);
                   8332:                if(type(P) == 3){
                   8333:                        D = polinsym(dn(P),Q,Sym);
                   8334:                         if(D == 0)
                   8335:                                 return 0;
                   8336:                        return polinsym(nm(P),Q,Sym)/D;
                   8337:                }
                   8338:        }
                   8339:        N  = length(Q);
                   8340:        V  = newvect(N+1);
                   8341:        S  = newvect(N+1);
                   8342:        E  = newvect(N+1);
                   8343:        E0 = newvect(N+1);
                   8344:        T  = polbyroot(Q,zzz);
                   8345:        for(J = 1; J <= N; J++){
                   8346:                K = coef(T,N-J,zzz);
                   8347:                if(J % 2)
                   8348:                        K = -K;
                   8349:                S[J] = K;
                   8350:                V[J] = makev([Sym,J]);
                   8351:        }
                   8352:        K = deg(P,Q[0]);
                   8353:        for(J = 0; J <= N; J++)
                   8354:                E0[J] = K+1;
                   8355:        E[0] = K+1;
                   8356:        while(deg(P,Q[0]) > 0){
                   8357:                for(P0 = P, J = 1; J <= N; J++){
                   8358:                        E[J] = deg(P0,Q[J-1]);
                   8359:                        P0 = coef(P0,E[J],Q[J-1]);
                   8360:                }
                   8361:        /* P0*Q[0]^E[1]*Q[1]^E[2]*...  E[1] >= E[2} >= ... */
                   8362:                for(J = 1; J <= N; J++){
                   8363:                        if(E[J] < E0[J])
                   8364:                                break;
                   8365:                        if(E[J-1] < E[J])
                   8366:                                J = N;
                   8367:                }
                   8368:                if(J > N){
                   8369:                        print("Not symmetric");
                   8370:                        return 0;
                   8371:                }
                   8372:                for(J = 1; J <= N; J++)
                   8373:                        E0[J] = E[J];
                   8374:                for(J = N; J > 1; J--){
                   8375:                        if(E[J] != 0)
                   8376:                                for(K = 1; K < J; K++)
                   8377:                                        E[K] -= E[J];
                   8378:                }
                   8379:                for(R0 = P0, K = 1; K <= N; K++){
                   8380:                        if(E[K] > 0)
                   8381:                                P0 *= S[K]^E[K];
                   8382:                                R0 *= V[K]^E[K];
                   8383:                }
                   8384:                P += R0 - P0;
                   8385:        }
                   8386:        return P;
                   8387: }
                   8388:
                   8389: def tohomog(P,L,V)
                   8390: {
                   8391:        while(length(L)>0){
                   8392:                P = mysubst(P,[car(L),car(L)/V]);
                   8393:                L = cdr(L);
                   8394:        }
                   8395:        P = red(P);
                   8396:        N = mindeg(dn(P),V);
                   8397:        if(N > 0)
                   8398:                P = red(P*V^N);
                   8399:        N = mindeg(dn(P),V);
                   8400:        if(N > 0)
                   8401:                P = red(P/(V^N));
                   8402:        return P;
                   8403: }
                   8404:
                   8405: def substblock(P,X,Q,Y)
                   8406: {
                   8407:        P = red(P);
                   8408:        if(deg(dn(P),X) > 0)
                   8409:                return substblock(nm(P),X,Q,Y)/substblock(dn(P),X,Q,Y);
                   8410:        N = mydeg(Q,X);
                   8411:        if(N < 1)
                   8412:                return P;
                   8413:        R = mycoef(Q,N,X);
                   8414:        while(M = mydeg(P,X), M >= N)
                   8415:                P = red(P - mycoef(P,M,X)*(Q-Y)*X^(M-N)/R);
                   8416:        return P;
                   8417: }
                   8418:
                   8419: def okuboetos(P,L)
                   8420: {
                   8421:        L = vweyl(L); X = L[0]; DX = L[1];
                   8422:        N = mydeg(P,DX);
                   8423:        C = mycoef(P,N,DX);
                   8424:        K = mydeg(C,X);
                   8425:        if(K > N){
                   8426:                print("Irregular singularity at infinity")$
                   8427:                return 0;
                   8428:        }
                   8429:        if(N > K)
                   8430:                P *= x^(N-K);
                   8431:
                   8432:        L = getroot(mycoef(P,N,DX),x);
                   8433:        L = ltov(reverse(L));
                   8434:        if(length(L) != N || N == 0){
                   8435:                print("Cannot get exponents")$
                   8436:                return 0;
                   8437:        }
                   8438:        if( type(LL = getopt(diag)) == 4 ){
                   8439:                LL = ltov(LL);
                   8440:                if(length(LL) != N){
                   8441:                        mycat(["Length of the option should be", N]);
                   8442:                        return 0;
                   8443:                }
                   8444:                Tmp = newvect(N);
                   8445:                for(I = N-1; I >= 0; I--){
                   8446:                         for(LLT = LL[I], J = N-1; J >=0 ; J--){
                   8447:                                 if(LLT == L[J] && Tmp[J] == 0){
                   8448:                                         Tmp[J] = 1;
                   8449:                                         break;
                   8450:                                 }
                   8451:                         }
                   8452:                         if(J < 0){
                   8453:                                 print("option is wrong");
                   8454:                                 return 0;
                   8455:                         }
                   8456:                }
                   8457:                L = LL;
                   8458:        }
                   8459:        P /= mycoef(C,N,X);
                   8460:        A  = newmat(N,N);
                   8461:        AT = newmat(N+1,N+1);
                   8462:        Phi= newvect(N+1);
                   8463:        Phi[0] = 1;
                   8464:        for(J = 0; J < N; J++)
                   8465:                Phi[J+1] = Phi[J]*(X-L[J]);
                   8466:        for(ATT = AT[N], J = 0; J < N; J++)
                   8467:                ATT[J] = mycoef(P,J,DX);
                   8468:
                   8469:        for(K = 1; K <= N; K++){
                   8470:                for(J = N; J >= K; J--){
                   8471:                        Aj = A[J-1];
                   8472:                        SIG = AT[J][J-K];
                   8473:                        for(I = 0; I <= K-2; I++)
                   8474:                                SIG += Aj[J-I-1]*AT[J-I-1][J-K];
                   8475:                        if(K == 1)
                   8476:                                DAT = mydiff(Phi[J-1],X);
                   8477:                        else
                   8478:                                DAT = mydiff(AT[J-1][J-K],X);
                   8479:                        Aj[J-K] = -SIG+(X-L[J-1])*DAT;
                   8480:                        Aj[J-K] /= Phi[J-K];
                   8481:                        Aj[J-K] = mysubst(Aj[J-K],[X,L[J-1]]);
                   8482:                        if(J < K+1) continue;
                   8483:                        ATj = AT[J-1];
                   8484:                        ATj[J-K-1] = SIG+Aj[J-K]*Phi[J-K];
                   8485:                        ATj[J-K-1] /= (X - L[J-1]);
                   8486:                        ATj[J-K-1] = red(ATj[J-K-1]-DAT);
                   8487:                }
                   8488:        }
                   8489:
                   8490:        ATT  = newmat(N,N);
                   8491:        for(J = 0; J < N; J++){
                   8492:                for(K = 0; K < N; K++){
                   8493:                        ATj = ATT[J];
                   8494:                        ATj[K] = AT[J][K];
                   8495:                }
                   8496:                ATj[J] = Phi[J];
                   8497:                if(J < N-1){
                   8498:                        ATj = A[J];
                   8499:                        ATj[J+1] = 1;
                   8500:                }
                   8501:        }
                   8502:        return [L,A,ATT];
                   8503: }
                   8504:
                   8505: def heun(X,P,R)
                   8506: {
                   8507:        if(type(X) != 4 || length(X) != 5){
                   8508:                print("Usage: huen([a,b,c,d,e],p,r)");
                   8509:                print("0:     0  c");
                   8510:                print("1:     0  d");
                   8511:                print("p:     0  e");
                   8512:                print("infty: a  b");
                   8513:                print("Fuchs relation: a+b+1 = c+d+e");
                   8514:                return;
                   8515:        }
                   8516:        S = 1;
                   8517:        V = -1;
                   8518:        X = ltov(X);
                   8519:        for(I = 0; I < 5; I++){
                   8520:                if(X[I] == "?"){
                   8521:                        if(V >= 0)
                   8522:                                return;
                   8523:                        V = I;
                   8524:                }else if(I < 2){
                   8525:                        S += X[I];
                   8526:                }else
                   8527:                        S -= X[I];
                   8528:        }
                   8529:        if(V >= 0){
                   8530:         if(V < 2)
                   8531:                 X[V] = -S;
                   8532:         else
                   8533:                 X[V] = S;
                   8534:        }else if(S != 0){
                   8535:                mycat(["Fuch relation:", S,"should be zero!"]);
                   8536:                return;
                   8537:        }
                   8538:        return
                   8539:         x*(x-1)*(x-P)*dx^2
                   8540:                + (X[2]*(x-1)*(x-P)+X[3]*x*(x-P)+X[4]*x*(x-1))*dx
                   8541:                + X[0]*X[1]*(x-R);
                   8542: }
                   8543:
                   8544: def fspt(M,T)
                   8545: {
                   8546:        if(type(M)==7) M=s2sp(M);
                   8547:        if(T == 3)            /* 3: cut 0 */
                   8548:                return cutgrs(M);
                   8549:        if(T == 4 || T== 5){  /* 4: short  5: long */
                   8550:                for(MN = [] ; M != []; M = cdr(M)){
                   8551:                        MT = car(M);
                   8552:                        for(MNT = []; MT != []; MT = cdr(MT)){
                   8553:                                if(type(car(MT)) <= 3){
                   8554:                                        if(T == 4) MNT = cons(car(MT),MNT);
                   8555:                                        else       MNT = cons([1,car(MT)],MNT);
                   8556:                                }else{
                   8557:                                        if(T == 5 || car(MT)[0] > 1) MNT = cons(car(MT),MNT);
                   8558:                                        else if(car(MT)[0] == 1)  MNT = cons(car(MT)[1],MNT);
                   8559:                                }
                   8560:                        }
                   8561:                        MN = cons(reverse(MNT), MN);
                   8562:                }
                   8563:                return reverse(MN);
                   8564:        }
                   8565:        if(type(M[0][0]) == 4){
                   8566:                for(MN = [] ; M != []; M = cdr(M)){
                   8567:                        MT = car(M);
                   8568:                        for(MNT = []; MT != []; MT = cdr(MT))
                   8569:                                MNT = cons(car(MT)[0], MNT);
                   8570:                         MN = cons(reverse(MNT), MN);
                   8571:                }
                   8572:                return fspt(reverse(MN),T);
                   8573:        }
                   8574:        if(T == 0)  /* 0: sp */
                   8575:                return M;
                   8576:        for(MN = [] ; M != []; M = cdr(M)){
                   8577:                MT = qsort(ltov(car(M)));
                   8578:                L = length(MT);
                   8579:                for(MNT = [], I = 0; I < L; I++)
                   8580:                        MNT = cons(MT[I], MNT);
                   8581:                MN = cons(MNT, MN);
                   8582:        }
                   8583:        MN = reverse(MN);
                   8584:        if(T==6) return MN; /* 7: sort */
                   8585:        L = length(MN);
                   8586:        for(M = MN; M != []; M = cdr(M)){
                   8587:                for(I = 0, MT = car(M); MT != []; MT = cdr(MT))
                   8588:                        I += car(MT);
                   8589:                if(OD == 0)
                   8590:                        OD = I;
                   8591:                else if(OD != I || OD == 0)
                   8592:                        return 0;
                   8593:        }
                   8594:        ALL = [MN];
                   8595:        RD=[];
                   8596:        while(OD > 0){
                   8597:                for(S = 0, MT = MN; MT != []; MT = cdr(MT))
                   8598:                        S += car(MT)[0];
                   8599:                S -= (L-2)*OD;
                   8600:                if(S <= 0){
                   8601:                        if(T==7) return [ALL[0],ALL[length(ALL)-1],RD];
                   8602:                        return (T==1)?MN:ALL;
                   8603:                }
                   8604:                RD=cons([S,0,0],RD);
                   8605:                for(NP=0, M = [], MT = MN; MT != []; NP++, MT = cdr(MT)){
                   8606:                        MTT = car(MT);
                   8607:                        I = MTT[0] - S;
                   8608:                        if(I < 0){
                   8609:                                if(I+OD!=0) return 0;
                   8610:                                if(T==7) return [ALL[0],ALL[length(ALL)-1],cdr(RD)];
                   8611:                                return (T==1)?MN:ALL;
                   8612:                        }
                   8613:                        MTT = cdr(MTT);
                   8614:                        NC=1; DO=0;
                   8615:                        for(MNT = []; MTT != []; MTT = cdr(MTT)){
                   8616:                                if(MTT[0] > I){
                   8617:                                        if(DO==0) RD=cons([MTT[0]-I,NP,NC++],RD);
                   8618:                                        MNT = cons(MTT[0], MNT);
                   8619:                                }
                   8620:                                else if(MTT[0] <= I && I != 0){
                   8621:                                        DO=1;
                   8622:                                        MNT = cons(I, MNT);
                   8623:                                        I = 0;
                   8624:                                        if(MTT[0] > 0)
                   8625:                                                MNT = cons(MTT[0], MNT);
                   8626:                                }
                   8627:                        }
                   8628:                        if(I > 0)
                   8629:                                MNT = cons(I,MNT);
                   8630:                        M = cons(reverse(MNT), M);
                   8631:                }
                   8632:                MN = reverse(M);
                   8633:                ALL = cons(MN,ALL);
                   8634:                OD -= S;
                   8635:        }
                   8636: }
                   8637:
                   8638: def abs(X)
                   8639: {
                   8640:        if(vars(X)!=[]) return todf(os_md.abs,[X]);
                   8641:        if(type(X)==4){
                   8642:                P=X[1];X=X[0];
                   8643:        }else P=0;
                   8644:        if(type(X)==1){
                   8645:                if((T=ntype(X))<2 || T==3){
                   8646:                        if(X<0) X=-X;
                   8647:                }else if(T==4) X=P?pari(abs,X,P):pari(abs,X);
                   8648:        }
                   8649:        return X;
                   8650: }
                   8651:
1.20      takayama 8652: def sgn(X)
                   8653: {
                   8654:        if(X==0) return 0;
                   8655:        if(type(X)==1){
                   8656:                return (X>0)?1:-1;
                   8657:        }
                   8658:        if(type(X)==5) X=vtol(X);
                   8659:        if(type(X)==4){
                   8660:                for(W=0,Y=X;Y!=[];Y=cdr(Y))
                   8661:                        for(Z=cdr(Y);Z!=[];Z=cdr(Z))
                   8662:                                if(car(Y)>car(Z)) W++;
                   8663:                if(getopt(val)==1) return W;
                   8664:                return (iand(W,1))?-1:1;
                   8665:        }
                   8666: }
                   8667:
1.6       takayama 8668: def calc(X,L)
                   8669: {
1.10      takayama 8670:        if(type(X)<4||type(X)==7){
                   8671:                if(type(L)==4||type(L)==7){
1.6       takayama 8672:                        V=L[1];
1.10      takayama 8673:                        if(type(X)!=7){
                   8674:                                if((L0=L[0])=="+") X+=V;
                   8675:                                else if(L0=="-")   X-=V;
                   8676:                                else if(L0=="*")   X*=V;
                   8677:                                else if(L0=="/")   X/=V;
                   8678:                                else if(L0=="^")   X^=V;
                   8679:                        }
                   8680:                        if((L0=L[0])==">")      X=(X>V);
                   8681:                        else if(L0=="<")        X=(X<V);
                   8682:                        else if(L0=="=")        X=(X==V);
1.6       takayama 8683:                        else if(L0==">=")   X=(X>=V);
                   8684:                        else if(L0=="<=")   X=(X<=V);
                   8685:                        else if(L0=="!=")       X=(X!=V);
1.10      takayama 8686:                }else if(type(L)==7&&type(X)<4){
1.6       takayama 8687:                        if(L=="neg") X=-X;
                   8688:                        else if(L=="abs") X=abs(X);
                   8689:                        else if(L=="neg") X=-X;
                   8690:                        else if(L=="sqr") X*=X;
                   8691:                        else if(L=="inv") X=1/X;
                   8692:                        else if(L=="sgn"){
                   8693:                                if(X>0)X=1;
                   8694:                                else if(X<0) X=-1;
                   8695:                        }
                   8696:                }
                   8697:        }
                   8698:        return X;
                   8699: }
                   8700:
1.23      takayama 8701: def tobig(X)
                   8702: {
                   8703:        if((type(X)==1 && ntype(X)==3)||type(X)>3) return X;
                   8704:        return eval(X*exp(0));
                   8705: }
                   8706:
1.6       takayama 8707: def isint(X)
                   8708: {
                   8709:        if(X==0||(type(X)==1 && ntype(X)==0 && dn(X)==1)) return 1;
                   8710:        return 0;
                   8711: }
                   8712:
                   8713: def israt(X)
                   8714: {
                   8715:        if(X==0||(type(X)==1 && ntype(X)==0)) return 1;
                   8716:        return 0;
                   8717: }
                   8718:
                   8719: def iscrat(X)
                   8720: {
                   8721:        if(X==0 || (type(X)==1 && israt(real(X)) && israt(imag(X)))) return 1;
                   8722:        return 0;
                   8723: }
                   8724:
                   8725: def isalpha(X)
                   8726: {
                   8727:        return ((X>64&&X<91)||(X>96&&X<123))?1:0;
                   8728: }
                   8729:
                   8730: def isnum(X)
                   8731: {
                   8732:        return (X>47&&X<58)?1:0;
                   8733: }
                   8734:
                   8735: def isalphanum(X)
                   8736: {
                   8737:        return (isalpha(X)||isnum(X))?1:0;
                   8738: }
                   8739:
1.8       takayama 8740: def isdecimal(X)
                   8741: {
                   8742:        if(type(X)!=7) return 0;
                   8743:        F=S=0;
                   8744:        L=strtoascii(X);
                   8745:        while(L!=[]&&car(L)==32) L=cdr(L);
                   8746:        if(L!=[]&&car(L)==45) L=cdr(L);  /* - */
                   8747:        while(L!=[]&&isnum(car(L))){
                   8748:                F=1; L=cdr(L);
                   8749:        }
                   8750:        while(L!=[]&&car(L)<33){
                   8751:                S=1;L=cdr(L);
                   8752:        }
                   8753:        if(L==[]) return F;
                   8754:        else if(S||car(L)!=46) return 0; /* . */
                   8755:        L=cdr(L);F=0;
                   8756:        while(L!=[]&&isnum(car(L))){
                   8757:                F=1; L=cdr(L);
                   8758:        }
                   8759:        while(L!=[]&&car(L)<33) L=cdr(L);
                   8760:        return (L==[])?F:0;
                   8761: }
                   8762:
1.6       takayama 8763: def isvar(X)
                   8764: {
                   8765:        return ([X]==vars(X)&&vtype(X)<3)?1:0;
                   8766: }
                   8767:
                   8768: def isyes(F)
                   8769: {
                   8770:        if((CC=getopt(set))==1){
                   8771:                IsYes=(type(F[0])==4)?F:[F];
                   8772:                return 1;
                   8773:        }else if(CC==0) return(IsYes);
                   8774:        if(type(CC)!=7)
                   8775:                CC=IsYes;
                   8776:        for(;CC!=[]; CC=cdr(CC)){
                   8777:                C=car(CC);
                   8778:                V=call(C[0],cons(F,C[1]));
                   8779:                if(type(C[2])!=4){
                   8780:                        if(V!=C[2])     break;
                   8781:                }else{
                   8782:                        if(C[2][0]!="" && V<C[2][0]) break;
                   8783:                        if(C[2][1]!="" && V>C[2][1]) break;
                   8784:                }
                   8785:        }
                   8786:        return (CC==[])?1:0;
                   8787: }
                   8788:
                   8789: def isall(FN,M)
                   8790: {
                   8791:        if(type(M)<4 || type(M)>6) return ((*FN)(M)==0)?0:1;
                   8792:        if(type(M)==4){
                   8793:                for(;M!=[];M=cdr(M))
                   8794:                        if((*FN)(car(M))==0) return 0;
                   8795:        }else if(type(M)==5){
                   8796:                K=length(M);
                   8797:                for(I=0;I<K;I++)
                   8798:                        if((*FN)(M[I])==0) return 0;
                   8799:        }else if(type(M)==6){
                   8800:                K=size(M)[0];
                   8801:                for(I=0;I<K;I++)
                   8802:                        if (isall(FN,M[I])==0) return 0;
                   8803:        }
                   8804:        return 1;
                   8805: }
                   8806:
                   8807: def sproot(MP,T)
                   8808: {
                   8809:        if((I=str_chr(T,0,","))>0){
                   8810:                if(type(MP)==7) M=s2sp(MP);
                   8811:                else M=chkspt(MP|opt=0);
                   8812:                if(I==length(M[0])){
                   8813:                        N=s2sp(T);S=SM=SN=K=0;
                   8814:                        for(MM=M,NN=N;MM!=[];MM=cdr(MM),NN=cdr(NN),K++){
                   8815:                                for(MT=car(MM),NT=car(NN);MT!=[];MT=cdr(MT),NT=cdr(NT)){
                   8816:                                        S+=car(MT)*car(NT);
                   8817:                                        if(K==0){
                   8818:                                                SM+=car(MT);SN+=car(NT);
                   8819:                                        }
                   8820:                                }
                   8821:                        }
                   8822:                        return S-(length(M)-2)*SM*SN;
                   8823:                }
                   8824:        }
                   8825:        MM=chkspt(MP|opt=7);
                   8826:        if(T=="base") return MM;
                   8827:        Keep=(getopt(keep)==1)?1:0;
                   8828:        Null=getopt(null);
                   8829:        Only=getopt(only);
                   8830:        if(type(Only)!=1) Only=7;
                   8831:        M0=MM[0];
                   8832:        M1=MM[1];
                   8833:        M=MM[2];
                   8834:        if(T=="length") return length(M);
                   8835:        if(T=="height"){
                   8836:                for(J=2,S=M1[0][0],M2=M1; M2!=[]; M2=cdr(M2)){
                   8837:                        for(MT=cdr(car(M2)); MT!=[]; J++, MT=cdr(MT)){
                   8838:                                S+= J*car(MT);
                   8839:                        }
                   8840:                        J=1;
                   8841:                }
                   8842:                return S;
                   8843:        }
                   8844:        for(OD=0, MT=M1[0]; MT!=[]; MT=cdr(MT)) OD+=car(MT);
                   8845:        if(T=="type"){
                   8846:                R=newvect(OD+1);
                   8847:                for(MT=M; MT!=[]; MT=cdr(MT)) R[MT[0][0]]++;
                   8848:                for(RR=[],I=OD; I>0; I--)
                   8849:                        if(R[I]>0) RR=cons([R[I],I],RR);
                   8850:                return RR;
                   8851:        }
                   8852:        if(T=="part"||T=="pair"||T=="pairs"){
                   8853:                NP=length(M1);
                   8854:                LM=newvect(NP);
                   8855:                R=newvect(length(M));
                   8856:                for(K=0; K<NP; K++) LM[K]=length(M1[K]);
                   8857:                for(I=0,TM=M; TM!=[]; I++, TM=cdr(TM)){
                   8858:                        V=newvect(NP);
                   8859:                        for(K=0; K<NP; K++) V[K]=newvect(LM[K]);
                   8860:                        TP=car(TM);
                   8861:                        if(TP[2]==0){
                   8862:                                for(K=0;K<NP;K++) V[K][0]=1;
                   8863:                                for(J=0; J<I; J++){
                   8864:                                        VJ=R[J][1];
                   8865:                                        for(S=K=0;K<NP;K++) S+=VJ[K][0];
                   8866:                                        for(OD=0,K=0;K<LM[0];K++) OD+=VJ[0][K];
                   8867:                                        S-=(NP-2)*OD;
                   8868:                                        for(K=0;K<NP;K++) VJ[K][0]-=S;
                   8869:                                }
                   8870:                        }else{
                   8871:                                K=TP[1]; P=TP[2];
                   8872:                                V[K][P-1]=-1; V[K][P]=1;
                   8873:                                for(J=0; J<I; J++){
                   8874:                                        VJ=R[J][1];
                   8875:                                        S=VJ[K][P]; VJ[K][P]=VJ[K][P-1]; VJ[K][P-1]=S;
                   8876:                                }
                   8877:                        }
                   8878:                        R[I]=[TP[0],V];
                   8879:                }
                   8880:                if(T=="pair"||T=="pairs"){
                   8881:                        MV=ltov(M1);
                   8882:                        for(K=0; K<NP; K++) MV[K] = ltov(MV[K]);
                   8883:                        for(RR=UU=SS=[],I=0; I<length(M); I++){
                   8884:                                V=newvect(NP); W=newvect(NP); U=newvect(NP);
                   8885:                                for(K=0; K<NP; K++){
                   8886:                                        U[K]=newvect(LM[K]); V[K]=newvect(LM[K]); W[K]=newvect(LM[K]);
                   8887:                                }
                   8888:                                S=R[I][0];
                   8889:                                for(K=0; K<NP; K++){
                   8890:                                        for(Q=J=0; J<LM[K]; J++){
                   8891:                                                V[K][J] = S*(U[K][J] = R[I][1][K][J]);
                   8892:                                                Q+=(W[K][J] = MV[K][J] - V[K][J]);
                   8893:                                        }
                   8894:                                }
                   8895:                                if(Q>0 && iand(Only,1)==0) continue;
                   8896:                                if(Q==0 && iand(Only,2)==0) continue;
                   8897:                                if(Q<0 && iand(Only,4)==0) continue;
                   8898:                                for(K=0; K<NP; K++){
                   8899:                                        V[K] = vtol(V[K]); W[K] = vtol(W[K]); U[K]=vtol(U[K]);
                   8900:                                }
                   8901:                                V=vtol(V); W=vtol(W);U=vtol(U);
                   8902:                                if(Q<0) S=-S;
                   8903:                                RR = cons([V,W], RR); UU = cons(U,UU); SS=cons(S,SS);
                   8904:                        }
                   8905:                        RR = reverse(RR); UU=reverse(UU); SS=reverse(SS);
                   8906:                        if(getopt(dviout)==1 && (Null!=1 || RR!=[])){
                   8907:                                 Out=string_to_tb("\\begin{align}\\begin{split}"+s2sp(M1)+"&=");
                   8908:                                 for(I=0,R=RR, U=UU; R!=[]; I++, R=cdr(R), U=cdr(U)){
                   8909:                                         if(I>0) str_tb("\\\\\n &=",Out);
                   8910:                                         if(T=="pairs"){
                   8911:                                                 if((S=SS[I])<0) S=-S;
                   8912:                                                 if(S>1) str_tb([my_tex_form(S),"("],Out);
                   8913:                                                 str_tb(s2sp(car(U)),Out);
                   8914:                                                 if(S>1) str_tb(")",Out);
                   8915:                                                 str_tb(" \\oplus ",Out);
                   8916:                                                 if(SS[I]<0){
                   8917: #ifdef USEMODULE
                   8918:                                                         str_tb(["-(",s2sp(mtransbys(os_md.abs,car(R)[1],[])),")"],Out);
                   8919: #else
                   8920:                                                         str_tb(["-(",s2sp(mtransbys(abs,car(R)[1],[])),")"],Out);
                   8921: #endif
                   8922:                                                 }else
                   8923:                                                         str_tb(s2sp(car(R)[1]),Out);
                   8924:                                         }else
                   8925:                                                 str_tb([s2sp(car(R)[0])," \\oplus ",s2sp(car(R)[1])],Out);
                   8926:                                }
                   8927:                                 str_tb("\n\\end{split}\\end{align}",Out);
                   8928:                                 dviout(str_tb(0,Out)|keep=Keep);
                   8929:                        }
                   8930:                        return RR;
                   8931:                }
                   8932:                for(I=0; I<length(M); I++){
                   8933:                        for(K=0; K<NP; K++) R[I][1][K] = vtol(R[I][1][K]);
                   8934:                        R[I] = [R[I][0],vtol(R[I][1])];
                   8935:                }
                   8936:                R = vtol(R);
                   8937:                return [M0,M1,R];
                   8938:        }
                   8939: }
                   8940:
                   8941: def spgen(MO)
                   8942: {
                   8943:        Eq=(getopt(eq)==1)?1:0;
                   8944:        Sp=getopt(sp);
                   8945:        if(type(Sp)==7) Sp=s2sp(Sp);
                   8946:        St=getopt(str);
                   8947:        LP=getopt(pt);
                   8948:        F=getopt(std);
                   8949:        if(F!=1&&F!=-1) F=0;
                   8950:        if(type(LP)==4){
                   8951:                L0=LP[0]; L1=LP[1];
1.29      takayama 8952:        }else if(type(LP)==1){
                   8953:                L0=L1=LP;
1.6       takayama 8954:        }else{
                   8955:                L0=0; L1=MO+1;
                   8956:        }
1.53      takayama 8957:        if(M0<=0){
1.6       takayama 8958:                MO=-MO;
                   8959:                if(iand(MO,1)==1) return [];
1.53      takayama 8960:                MO=MO/2;
                   8961:                B=spbasic(-2*MO,0|str=1);
                   8962:                if(L1<3) L1=MO+4;
1.6       takayama 8963:                if(St!=1){
                   8964:                        for(R=[]; B!=[]; B=cdr(B)){
1.53      takayama 8965:                                RT= F?s2sp(car(B)|std=F): s2sp(car(B));
1.6       takayama 8966:                                if(length(RT)<L0 || length(RT)>L1) continue;
                   8967:                                R=cons(RT,R);
                   8968:                        }
                   8969:                        return reverse(R);
                   8970:                }else{
                   8971:                        if(L0<=3 && L1>=MO+4) return B;
                   8972:                        for(R=[]; B!=[]; B=cdr(B)){
                   8973:                                RT=s2sp(T=car(B));
                   8974:                                if(length(RT)<L0 || length(RT)>L1) continue;
                   8975:                                if(F) T=s2sp(s2sp(T|std=K));
                   8976:                                R=cons(T,R);
                   8977:                        }
                   8978:                        return reverse(R);
                   8979:                }
                   8980:        }
                   8981:        MP=(L1<MO+1)?L1:MO+1;
                   8982:        LL=newvect(MO+1);
                   8983:        R=newvect(MP+2);
                   8984:        R0=newvect(MP+2);
                   8985:        for(I=1; I<=MO; I++) LL[I]=[];
                   8986:        if(type(Sp)==4){
                   8987:                if(getopt(basic)==1) Sp=chkspt(Sp[6]);
                   8988:                R=chkspt(Sp);
                   8989:                if(R[1]>MO) return 0;
                   8990:                LL[R[1]]=R;
                   8991:                K=R[1];
                   8992:        }
                   8993:        if(K==1||type(Sp)!=4){
                   8994:                LL[1]=[[[1]]];
                   8995:                for(I=2; I<=MO && I<MP;I++){
                   8996:                        for(T=[], J=0; J<I+1; J++)
                   8997:                                T=cons([I-1,1],T);
                   8998:                        LL[I]=cons(T,LL[I]);
                   8999:                }
                   9000:                K=2;
                   9001:        }
                   9002:        for(OD=K; OD<MO; OD++){
                   9003:                for(LT=LL[OD]; LT!=[]; LT=cdr(LT)){
                   9004:                        for(II=0,L=car(LT); L!=[]; II++, L=cdr(L)){
                   9005:                                R0[II]=R[II]=car(L);
                   9006:                        }
                   9007:                        for(; ;){
                   9008:                                for(S=-2*OD, I=0; I<II; I++){
                   9009:                                        S += OD;
                   9010:                                        if(R[I]!=[]) S-=car(R[I]);
                   9011:                                }
                   9012:                                --I;
                   9013:                                for(;S+OD<=MO && I<=MP;S+=OD,I++){
                   9014:                                        if(S<=0) continue;
                   9015:                                        for(J=0;J<=I;J++){
                   9016:                                                if(J>=II){
                   9017:                                                        if(S<OD) break;
                   9018:                                                }else
                   9019:                                                        if(S+((R[J]==[])?0:car(R[J]))<car(R0[J])) break;
                   9020:                                        }
                   9021:                                        if(--J>=I){
                   9022:                                                V=newvect(I);
                   9023:                                                RRR=[];
                   9024:                                                for(;J>=0;J--){
                   9025:                                                        if(J>=II) RR=[OD,S];
                   9026:                                                        else{
                   9027:                                                                K=length(R[J]);
                   9028:                                                                RR=[S+((K==0)?0:car(R[J]))];
                   9029:                                                                K=length(R0[J])-K;
                   9030:                                                                for(RT=R0[J]; RT!=[]; K--,RT=cdr(RT)){
                   9031:                                                                        if(K!=0) RR=cons(car(RT),RR);
                   9032:                                                                }
                   9033:                                                        }
                   9034:                                                        RRR=cons(reverse(RR),RRR);
                   9035:                                                }
                   9036:                                                RRR=qsort(reverse(RRR));
                   9037:                                                if(findin(RRR,LL[S+OD])<0)
                   9038:                                                        LL[S+OD]=cons(RRR,LL[S+OD]);
                   9039:                                        }
                   9040:                                }
                   9041:                                for(K=0; K<II; K++){
                   9042:                                        if(R[K]!=[]){
                   9043:                                                S=car(R[K]);
                   9044:                                                while((R[K]=cdr(R[K]))!=[] && car(R[K])==S);
                   9045:                                                break;
                   9046:                                        }else R[K]=R0[K];
                   9047:                                }
                   9048:                                if(K>=II) break;
                   9049:                        }
                   9050:                }
                   9051:        }
                   9052:        if(L0>0 || L1<MO+1 || St==1 || F){
                   9053:                for(J=1; J<=MO; J++){
                   9054:                        for(RT=[],R=LL[J];R!=[];R=cdr(R)){
                   9055:                                L=length(T=car(R));
                   9056:                                if(L<L0 || L>L1) continue;
                   9057:                                if(F) T=s2sp(T|std=F);
                   9058:                                RT=cons((St==1)?s2sp(T):T,RT);
                   9059:                        }
                   9060:                        LL[J] = reverse(RT);
                   9061:                }
                   9062:        }
                   9063:        if(Eq==1) return LL[MO];
                   9064:        return LL;
                   9065: }
                   9066:
1.53      takayama 9067: def spbasic(Idx,D)
                   9068: {
                   9069: /*
                   9070:   D<=3|Idx|+6,  D<=|Idx|+2 (p>3),  p<=|Idx|/2+4
                   9071:   Idx=2*D^2-(D^2-\sum m_{j,\nu}^2); \sum(D-m_{j,1})>=2*D;
                   9072:   \sum (m_{j,1)-m_{j,\nu})*m_{j,\nu)
                   9073:   0<=(2*D-\sum(D-m_{j,1})})*D=\sum_(m_{j,1}-m_{j,\mu})*m_{j,\nu} -|Idx|
                   9074:   (-2,0)                                    13個 (9+3+?)
                   9075:   (-4,0)                                    37個 (25+9+?)
                   9076:   (-6,0) :  8.5sec  ?sec          0.05sec   69個 (46+17+?)
1.54      takayama 9077:   (-8,0) : 97  sec  1sec          0.13sec  113個 (73+29+?)   <- (-2,0)
                   9078:   (-10,0):          4sec          0.27sec  198個 (127+50+?)
                   9079:  (-12,0)          28sec   4.2sec 0.64sec  291個 (182+76+?)
                   9080:   (-14,0)          27sec  10.2sec 1.31sec  415個 (249+115+?)
                   9081:   (-16,0)                 34.0sec 2.47sec  647個 (395+172+?) <- (-4,0)
                   9082:   (-18,0)                         4.42sec  883個 (521+243+?) <- (-2,0)
                   9083:   (-20,0)                         8.17sec 1186個 (680+345+?)
1.53      takayama 9084: */
                   9085:        Idx=-Idx;
                   9086:        if((Str=getopt(str))!=1) Str=0;
                   9087:        if(!isint(Idx)||!isint(Idx/2)||Idx<0||!isint(D)||D<0||D==1||D>3*Idx+6) return [];
                   9088:        if(D==0){
                   9089:                for(R=[],D=3*Idx+6;D>=2;D--) R=append(spbasic(-Idx,D|str=Str),R);
                   9090:                return R;
                   9091:        }
                   9092:        if(!Idx){
                   9093:                R=0;
                   9094:                if(D==2) R="11,11,11,11";
                   9095:                if(D==3) R="111,111,111";
                   9096:                if(D==4) R="22,1111,1111";
                   9097:                if(D==6) R="33,222,111111";
                   9098:                if(!R) return [];
                   9099:                return [(Str==1)?R:s2sp(R)];
                   9100:        }
                   9101:        if(D>Idx+2){
                   9102:                L=3;
                   9103:                if(D==3*Idx+6){
                   9104:                        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]];
                   9105:                        return [(Str==1)?s2sp(R):R];
                   9106:                }
                   9107:                if(iand(D,1)&&(D-3)/2>Idx) return [];
                   9108:        }else L=Idx/2+4;
1.54      takayama 9109:        V=newvect(L);SV=newvect(L);
1.53      takayama 9110:        for(S1=[],I=0;I<D;I++) S1=cons(1,S1);
                   9111:        for(T=D-1;T>1;T--){
                   9112:                K=D%T;
                   9113:                if((T-K)*K<=Idx) break;
                   9114:        }
                   9115:        J=(T-K)*K;SJ=K^2+(D-K)*T;
                   9116:        TV=K?[K]:[];
                   9117:        for(I=(D-K)/T;I>0;I--) TV=cons(T,TV);
                   9118:        for(I=0;I<L;I++){
1.54      takayama 9119:                SV[I]=2*D^2-(I+1)*(D^2-J)-Idx;
1.53      takayama 9120:                V[I]=TV;
                   9121:        }
1.54      takayama 9122:        if(SV[2]>0) return [];
1.53      takayama 9123:        if(D>Idx+2 && V[0][0]+V[1][0]>=D && V[1][0]>1){
                   9124:                T=V[1][0]-1;K=D%T;TV=K?[K]:[];
                   9125:                for(I=(D-K)/T;I>0;I--) TV=cons(T,TV);
                   9126:                V[1]=V[2]=TV;
                   9127:        }
                   9128:        for(R=[];;){
                   9129:                if(D>Idx+2){
1.54      takayama 9130:                        if(3*V[0][0]<D) break;
                   9131:                        if(V[0][0]+V[1][0]>=D && (T=D-V[0][0]-1)>0){
1.53      takayama 9132:                                K=D%T;TV=K?[K]:[];
                   9133:                                for(I=(D-K)/T;I>0;I--) TV=cons(T,TV);
                   9134:                                V[1]=V[2]=TV;
                   9135:                        }
                   9136:                        S2=V[0][0]+V[1][0]+V[2][0]-D;
                   9137:                        if(V[0][0]+2*V[1][0]<D ||(S2<0&&V[1][0]==1) ){
                   9138:                                V[0]=V[1]=V[2]=nextpart(V[0]);
                   9139:                                T=V[0][0];
                   9140:                                T=D-2*T;
                   9141:                                if(T==0){
                   9142:                                        V[1]=[D/2-1,1];
                   9143:                                        V[2]=S1;
                   9144:                                }else if(T>0){
                   9145:                                        J=D%T;
1.54      takayama 9146:                                        K=J?[J]:[];
1.53      takayama 9147:                                        for(J=(D-J)/T;J>0;J--) K=cons(T,K);
                   9148:                                        V[2]=K;
                   9149:                                }
                   9150:                                continue;
                   9151:                        }
                   9152:                        if(S2<0||V[2][0]<=S2){
                   9153:                                V[1]=V[2]=nextpart(V[1]);
                   9154:                                continue;
                   9155:                        }else if(S2>0){
                   9156:                                T=V[2][0]-S2;J=D%T;
                   9157:                                K=J?[J]:[];
                   9158:                                for(J=(D-J)/T;J>0;J--) K=cons(T,K);
                   9159:                                V[2]=K;
                   9160:                        }
                   9161:                }
                   9162:                for(S=-2*D,IL=0;IL<L;IL++){
                   9163:                        S+=D-car(V[IL]);
                   9164:                        if(S>=0) break;
                   9165:                }
1.54      takayama 9166:                if((I=IL)==L){  /* reducible i.e. IL=L && S<0 */
1.53      takayama 9167:                        for(LL=L-1;LL>=0;LL--){
                   9168:                                if((K=car(V[LL]))+S>0){
                   9169:                                        K+=S;
                   9170:                                        for(TV=[],TD=D;TD>=K;TD-=K) TV=cons(K,TV);
                   9171:                                        if(TD>0) V[LL]=append(TV,[TD]);
                   9172:                                        else V[LL]=TV;
                   9173:                                        break;
                   9174:                                }else{
                   9175:                                        S+=K-1;
                   9176:                                        V[LL]=S1;
                   9177:                                }
                   9178:                        }
                   9179:                        if(LL<0) break;
                   9180:                        continue;
                   9181:                }
                   9182:                for(S0=K=0;K<=IL;K++){
                   9183:                        ST=car(V[K]);J=V[K][length(V[K])-1];S0+=(ST-J)*J;
                   9184:                        if(S0>Idx) break;
                   9185:                }
                   9186:                if(S0>Idx && car(V[K])!=1){
                   9187:                        ST=car(V[K]);
                   9188:                        S0-=(ST-J)*J;
                   9189:                        for(ST--;ST>0;ST--){
                   9190:                                J=D%ST;
                   9191:                                if(S0+(ST-J)*J <= Idx) break;
                   9192:                        }
                   9193:                        V[K]=J?[J]:[];
                   9194:                        for(J=D-J;J>0;J-=ST) V[K]=cons(ST,V[K]);
                   9195:                        for(J=K+1;J<L;J++) V[J]=V[K];
                   9196:                        continue;
                   9197:                }
                   9198:
                   9199:                for(K=SS=0;K<L&&SS<=Idx;K++){
                   9200:                        ST=car(V[K]);
                   9201:                        for(S0=0,TV=cdr(V[K]);TV!=[];TV=cdr(TV)) S0+=(ST-car(TV))*car(TV);
1.54      takayama 9202:                        SS+=S0;
1.53      takayama 9203:                }
1.54      takayama 9204:                if(SS>Idx && K<=IL && K!=L){
                   9205:                        SS0=Idx-SS+S0;
                   9206:                        for(TV=car(V[K]);TV>1;TV--){
                   9207:                                U=D%TV;
                   9208:                                if((D-U)*U<=SS0) break;
                   9209:                        }
                   9210:                        if(TV==car(V[K])){
                   9211:                                K=K-1;
                   9212:                                V[K]=nextpart(V[K]); /* to be improves */
                   9213:                        }else{
                   9214:                                V[K]=U?[U]:[];  /* to be improved */
                   9215:                                for(J=D-U;J>0;J-=TV) V[K]=cons(TV,V[K]);
                   9216:                        }
1.53      takayama 9217:                        for(J=K+1;J<L;J++) V[J]=V[K];
                   9218:                        continue;
                   9219:                }
                   9220:
                   9221:                for(Ix=2*D^2+Idx,J=0;J<L;J++){
                   9222:                        IxF=Ix;
                   9223:                        for(Ix-=D^2,TV=V[J];TV!=[];TV=cdr(TV)) Ix+=car(TV)^2;
                   9224:                        if(Ix<=0) break;
                   9225:                }
                   9226:                if(Ix==0&&(J>=I||IL==2)){
                   9227:                        for(TR=[],K=J;K>=0;K--) TR=cons(V[K],TR);
                   9228:                        R=cons((Str==1)?s2sp(TR):TR,R);
                   9229:                }
                   9230:                if(J>=0 && J<L && Ix<=0){
                   9231:                        I=V[J][0];K=D%I;S0=(D-K)*I+K^2;
                   9232:                        if(I>1&& IxF-D^2+S0<0){
                   9233:                                for(V[J]=[],K=D-I;K>0;K--) V[J]=cons(1,V[J]);
                   9234:                                V[J]=cons(I,V[J]);
                   9235:                                V[J]=nextpart(V[J]);
                   9236:                                for(I=J+1;I<L;I++) V[I]=V[J];
                   9237:                                continue;
                   9238:                        }
                   9239:                }
                   9240:                if(J>=0 && J<L && Ix<=0 && car(V[J])>(U=V[J][length(V[J])-1])+1){
                   9241:                        TV=reverse(V[J]);
                   9242:                        for(S0=0,K=[];TV!=[];TV=cdr(TV),S0++){
                   9243:                                if((I=car(TV))<U+2||(length(TV)>1&&S0<2)){
                   9244:                                        while(I-->0) K=cons(1,K);
                   9245:                                }else K=cons(car(TV),K);
                   9246:                        }
                   9247:                        V[I=J]=K;
                   9248:                }else{
                   9249:                        if(J>=L) J=L-1;
                   9250:                        for(I=J;I>=0&&length(V[I])==D;I--);
                   9251:                        if(I<0) break;
                   9252:                }
                   9253:                V[I]=nextpart(V[I]);                    /* to be improved */
                   9254:                for(J=I+1;J<L;J++) V[J]=V[I];
                   9255:        }
                   9256:        return R;
                   9257: }
                   9258:
1.6       takayama 9259: def spType2(L)
                   9260: {
                   9261:        C=0;R=[];
                   9262:        for(LT=L;LT!=[];LT=cdr(LT)){
                   9263:                D=-1;LP=car(LT);
                   9264:                for(LPT=LP;LPT!=[];LPT=cdr(LPT)){
                   9265:                        if(D==-1) D=car(LPT);
                   9266:                        else D=igcd(D,car(LPT));
                   9267:                        if(D==1){
                   9268:                                C++;break;
                   9269:                        }
                   9270:                }
                   9271:                if(C==2) return 0;
                   9272:                R=cons(D,R);
                   9273:        }
                   9274:        if(C==0) return L;
                   9275:        if(C==1){
                   9276:                for(K=length(R)-1;R[K]!=1;K--);
                   9277:                D=-1;
                   9278:                for(I=length(R)-1;I>=0;I--){
                   9279:                        if(I==K) continue;
                   9280:                        if(D==-1) D=R[I];
                   9281:                        else D=igcd(D,R[I]);
                   9282:                        if(D==1) return 0;
                   9283:                }
                   9284:        }
                   9285:        return L;
                   9286: }
                   9287:
                   9288:
                   9289: /* ret [#points, order, idx, Fuchs, reduction order, reduction exponents, fund] */
                   9290: def chkspt(M)
                   9291: {
                   9292:        Opt= getopt(opt);
                   9293:        Mat= getopt(mat);
                   9294:        if(type(M)==7) M=s2sp(M);
1.28      takayama 9295:        if(type(Opt) >= 0&&Opt!="idx"){
1.6       takayama 9296:                if(type(Opt) == 7)
                   9297:                        Opt = findin(Opt, ["sp","basic","construct","strip","short","long","sort","root"]);
                   9298:                if(Opt < 0){
                   9299:                        erno(2);
                   9300:                        return 0;
                   9301:                }
                   9302:                return fspt(M,Opt);
                   9303:        }
                   9304:        P  = length(M);
                   9305:        OD = -1;
                   9306:        XM = newvect(P);
                   9307:        Fu = 0;
                   9308:        for( I = SM = SSM = 0; I < P; I++ ){
                   9309:                LJ = length(M[I]);
                   9310:                JM = JMV = 0;
                   9311:                for(J = SM = 0; J < LJ; J++){
                   9312:                        MV = M[I][J];
                   9313:                        if(type(MV) == 4){
                   9314:                                Fu += MV[0]*MV[1];
                   9315:                                MV = MV[0];
                   9316:                        }
                   9317:                        if(MV > JMV){
                   9318:                                JM = J; JMV = MV;
                   9319:                        }
                   9320:                        SM  += MV;
                   9321:                        SSM += MV^2;
                   9322:                }
                   9323:                if(OD < 0)
                   9324:                        OD = SM;
                   9325:                else if(OD != SM){
1.28      takayama 9326:                        if(getopt(dumb)!=1) print("irregal partitions");
                   9327:                        return -1;
1.6       takayama 9328:                }
                   9329:                XM[I] = JM;
                   9330:        }
                   9331:        SSM -= (P-2)*OD^2;
                   9332:        for(I = SM = JM = 0; I < P; I++){
                   9333:                MV = M[I][XM[I]];
                   9334:                if(type(MV) == 4){
                   9335:                        MV = MV[0]; JM = 1;
                   9336:                }
                   9337:                if(I == 0)
                   9338:                 SMM = MV;
                   9339:                else if(SMM > MV)
                   9340:                 SMM = MV;
                   9341:                SM += MV;
                   9342:        }
                   9343:        SM -= (P-2)*OD;
1.28      takayama 9344:        if(Opt=="idx") return SSM;
1.6       takayama 9345:        if(SM > SMM && SM != 2*OD){
1.28      takayama 9346:                if(getopt(dumb)!=1) print("not realizable");
                   9347:                return 0;
1.6       takayama 9348:        }
                   9349:        if(JM==1 && Mat!=1)
                   9350:                Fu -= OD - SSM/2;
1.28      takayama 9351:        return [P, OD, SSM, Fu, SM, XM, fspt(M,1)];
1.6       takayama 9352: }
                   9353:
                   9354: def cterm(P)
                   9355: {
                   9356:        V = getopt(var);
                   9357:        if(type(V) != 4)
                   9358:                V=vars(P);
                   9359:        for(; V !=[]; V = cdr(V))
                   9360:                P = mycoef(P,0,car(V));
                   9361:        return P;
                   9362: }
                   9363:
                   9364: def terms(P,L)
                   9365: {
                   9366:        Lv=getopt(level);
                   9367:        if(type(Lv)!=1) Lv=0;
                   9368:        V=car(L);L=cdr(L);
                   9369:        for(R=[],D=mydeg(P,V);D>=0; D--){
                   9370:                if((Q=mycoef(P,D,V))==0) continue;
                   9371:                if(L!=[]){
                   9372:                        R0=terms(Q,L|level=Lv+1);
                   9373:                        for(;R0!=[];R0=cdr(R0)) R=cons(cons(D,car(R0)),R);
                   9374:                }else R=cons([D],R);
                   9375:        }
                   9376:        if(Lv>0) return R;
                   9377:        R=qsort(R);
                   9378:        Rev = getopt(rev); Dic=getopt(dic);
                   9379:        if(Dic==1 && Rev==1) R=reverse(R);
                   9380:        for(R0=[];R!=[];R=cdr(R)){
                   9381:                for(RT=car(R),S=0;RT!=[];RT=cdr(RT))    S+=car(RT);
                   9382:                R0=cons(cons(S,car(R)),R0);
                   9383:        }
                   9384:        if(Dic==1) return R0;
                   9385:        if(Rev==1){
                   9386:                for(R=[];R0!=[];R0=cdr(R0)){
                   9387:                        T=car(R0);
                   9388:                        R=cons(cons(-car(T),cdr(T)),R);
                   9389:                }
                   9390:                R0=R;
                   9391:        }
                   9392:        R0=qsort(R0);
                   9393:        if(Rev==1){
                   9394:                for(R=[];R0!=[];R0=cdr(R0)){
                   9395:                        T=car(R0);
                   9396:                        R=cons(cons(-car(T),cdr(T)),R);
                   9397:                }
                   9398:                R0=R;
                   9399:        }
                   9400:        return (Rev==1)?R0:reverse(R0);
                   9401: }
                   9402:
                   9403: def polcut(P,N,L)
                   9404: {
                   9405:        if(type(L)==2) L=[L];
                   9406:        M=getopt(top);
                   9407:        if(type(M)!=1) M=0;
                   9408:        T=terms(P,L);
                   9409:        for(S=0;T!=[];T=cdr(T)){
                   9410:                LT=car(T);
                   9411:                if(LT[0]<M || LT[0]>N) continue;
                   9412:                for(PW=1,LT=cdr(LT),V=L,Q=P;LT!=[];LT=cdr(LT),V=cdr(V)){
                   9413:                        Q=mycoef(Q,car(LT),car(V));PW*=car(V)^car(LT);
                   9414:                }
                   9415:                S+=Q*PW;
                   9416:        }
                   9417:        return S;
                   9418: }
                   9419:
                   9420: def redgrs(M)
                   9421: {
                   9422:        Mat = getopt(mat);
                   9423:        if(Mat!=1) Mat=0;
                   9424:        R = chkspt(M|mat=Mat);
                   9425:        if(type(R) < 4)
                   9426:                return -1;
                   9427:        if(R[4] <= 0)
                   9428:                return 1-R[4];
                   9429:        if(R[4] == 2*R[1])
                   9430:                return 0;
                   9431:        V = newvect(R[0]);
                   9432:        Type = type(M[0][0]);
                   9433:        if(Type > 3){
                   9434:                Mu = Mat-1;
                   9435:                for(I = 0; I < R[0]; I++)
                   9436:                        Mu += M[I][R[5][I]][1];
                   9437:        }
                   9438:        for(I = 0; I < R[0]; I++){
                   9439:                IR = R[5][I]; L = []; MI = M[I]; MIE=MI[IR];
                   9440:                for(J = length(MI)-1; J >= 0; J--){
                   9441:                        if(Type <= 3){
                   9442:                                VM = MI[J];
                   9443:                                if(J == IR){
                   9444:                                        VM -= R[4];
                   9445:                                        if(VM < 0) return -1;
                   9446:                                }
                   9447:                                L = cons(VM, L);
                   9448:                        }else{
                   9449:                                VM = MI[J][0];
                   9450:                                if(J == IR){
                   9451:                                        VM -= R[4];
                   9452:                                        if(VM < 0)
                   9453:                                                return -1;
                   9454:                                        if(I == 0)
                   9455:                                                EV = 1-Mat-Mu;
                   9456:                                        else
                   9457:                                                EV = 0;
                   9458:                                }else{
                   9459:                                        if(I == 0)
                   9460:                                                EV = MI[J][1] - M[0][R[5][0]][1] + 1-Mat; /* + MX - Mu; */
                   9461:                                        else
                   9462:                                                EV = MI[J][1] - MIE[1] + Mu;
                   9463:                                }
                   9464:                                L = cons([VM,EV], L);
                   9465: /*
1.24      takayama 9466:                                if(R[2] >= 2){ */ /* rigid */
1.6       takayama 9467: /*          P = dx^(R[1]);
                   9468:                                } */
                   9469:                        }
                   9470:                }
                   9471:                V[I] = L;
                   9472:        }
                   9473:        return [R[5], vtol(V)];
                   9474: }
                   9475:
                   9476: def cutgrs(A)
                   9477: {
                   9478:        for(AL=[] ; A!=[]; A=cdr(A)){    /* AT: level 2 */
                   9479:                for(ALT=[], AT=car(A); AT!=[]; AT=cdr(AT)){
                   9480:                        M = (type(car(AT)) < 4)?car(AT):car(AT)[0];
                   9481:                        if(M > 0)
                   9482:                                ALT = cons(car(AT), ALT);  /* ALT: level 2 */
                   9483:                }
                   9484:                AL = cons(reverse(ALT), AL);   /* AL: level 3 */
                   9485:        }
                   9486:        return reverse(AL);
                   9487: }
                   9488:
                   9489: def mcgrs(G, R)
                   9490: {
                   9491:        NP = length(G);
                   9492:        Mat = (getopt(mat)==1)?0:1;
1.36      takayama 9493:        if(Mat==0 && type(SM=getopt(slm))==4){
1.24      takayama 9494:                SM0=SM[0];SM1=anal2sp(SM[1],["*",-1]);
                   9495:                if(findin(0,SM0)>=0){
                   9496:                        for(SM=[],I=length(G)-1;I>0;I--)
                   9497:                                if(findin(I,SM0)<0) SM=cons(I,SM);
                   9498:                        SM=[SM,SM1];
1.36      takayama 9499:                        G=mcgrs(G,R|mat=1,slm=SM);
1.24      takayama 9500:                        return [G[0],anal2sp(G[1],["*",-1])];
                   9501:                }
                   9502:        }else SM0=0;
1.6       takayama 9503:        for(R = reverse(R) ; R != []; R = cdr(R)){
                   9504:                GN = [];
                   9505:                L = length(G)-1;
                   9506:                RT = car(R);
                   9507:                if(type(RT) == 4){
1.37      takayama 9508:                        if(length(RT)==L+1&&RT[0]!=0){
                   9509:                                R=cons(cdr(RT),cdr(R));
1.24      takayama 9510:                                R=cons(RT[0],R);
1.37      takayama 9511:                                R=cons(0,R);
1.24      takayama 9512:                                continue;
                   9513:                        }               /* addition */
                   9514:                        RT = reverse(RT); S = ADS = 0;
1.37      takayama 9515:                        for(G = reverse(G); G != []; G = cdr(G), L--, RT=cdr(RT)){
                   9516:                                AD = car(RT);
1.24      takayama 9517:                                if(L > 0){
1.6       takayama 9518:                                        S += AD;
1.24      takayama 9519:                                        if(SM && findin(L,SM0)>=0) ADS+=AD;
                   9520:                                }else
1.6       takayama 9521:                                        AD = -S;
                   9522:                                for(GTN = [], GT = reverse(car(G)); GT != []; GT = cdr(GT))
                   9523:                                        GTN = cons([car(GT)[0],car(GT)[1]+AD], GTN);
                   9524:                                GN = cons(GTN, GN);
                   9525:                        }
                   9526:                        G = GN;
1.24      takayama 9527:                        if(SM0){
                   9528:                                for(ST=reverse(SM1),SM1=[]; ST!=[]; ST=cdr(ST))
                   9529:                                        SM1 = cons([car(ST)[0],car(ST)[1]+ADS], SM1);
                   9530:                        }
1.6       takayama 9531:                        continue;
                   9532:                }
1.24      takayama 9533:                if(RT==0) continue;
                   9534:                VP = newvect(L+1); GV = ltov(G);        /* middle convolution */
1.6       takayama 9535:                for(I = S = OD = 0; I <= L; I++){
                   9536:                        RTT = (I==0)?(Mat-RT):0;
                   9537:                        VP[I] = -1;
1.24      takayama 9538:                        for(J = M = K = 0, GT = GV[I]; GT != []; GT = cdr(GT), J++){
1.6       takayama 9539:                                if(I == 0)
                   9540:                                        OD += car(GT)[0];
                   9541:                                if(car(GT)[1] == RTT && car(GT)[0] > M){
                   9542:                                        S += car(GT)[0]-M;
1.36      takayama 9543:                                        M=car(GT)[0];
1.6       takayama 9544:                                        VP[I] = J;
                   9545:                                }
                   9546:                        }
1.24      takayama 9547:                }
                   9548:                S -= (L-1)*OD;
                   9549:                for(GN = []; L >= 0; L--){
                   9550:                        GT = GV[L];
                   9551:                        RTT = (L==0)?(-RT):RT;
1.38      takayama 9552:                        GTN = (VP[L]>=0 || S == 0)?[]:[[-S,(L==0)?(Mat-RT):0]];
1.24      takayama 9553:                        for(J = 0; GT != []; GT = cdr(GT), J++){
                   9554:                                if(J != VP[L]){
                   9555:                                        GTN = cons([car(GT)[0],car(GT)[1]+RTT], GTN);
                   9556:                                        continue;
1.6       takayama 9557:                                }
1.24      takayama 9558:                                K = car(GT)[0] - S;
                   9559:                                if(K < 0){
                   9560:                                        print("Not realizable");
                   9561:                                        return;
                   9562:                                }
1.38      takayama 9563:                                if(K>0) GTN = cons([K,(L==0)?(Mat-RT):0], GTN);
1.24      takayama 9564:                        }
                   9565:                        GN = cons(reverse(GTN), GN);
                   9566:                }
1.36      takayama 9567:                if(SM0&&RT!=0){
                   9568:                        for(M0=M1=-OD,L=length(G)-1;L>=0;L--){
                   9569:                                if(findin(L,SM0)>=0){
                   9570:                                        M0+=OD;
                   9571:                                        if(VP[L]>=0) M0-=GV[L][VP[L]][0];
                   9572:                                }else{
                   9573:                                         M1+=OD;
                   9574:                                        if(VP[L]>=0) M1-=GV[L][VP[L]][0];
                   9575:                                }
                   9576:                        }
                   9577:                        SM2=[];
                   9578:                        if((Mx1=anal2sp(SM1,["max",1,-RT])[0])<0){
                   9579:                                if(M1>0) SM2=cons([M1,0],SM2);
1.38      takayama 9580:                        }else M1+=car(SM1[Mx1]);
1.36      takayama 9581:                        if((Mx0=anal2sp(SM1,["max",1,0])[0])<0){
                   9582:                                if(M0>0) SM2=cons([M0,RT],SM2);
1.38      takayama 9583:                        }else M0+=car(SM1[Mx0]);
1.36      takayama 9584:                        for(J=0;SM1!=[];J++,SM1=cdr(SM1)){
                   9585:                                if(J==Mx0){
                   9586:                                        if(M0>0) SM2=cons([M0,-RT],SM2);
                   9587:                                }else if(J==Mx1){
                   9588:                                        if(M1>0) SM2=cons([M1,0],SM2);
                   9589:                                }else SM2=cons([car(SM1)[0],car(SM1)[1]+RT],SM2);
1.6       takayama 9590:                        }
1.36      takayama 9591:                        SM1=reverse(SM2);
1.6       takayama 9592:                }
                   9593:                G = cutgrs(GN);
                   9594:        }
1.36      takayama 9595:        return SM0?[G,SM1]:G;
1.6       takayama 9596: }
                   9597:
1.38      takayama 9598: def spslm(M,TT)
                   9599: {
                   9600:        R=getbygrs(M,1|mat=1);
                   9601:        if(type(R)!=4||type(R[0])!=4||type(S=R[0][1])!=4){
                   9602:                errno(0);return0;
                   9603:        }
                   9604:        if(S[1]!=[[1,0]]){
                   9605:                print("Not rigid!");return0;
                   9606:        }
                   9607:        if((F=S[0][0][1])!=0){
                   9608:                for(V=vars(F);V!=[];V=cdr(V)){
                   9609:                        if(mydeg(F,car(V))==1){
                   9610:                                T=lsol(F,car(V));
                   9611:                                break;
                   9612:                        }
                   9613:                }
                   9614:                if(V==[]){
                   9615:                        print("Violate Fuchs condition!");
                   9616:                        return0;
                   9617:                }
                   9618:        }
                   9619:        for(P=[];R!=[];R=cdr(R))
                   9620:                P=cons(car(R)[0],P);
                   9621:        if(F!=0){
                   9622:                S=mysubst(S,[car(V),T]);P=mysubst(P,[car(V),T]);
                   9623:        }
                   9624:        return mcgrs(S,P|mat=1,slm=[TT,[[1,0]]]);
                   9625: }
                   9626:
1.6       takayama 9627: /*
                   9628:   F=0 : unify
                   9629:   F=["add",S] :
                   9630:   F=["sub",S] :
                   9631:   F=["+",A,B] :
                   9632:   F=["*",A,B] :
                   9633:   F=["mul",K];
                   9634:   F=["get",F,V] :
                   9635:   F=["put",F,V] :
                   9636:   F=["get1",F,V] :
                   9637:   F=["put1",F,V] :
1.24      takayama 9638:   F=["max"] :
                   9639:   F=["max",F.V] :
1.6       takayama 9640:   F=["put1"] :
                   9641:   F=["val",F];
                   9642:   F=["swap"];
                   9643:  */
                   9644: def anal2sp(R,F)
                   9645: {
                   9646:        if(type(F)==4&&type(F[0])==4){ /* multiple commands */
                   9647:                for(;F!=[];F=cdr(F)) R=anal2sp(R,car(F));
                   9648:                return R;
                   9649:        }
                   9650:        if(type(F)==7) F=[F];
                   9651:        if(F==0){               /* unify */
                   9652:                R=ltov(R);
                   9653:                L=length(R);
                   9654:                for(J=1;J<L;J++){
                   9655:                        for(I=0;I<J;I++){
                   9656:                                if(cdr(R[I])==cdr(R[J])){
                   9657:                                        R[I]=cons(R[I][0]+R[J][0],cdr(R[I]));
                   9658:                                        R[J]=cons(0,cdr(R[J]));
                   9659:                                        break;
                   9660:                                }
                   9661:                        }
                   9662:                }
                   9663:                for(G=[],I=L-1;I>=0;I--)
                   9664:                        if(R[I][0]!=0) G=cons(R[I],G);
                   9665:                if(length(G[0])==2){    /* sort by multiplicity */
                   9666:                        R=ltov(G);
                   9667:                        L=length(R);
                   9668:                        for(I=1;I<L;I++){
                   9669:                                for(J=I;J>0;J--){
                   9670:                                        if(R[J-1][0]>R[J][0]) break;
                   9671:                                        if(R[J-1][0]==R[J][0]){
                   9672:                                                S1=rtostr(R[J-1][1]);S2=rtostr(R[J][1]);
                   9673:                                                if((K=str_len(S1)-str_len(S2))<0) break;
                   9674:                                                if(!K&&S1<S2) break;
                   9675:                                        }
                   9676:                                        S=R[J-1];R[J-1]=R[J];R[J]=S;
                   9677:                                }
                   9678:                        }
                   9679:                        G=vtol(R);
                   9680:                }
                   9681:                return G;
                   9682:        }
                   9683:        if(F[0]=="add") return append(R,F[1]);
1.24      takayama 9684:        if(F[0]=="max"){
                   9685:                if(length(F)==3) C=1;
                   9686:                else C=0;
                   9687:                M=-10^10;K=[-1];
                   9688:                for(I=0;R!=[];R=cdr(R),I++){
                   9689:                        if(C>0&&car(R)[F[1]]!=F[2]) continue;
                   9690:                        if(M<car(R)[0]){
                   9691:                                M=car(R)[0];K=[I,car(R)];
                   9692:                        }
                   9693:                }
                   9694:                return K;
                   9695:        }
1.6       takayama 9696:        R=reverse(R);
                   9697:        if(F[0]=="sub"){
                   9698:                for(S=F[1];S!=[];S=cdr(S))
                   9699:                        R=cons(cons(-car(S)[0],cdr(car(S))),R);
                   9700:                return reverse(R);
                   9701:        }
                   9702:        if(F[0]=="swap"){
                   9703:                for(G=[];R!=[];R=cdr(R))
                   9704:                        G=cons([car(R)[0],car(R)[2],car(R)[1]],G);
                   9705:                return G;
                   9706:        }
                   9707:        if(F[0]=="+"){
1.24      takayama 9708:                L=length(F);
                   9709:                for(G=[];R!=[];R=cdr(R)){
                   9710:                        for(S=[],I=L-1;I>0;I--) S=cons(car(R)[I]+F[I],S);
                   9711:                        G=cons(cons(car(R)[0],S),G);
                   9712:                }
1.6       takayama 9713:                return G;
                   9714:        }
                   9715:        if(F[0]=="*"){
1.24      takayama 9716:                L=length(F);
                   9717:                for(G=[];R!=[];R=cdr(R)){
                   9718:                        for(S=0,I=1;I<L;I++) S+=car(R)[I]*F[I];
                   9719:                        G=cons([car(R)[0],S],G);
                   9720:                }
1.6       takayama 9721:                return G;
                   9722:        }
                   9723:        if(F[0]=="mult"){
                   9724:                K=F[1];
                   9725:                for(G=[];R!=[];R=cdr(R)) G=cons(cons(K*car(R)[0],cdr(car(R))),G);
                   9726:                return G;
                   9727:        }
                   9728:        if(F[0]=="get"){
                   9729:                for(G=[];R!=[];R=cdr(R))
                   9730:                        if(car(R)[F[1]]==F[2])  G=cons(car(R),G);
                   9731:                return G;
                   9732:        }
                   9733:        if(F[0]=="put"){
                   9734:                if(F[1]==1){
                   9735:                        for(G=[];R!=[];R=cdr(R)) G=cons([car(R)[0],F[2],car(R)[2]],G);
                   9736:                }else{
                   9737:                        for(G=[];R!=[];R=cdr(R)) G=cons([car(R)[0],car(R)[1],F[2]],G);
                   9738:                }
                   9739:                return G;
                   9740:        }
                   9741:        if(F[0]=="get1"){
                   9742:                if(length(F)==2){
                   9743:                        for(G=[];R!=[];R=cdr(R)) G=cons([R[0][0],car(R)[F[1]]],G);
                   9744:                        return G;
                   9745:                }
                   9746:                for(G=[];R!=[];R=cdr(R))
                   9747:                        if(car(R)[F[1]]==F[2])  G=cons([R[0][0],car(R)[3-F[1]]],G);
                   9748:                return G;
                   9749:        }
                   9750:        if(F[0]=="put1"){
                   9751:                if(length(F)==1)
                   9752:                        for(G=[];R!=[];R=cdr(R)) G=cons([car(R)[0],car(R)[1],car(R)[1]],G);
                   9753:                else if(F[1]==1)
                   9754:                        for(G=[];R!=[];R=cdr(R)) G=cons([car(R)[0],F[2],car(R)[1]],G);
                   9755:                else{
                   9756:                        for(G=[];R!=[];R=cdr(R)) G=cons([car(R)[0],car(R)[1],F[2]],G);
                   9757:                }
                   9758:                return G;
                   9759:        }
                   9760:        if(F[0]=="val"){
                   9761:                V=(length(F)==1)?1:F[1];
                   9762:                for(I=J=0;R!=[];R=cdr(R)){
                   9763:                        I+=car(R)[0];
                   9764:                        J+=car(R)[0]*car(R)[V];
                   9765:                }
                   9766:                return [I,J];
                   9767:        }
                   9768:        return 0;
                   9769: }
                   9770:
                   9771: /*
                   9772:  G=0          get trivial common spct
                   9773:  G="..,..,"   spectre type of 4 singular points
                   9774:  P=["get"]    all spct
                   9775:  P=["get",L]
                   9776:     L=n        for variable x_n
                   9777:     L=[m,n]    for residue [m,n]
1.23      takayama 9778:     L=[m,n,l]  for residue [m,n,l]
1.6       takayama 9779:     L=[[m,n],[m',n']] for common spct
1.23      takayama 9780:  P=["eigen",I]   decomposition of A_I
1.6       takayama 9781:  P=["get0",[m,n],[m',n']] for the sum of residues
1.23      takayama 9782:  P=["rest",[m,n]] restriction
1.6       takayama 9783:  P=["swap",[m,n]] for symmetry
                   9784:  P=["perm",[...]] for symmetry
                   9785:  P=["deg"]
                   9786:  P=["homog"]
                   9787:  P=["sort"]
                   9788:  P=[[[m,n],c],...] for addition
                   9789:  P=[c] or [[c],...] for middle convolution wrt 0
                   9790:  P=[m,c] or [[m,c],...] for general middle convolution
                   9791:  P=[[a,b,c]] for special additions
                   9792:  P=[[d,a,b,c]] for middle convotution and additions
                   9793:  P=["multi",...] multiple commands
                   9794:  P=0,1,3 : return sim. spectre of 4 singular points
                   9795: */
                   9796: def mc2grs(G,P)
                   9797: {
                   9798:        if(G==0){
                   9799:                G=[];
                   9800:                for(I=4;I>=0;I--){
                   9801:                        V=lsort([0,1,2,3,4],[I],1);
                   9802:                        for(J=1;J<4;J++){
                   9803:                                for(T=[],K=3;K>0;K--)
                   9804:                                        if(K!=J) T=cons(V[K],T);
                   9805:                                G=cons([[[V[0],V[J]],T],[1,0,0]],G);
                   9806:                        }
                   9807:                }
                   9808:                G=mc2grs(G,"sort");
                   9809:        }else if(type(G)==7||(type(G)==4&&length(G)==4)){
                   9810:                if(type(G)==7) G=s2sp(G);
                   9811:                F=(getopt(top)==0)?1:0;
                   9812:                K=[];
                   9813:                if(type(P)==1&&iand(P,1)&&type(G[0][0])<4){
                   9814:                        G=s2sp(G|std=1);
                   9815:                        if(F) G=[G[1],G[2],G[3],G[0]];
                   9816:                        G=sp2grs(G,[d,c,b,a],[1,length(G[0]),-1]|mat=1);
                   9817:                        G=reverse(G);
                   9818:                        if(iand(P,3)==3){
                   9819:                                V=vars(G);
                   9820:                                for(H=L=[a,b,c,d];H!=[];H=cdr(H))
                   9821:                                        if(findin(car(H),V)>=0) G=subst(G,car(H),makev([car(H),1]));
                   9822:                                G=shortv(G,[a,b,c,d]);
                   9823:                                V=vars(G);
                   9824:                                for(H=G[3];H!=[];H=cdr(H)){
                   9825:                                        T=car(H)[1];
                   9826:                                        if(type(T)>1&&!isvar(T)){
                   9827:                                                K=[car(H)[0],T];
                   9828:                                                break;
                   9829:                                        }
                   9830:                                }
                   9831:                        }
                   9832:                        F=1;
                   9833:                }
                   9834:                if(F) G=[G[3],G[0],G[1],G[2]];
                   9835:                S=cons(["anal",1],getopt());
                   9836:                if(!(R=m2mc(G,0|option_list=S))) return R;
                   9837:                for(G=0,R=cdr(R);R!=[];R=cdr(R)){
                   9838:                        TR=car(R)[0];
                   9839:                        if(TR[0]) G=mc2grs(G,[[TR[0]]]);
                   9840:                        G=mc2grs(G,[cdr(TR)]);
                   9841:                }
                   9842:                if(type(P)==1&&K!=[]){
                   9843:                        for(T=10;T<36;T++){
                   9844:                                if(findin(X=makev([T]),V)>=0) continue;
                   9845:                                F=K[0]*(X-K[1]);
                   9846:                                return [F,simplify(G,[F],4)];
                   9847:                        }
                   9848:                }
                   9849:        }
                   9850:        if(type(P)<2) return G;
                   9851:        F=0;
1.25      takayama 9852:        if(type(P)==7||(type(P)==4&&
                   9853:                (type(P[0])<4||(type(P[0])==4&&length(P[0])==2&&type(P[0][0])<4&&type(P[1])<4))
                   9854:          )) P=[P];
1.6       takayama 9855:        if((Dvi=getopt(dviout))!=1&&Dvi!=2&&Dvi!=-1) Dvi=0;
                   9856:        Keep=(Dvi==2)?1:0;
                   9857:        if(type(P)==4&&type(F=car(P))==7){
                   9858:                if(F=="mult"){
                   9859:                        for(P=cdr(P);P!=[];P=cdr(P)) G=mc2grs(G,car(P)|option_list=getopt());
                   9860:                        return G;
                   9861:                }
                   9862:                if(F=="show"){
                   9863:                        for(R=str_tb(0,0);G!=[];){
                   9864:                                L=car(G);
                   9865:                                I=L[0][0];J=L[0][1];
                   9866:                                str_tb("[A_{"+rtostr(I[0])+rtostr(I[1])+"}:A_{"+rtostr(J[0])+rtostr(J[1])
                   9867:                                        +"}]&=\\left\\{",R);
                   9868:                                for(L=cdr(L);;){
                   9869:                                        S=car(L);
                   9870:                                        str_tb("["+my_tex_form(S[1])+":"+my_tex_form(S[2])+"]",R);
                   9871:                                        if(S[0]!=1) str_tb("_{"+rtostr(S[0])+"}",R);
                   9872:                                        if((L=cdr(L))==[]) break;
                   9873:                                        str_tb(",\\,",R);
                   9874:                                }
                   9875:                                str_tb("\\right\\}",R);
                   9876:                                if((G=cdr(G))==[]) break;
                   9877:                                str_tb(",\\\\\n",R);
                   9878:                        }
                   9879:                        R=texbegin("align*",str_tb(0,R));
                   9880:                        if(Dvi!=-1) dviout(R|keep=Keep);
                   9881:                        return R;
                   9882:                }
                   9883:                if(F=="show0"){
1.26      takayama 9884:                        if(type(Fig=getopt(fig))>0){
                   9885:                                PP=[[-1.24747,-5.86889],[1.24747,-5.86889],[3.52671,-4.8541],[5.19615,-3],
                   9886:                                  [5.96713,-0.627171],[5.70634,1.8541],[4.45887,4.01478],[2.44042,5.48127],
                   9887:                                  [0,6],[-2.44042,5.48127],[-4.45887,4.01478],[-5.70634,1.8541],
                   9888:                                  [-5.96713,-0.627171],[-5.19615,-3],[-3.52671,-4.8541]];
                   9889:                                PL=[[1.8,-5.2],[5.7,-1.7],[3.2,5],[-3.6,4.7],[2.2,3],[-2.8,2.8],
                   9890:                                  [-1.5,-1.4],[-3.2,-2.5],[0.76,-1.4],[-2,0.2]];
                   9891:                                PC=["black,dashed","green,dashed","red,dashed","blue,dashed",
                   9892:                                        "black","cyan","green","blue","red","magenta"];
                   9893:                                N=["1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"];
                   9894:                                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],
                   9895:                                  [2,9,14],[3,6,13]];
                   9896:                                TB=str_tb("\\draw\n",TB);
                   9897:                                if(type(Fig)==4){
                   9898:                                        if(type(car(Fig))==1){
                   9899:                                                PP=ptaffine(car(Fig)/12,PP);PL=ptaffine(car(Fig)/12,PL);
                   9900:                                                Fig=cdr(Fig);
                   9901:                                        }
                   9902:                                        if(Fig!=[]&&length(Fig)==10) PC=Fig;
                   9903:                                }
                   9904:                                for(R=mc2grs(G,"show0"|dviout=-1),I=0;R!="";I++){       /* 頂点 */
                   9905:                                        J=str_chr(R,0,",");
                   9906:                                        if(J>0){
                   9907:                                                S=str_cut(R,0,J-1);
                   9908:                                                R=str_cut(R,J+1,1000);
                   9909:                                        }else{
                   9910:                                                S=R;R="";
                   9911:                                        }
                   9912:                                        T=(str_chr(S,0,"1")==0)?"":"[red]";
                   9913:                                        str_tb(["node",T,"(",N[I],") at ",xypos(PP[I]),"{$",S,"$}\n"],TB);
                   9914:                                }
                   9915:                                for(S=PC,P=PL,I=0;I<4;I++){
                   9916:                                        for(J=I+1;J<5;J++,S=cdr(S),P=cdr(P)){                   /* 線の番号 */
                   9917:                                                SS=car(S);
                   9918:                                                if((K=str_chr(SS,0,","))>0) SS=sub_str(SS,0,K-1);
                   9919:                                                str_tb(["node[",SS,"] at ",xypos(car(P)),
                   9920:                                                        "{$[",rtostr(I),rtostr(J),"]$}\n"],TB);
                   9921:                                        }
                   9922:                                }
                   9923:                                str_tb(";\n",TB);
                   9924:                                for(I=0;I<10;I++){              /* 線 */
                   9925:                                        S=car(PC);P0=car(PC);L0=car(LL);PC=cdr(PC);LL=cdr(LL);
                   9926:                                        C=[N[L0[0]-1],N[L0[1]-1],N[L0[2]-1]];
                   9927:                                        str_tb(["\\draw[",S,"] (", C[0],")--(",C[1],") (",
                   9928:                                                C[0],")--(",C[2],") (",C[1],")--(",C[2],");\n"],TB);
                   9929:                                }
                   9930:                                R=str_tb(0,TB);
                   9931:                                if(TikZ==1&&Dvi!=-1) dviout(xyproc(R)|dviout=1,keep=Keep);
                   9932:                                return R;
                   9933:                        }
1.6       takayama 9934:                        for(S="",L=[];G!=[];G=cdr(G)){
                   9935:                                for(TL=[],TG=cdr(car(G));TG!=[];TG=cdr(TG)) TL=cons(car(TG)[0],TL);
                   9936:                                TL=msort(TL,[-1,0]);
                   9937:                                if(Dvi){
                   9938:                                        if(S!="") S=S+",";
                   9939:                                        for(I=J=0,T=append(TL,[[0]]);T!=[];T=cdr(T)){
                   9940:                                                if(car(T)==I) J++;
                   9941:                                                else{
                   9942:                                                        if(I>0&&J>0){
                   9943:                                                                if(I>9) S=S+"("+rtostr(I)+")";
                   9944:                                                                else S=S+rtostr(I);
                   9945:                                                                if(J>1){
                   9946:                                                                        if(J>9) S=S+"^{"+rtostr(J)+"}";
                   9947:                                                                        else S=S+"^"+rtostr(J);
                   9948:                                                                }
                   9949:                                                        }
                   9950:                                                        I=car(T);J=1;
                   9951:                                                }
                   9952:                                        }
                   9953:                                }
                   9954:                                L=cons(TL,L);
                   9955:                        }
                   9956:                        if(Dvi){
1.43      takayama 9957:                                if(Dvi!=-1) dviout(S|eq=0);
1.6       takayama 9958:                                return S;
                   9959:                        }
                   9960:                        return reverse(L);
                   9961:                }
                   9962:                if(F=="sort"){
                   9963:                        G=ltov(G);L=length(G);
                   9964:                        for(I=0;I<L;I++){
                   9965:                                S=G[I][0];
                   9966:                                if(S[0][0]>S[0][1]) S=[[S[0][1],S[0][0]],S[1]];
                   9967:                                if(S[1][0]>S[1][1]) S=[S[0],[S[1][1],S[1][0]]];
                   9968:                                if(S[0]>S[1]){
                   9969:                                        F=0;S=[S[1],S[0]];
                   9970:                                }
                   9971:                                if(S!=G[I][0]){
                   9972:                                        if(F==0) G[I]=cons(S,anal2sp(cdr(G[I]),"swap"));
                   9973:                                        else G[I]=cons(S,cdr(G[I]));
                   9974:                                }
                   9975:                                for(J=I;J>0;J--){
                   9976:                                        if(G[J-1][0]<G[J][0]) break;
                   9977:                                        S=G[J-1];G[J-1]=G[J];G[J]=S;
                   9978:                                }
                   9979:                        }
                   9980:                        return vtol(G);
                   9981:                }
                   9982:                if(F=="get"||F=="get0"){
                   9983:                        if(Dvi!=0) F="get";
                   9984:                        if(length(P)==1||type(P[1])<2){
                   9985:                                L=[];
                   9986:                                if(length(P)==1){
                   9987:                                        for(I=3;I>=0;I--){
                   9988:                                                for(J=4;J>I;J--) L=cons(mc2grs(G,[F,[I,J]]),L);
                   9989:                                        }
                   9990:                                }else{
                   9991:                                        for(I=P[1],J=4;J>=0;J--){
                   9992:                                                if(I==J) continue;
                   9993:                                                L=cons(mc2grs(G,[F,(I<J)?[I,J]:[J,I]]),L);
                   9994:                                        }
                   9995:                                }
                   9996:                                if(Dvi){
                   9997:                                        if(length(L)==10){
                   9998:                                                R=ltov(L);
                   9999:                                                if(R[6][0]==[1,4]){
                   10000:                                                        S=R[6];R[6]=R[7];R[7]=S;
                   10001:                                                        L=vtol(R);
                   10002:                                                }
                   10003:                                        }
                   10004:                                        for(R=S=[],L=reverse(L);L!=[];L=cdr(L)){
                   10005:                                                T=car(L);
                   10006:                                                R=cons(cdr(T),R);
                   10007:                                                if(S==[]) S="A_{"+rtostr(T[0][0])+rtostr(T[0][1])+"}\\\\\n";
                   10008:                                                else S="A_{"+rtostr(T[0][0])+rtostr(T[0][1])+"}&"+S;
                   10009:                                        }
                   10010:                                        L=ltotex(R|opt="GRS",pre=S);
1.26      takayama 10011:                                        if(type(D=getopt(div))==1 || type(D)==4) L=divmattex(L,D);
1.6       takayama 10012:                                        if(Dvi>0) dviout(L|eq=0,keep=Keep);
                   10013:                                }
                   10014:                                return L; /* get all spct */
                   10015:                        }
                   10016:                        if(type(T=P[1])==4){
                   10017:                                if(F=="get0"&&length(P)==3&&type(I=P[1])==4&&type(J=P[2])==4){
                   10018:                                        if(I[0]>I[1]) I=[I[1],I[0]];
                   10019:                                        if(J[0]>J[1]) J=[J[1],J[0]];
                   10020:                                        if(I[0]>I[0]){S=I;I=J;J=S;};
                   10021:                                        K=lsort(I,J,0);
                   10022:                                        if(length(K)==4){
1.24      takayama 10023:                                                S=mc2grs(G,["get0",[I,J]]);
1.6       takayama 10024:                                                return anal2sp(S,[["*",1,1],0]);
                   10025:                                        }
                   10026:                                        I=lsort(K,lsort(I,J,2),1);
                   10027:                                        S=lsort([0,1,2,3,4],K,1);
1.24      takayama 10028:                                        D=mc2grs(G,"deg");
1.6       takayama 10029:                                        if(findin(4,S)<0) D=-D;
1.24      takayama 10030:                                        J=mc2grs(G,["get0",[I,S]]);
1.6       takayama 10031:                                        if(I[0]>S[0]) J=sp2grs(J,"swap");
                   10032:                                        return anal2sp(J,[["+",0,D],["*",-1,1]]);
                   10033:                                }
                   10034:                                if(type(car(T))==4){
                   10035:                                        if(T[0][0]>T[0][1]) T=[[T[0][1],T[0][0]],T[1]];
                   10036:                                        if(T[1][0]>T[1][1]) T=[T[0],[T[1][1],T[1][0]]];
                   10037:                                        if(T[0][0]>T[1][0]) T=[T[1],T[0]];
                   10038:                                        for(PG=G;PG!=[];PG=cdr(PG))
                   10039:                                                if(car(PG)[0]==T) return (F=="get")?car(PG):cdr(car(PG));
                   10040:                                        return [];      /* get common spct */
                   10041:                                }
1.23      takayama 10042:                                if(length(T)==3){
                   10043:                                        T0=T;T=lsort([0,1,2,3,4],T,1);
                   10044:                                        if(length(T)!=2) return [];
                   10045:                                }else T0=0;
1.6       takayama 10046:                                if(T[0]>T[1]) T=[T[1],T[0]];
                   10047:                                for(FT=0,PG=G;PG!=[];PG=cdr(PG)){
                   10048:                                        if(car(PG)[0][0]==T){
                   10049:                                                FT=1;break;
                   10050:                                        }
                   10051:                                        if(car(PG)[0][1]==T){
                   10052:                                                FT=2;break;
                   10053:                                        }
                   10054:                                }
                   10055:                                if(!FT) return [];
                   10056:                                L=anal2sp(cdr(car(PG)),[["get1",FT],0]);
1.23      takayama 10057:                                if(T0!=0){
                   10058:                                        if((K=mc2grs(G,"deg"))!=0){
                   10059:                                                if(T[1]!=4) K=-K;
                   10060:                                                R=reverse(L);
                   10061:                                                for(L=[];R!=[];R=cdr(R)) L=cons([car(R)[0],car(R)[1]+K],L);
                   10062:                                        }
                   10063:                                        T=T0;
                   10064:                                }
1.6       takayama 10065:                                return (F=="get")?cons(T,L):L;
                   10066:                        }
                   10067:                }
1.27      takayama 10068:                if(F=="rest"||F=="eigen"||F=="rest0"||F=="rest1"){
1.23      takayama 10069:                        if(F!="eigen") G=mc2grs(G,"homog");
1.26      takayama 10070:                        if(length(P)==1){
                   10071:                                for(R=[],I=0;I<4;I++){
                   10072:                                        for(J=I+1;J<5;J++){
                   10073:                                                S=mc2grs(G,[F,[I,J]]);
1.27      takayama 10074:                                                if(S!=[]) R=cons(cons([I,J],S),R);
1.26      takayama 10075:                                        }
                   10076:                                }
                   10077:                                R=reverse(R);
                   10078:                                if(Dvi){
                   10079:                                        TB=str_tb(0,0);
1.27      takayama 10080:                                        if(F=="rest0"||F=="rest1"){
1.26      takayama 10081:                                                for(T=R;;){
                   10082:                                                        TT=car(T);
                   10083:                                                        S=rtostr(car(TT)[0])+rtostr(car(TT)[1]);
                   10084:                                                        str_tb(["[",S,"]","&: "],TB);
                   10085:                                                        for(TR=[],TT=cdr(TT);TT!=[];TT=cdr(TT))
                   10086:                                                                TR=cons(car(TT)[1],TR);
                   10087:                                                        for(TR=qsort(TR);TR!=[];TR=cdr(TR))
                   10088:                                                                str_tb([s2sp(car(TR)|short=1,std=-1),"\\ \\ "],TB);
                   10089:                                                        if((T=cdr(T))==[]) break;
                   10090:                                                        str_tb("\\\\\n",TB);
                   10091:                                                }
                   10092:                                        }else{
                   10093:                                                TB=str_tb(0,0);
                   10094:                                                for(T=R;;){
                   10095:                                                        TT=car(T);
                   10096:                                                        S=rtostr(car(TT)[0])+rtostr(car(TT)[1]);
                   10097:                                                        str_tb(["[",S,"]",":\\ "],TB);
                   10098:                                                        for(TR=[],TT=cdr(TT);;){
                   10099:                                                                T0=car(TT);
                   10100:                                                                str_tb(["&",my_tex_form(car(T0)),"&&\\to\\ \n",
                   10101:                                                                        ltotex(cdr(T0)|opt="GRS")],TB);
                   10102:                                                                if((TT=cdr(TT))==[]) break;
                   10103:                                                                str_tb("\\\\\n",TB);
                   10104:                                                        }
                   10105:                                                        if((T=cdr(T))==[]) break;
                   10106:                                                        str_tb("\\allowdisplaybreaks\\\\\n",TB);
                   10107:                                                }
                   10108:                                        }
                   10109:                                        R=texbegin("align*",str_tb(0,TB));
                   10110:                                        if(Dvi!=-1) dviout(R|keep=Keep);
                   10111:                                }
                   10112:                                return R;
                   10113:                        }
1.23      takayama 10114:                        I=P[1];
                   10115:                        if(I[0]>I[1]) I=[I[1],I[0]];
                   10116:                        L=lsort([0,1,2,3,4],I,1);
1.29      takayama 10117:                        if(F=="rest"&&length(P)==3){
                   10118:                                J=P[2];if(J[0]>J[1]) J=[J[1],J[0]];
                   10119:                                L=lsort(L,J,1);
                   10120:                                if(length(L)!=1) return 0;
                   10121:                                return [mc2grs(G,["get0",I]),mc2grs(G,["get0",[I[0],J[0]],[I[1],J[1]]]),
                   10122:                                        mc2grs(G,["get0",[I[0],J[1]],[I[1],J[0]]]),mc2grs(G,["get0",[I[0],I[1],L[0]]])];
                   10123:                        }
1.23      takayama 10124:                        L=[[L[0],L[1]],[L[0],L[2]],[L[1],L[2]]];
1.24      takayama 10125:                        if(F!="eigen"){
                   10126:                                if(I==[0,4]) L=reverse(L);
                   10127:                                else{
                   10128:                                        for(V=[],J=2;J>=0;J--){
                   10129:                                                if(L[J][0]==0) V=cons([L[J][1],J],V);
                   10130:                                                else{
                   10131:                                                        for(K=4;K>=0;K--){
                   10132:                                                                if(findin(K,L[J])<0){
                   10133:                                                                        V=cons([K,J],V);break;
                   10134:                                                                }
                   10135:                                                        }
                   10136:                                                }
                   10137:                                        }
                   10138:                                        V=qsort(V);
                   10139:                                        L=[L[V[0][1]],L[V[1][1]],L[V[2][1]]];
                   10140:                                }
                   10141:                        }
1.23      takayama 10142:                        for(LL=[],T=L;T!=[];T=cdr(T))
                   10143:                                LL=cons(mc2grs(G,["get0",[I,car(T)]]),LL);
                   10144:                        LL=reverse(LL);
                   10145:                        for(R=[],Q=mc2grs(G,["get0",I]);Q!=[];Q=cdr(Q)){
1.24      takayama 10146:                                for(T=[],J=2;J>=0;J--){
                   10147:                                        V=anal2sp(LL[J],["get1",(I[0]<L[J][0])?1:2,car(Q)[1]]);
                   10148:                                        if(F=="rest"){
                   10149:                                                if(I[0]==0){
                   10150:                                                        if(I[1]!=4){
                   10151:                                                                if(L[J][1]!=4) V=anal2sp(V,["+",-car(Q)[1]]);
                   10152:                                                        }else if (L[J][0]!=2) V=anal2sp(V,["+",-car(Q)[1]]);
                   10153:                                                }else if(L[J][0]!=0) V=anal2sp(V,["+",-car(Q)[1]]);
                   10154:                                        }
                   10155:                                        T=cons(V,T);
                   10156:                                }
1.23      takayama 10157:                                R=cons(cons(car(Q)[1],T),R);
                   10158:                        }
1.27      takayama 10159:                        if(F=="rest0"||F=="rest1"){
                   10160:                                for(L=[];R!=[];R=cdr(R)){
                   10161:                                        TR=cdr(car(R));
1.28      takayama 10162:                                        if(F=="rest1"&&chkspt(TR|opt="idx")==2) continue;
1.27      takayama 10163:                                        L=cons([car(R)[0],s2sp(chkspt(TR|opt=6))],L);
                   10164:                                }
1.23      takayama 10165:                                R=reverse(L);
                   10166:                        }
                   10167:                        return R;
                   10168:                }
1.6       takayama 10169:                if(F=="deg"){
                   10170:                        for(S=I=0;I<3;I++){
                   10171:                                for(J=I+1;J<4;J++){
                   10172:                                        L=mc2grs(G,["get0",[I,J]]);
                   10173:                                        L=anal2sp(L,"val");
                   10174:                                        S+=L[1];
                   10175:                                }
                   10176:                        }
                   10177:                        return S/L[0];
                   10178:                }
1.27      takayama 10179:                if(F=="spct"||F=="spct1"){
                   10180:                        K=(F=="spct")?5:6;
1.6       takayama 10181:                        G=mc2grs(G,"get");
1.27      takayama 10182:                        M=newmat(5,K);
1.6       takayama 10183:                        for(;G!=[];G=cdr(G)){
                   10184:                                GT=car(G);I=GT[0][0];J=GT[0][1];
                   10185:                                for(S=0,L=[],GT=cdr(GT);GT!=[];GT=cdr(GT)){
                   10186:                                        L=cons(car(GT)[0],L);
                   10187:                                }
                   10188:                                L=reverse(qsort(L));
                   10189:                                M[I][J]=M[J][I]=L;
                   10190:                        }
                   10191:                        for(D=0,GT=M[0][1];GT!=[];GT=cdr(GT)) D+=car(GT);
                   10192:                        for(I=0;I<5;I++){
                   10193:                                S=-2*D^2;
                   10194:                                for(J=0;J<5;J++){
                   10195:                                        if(I==J) continue;
                   10196:                                        for(L=M[I][J];L!=[];L=cdr(L)) S+=car(L)^2;
                   10197:                                }
                   10198:                                M[I][I]=S;
1.27      takayama 10199:                                if(K==6){
                   10200:                                        for(S=[],J=4;J>=0;J--)
                   10201:                                                if(I!=J) S=cons(M[I][J],S);
                   10202:                                        R=chkspt(S|opt=2);
                   10203:                                        M[I][5]=((L=length(R))>1)?s2sp(R[L-2]|short=1):"";
                   10204:                                }
1.6       takayama 10205:                        }
                   10206:                        if(Dvi){
                   10207:                                S=[];
                   10208:                                for(I=4;I>=0;I--){
1.27      takayama 10209:                                        L=(K==6)?[M[I][5]]:[];
                   10210:                                        L=cons(M[I][I],L);
1.6       takayama 10211:                                        for(J=4;J>=0;J--){
                   10212:                                                if(I==J) L=cons("",L);
                   10213:                                                else L=cons(s2sp([M[I][J]]),L);
                   10214:                                        }
                   10215:                                        S=cons(L,S);
                   10216:                                }
1.27      takayama 10217:                                T=(K==6)?["reduction"]:[];
                   10218:                                S=cons(append([x0,x1,x2,x3,x4,"idx"],T),S);
                   10219:                                M=ltotex(S|opt="tab",hline=[0,1,z],
1.41      takayama 10220:                                        vline=(K==6)?[0,1,z-2,z-1,z]:[0,1,z-1,z],
1.26      takayama 10221:                                        left=["","$x_0$","$x_1$","$x_2$","$x_3$","$x_4$"]);
1.6       takayama 10222:                                if(Dvi>0) dviout(M|keep=Keep);
                   10223:                        }
                   10224:                        return M;
                   10225:                }
                   10226:                if(F=="swap"||F=="perm"){
                   10227:                        if(F=="perm") TR=P[1];
                   10228:                        else{
                   10229:                                TR=newvect(5,[0,1,2,3,4]);
                   10230:                                K=P[1][0];L=P[1][1];
                   10231:                                TR[K]=L;TR[L]=K;
                   10232:                                if(TR[4]!=4) G=mc2grs(G,"deg");
                   10233:                        }
                   10234:                        V=newvect(2);
                   10235:                        for(L=[],T=G;T!=[];T=cdr(T)){
                   10236:                                TP=car(T)[0];
                   10237:                                for(TQ=[],I=1;I>=0;I--){
                   10238:                                        V=[TR[TP[I][0]],TR[TP[I][1]]];
                   10239:                                        if(V[0]>V[1]) V=[V[1],V[0]];
                   10240:                                        TQ=cons(V,TQ);
                   10241:                                }
                   10242:                                if(TQ[0][0]<TQ[1][0]){
                   10243:                                        L=cons(cons(TQ,cdr(car(T))),L);
                   10244:                                        continue;
                   10245:                                }
                   10246:                                TQ=[[TQ[1],TQ[0]]];
                   10247:                                for(TP=cdr(car(T));TP!=[];TP=cdr(TP))
                   10248:                                        TQ=cons([car(TP)[0],car(TP)[2],car(TP)[1]],TQ);
                   10249:                                L=cons(reverse(TQ),L);
                   10250:                        }
                   10251:                        return mc2grs(L,"sort");
                   10252:                }
                   10253:                if(F=="homog"){
                   10254:                        V=mc2grs(G,"deg");
                   10255:                        return mc2grs(G,[[[2,3],-V]]);
                   10256:                }else if(F=="deg"){
                   10257:                        R=mc2grs(G,4);
                   10258:                        for(V=0;R!=[];R++){
                   10259:                                for(TR=cdr(R);TR!=[];TR=cdr(TR))
                   10260:                                        V+=car(TR)[0]*car(TR)[1];
                   10261:                        }
                   10262:                        return -V;
                   10263:                }
                   10264:        }
                   10265:        if(type(F)!=4) return 0;
                   10266:        if(type(P[0])!=4) P=[P];
                   10267:        for(;P!=[];P=cdr(P)){
                   10268:                if(type((S=P[0])[0])==4){ /* addition */
                   10269:                        T=P[0][0];
                   10270:                        if(T[0]>T[1]) T=[T[1],T[0]];
                   10271:                        T1=[T[0],4];T2=[T[1],4];
                   10272:                        for(L=[],PG=reverse(G);PG!=[];PG=cdr(PG)){
                   10273:                                R=car(PG);R0=R[0];F=0;K=P[0][1];
                   10274:                                if(R0[0]==T) F=1;
                   10275:                                else if(R0[1]==T) F=2;
                   10276:                                else if(getopt(unique)!=1){
                   10277:                                        K=-K;
                   10278:                                        if(R0[0]==T1||R0[0]==T2) F=1;
                   10279:                                        else if(R0[1]==T1||R0[1]==T2) F=2;
                   10280:                                }
                   10281:                                if(F==0) L=cons(R,L);
                   10282:                                else{
                   10283:                                        R1=anal2sp(cdr(R),(F==1)?["+",K,0]:["+",0,K]);
                   10284:                                        L=cons(cons(R0,R1),L);
                   10285:                                }
                   10286:                        }
                   10287:                        G=L;
                   10288:                }else if(type(S[0])<4){
                   10289:                         if(length(S)==1){       /* mc wrt0 4:cases */
                   10290:                                U=mc2grs(G,"deg");
                   10291:                                C=P[0][0];
                   10292:                                L=[];
                   10293:                        /* [[0,1],[2,3]] : [K=[0,k],J=[i,j]], S=[k,4] : 3 cases */
                   10294:                                for(K=1;K<4;K++){
                   10295:                                        J=lsort([1,2,3],[K],1);
                   10296:                                        K4=[K,4];K0=[0,K];
                   10297:                                        G0=mc2grs(G,["get0",[K0,J]]);
                   10298:                                        LT=anal2sp(G0,["+",C,0]);
                   10299:                                        G0=mc2grs(G,["get0",J]);
                   10300:                                        L0=anal2sp(G0,["put1",1,0]);
                   10301:                                        LT=anal2sp(LT,["add",L0]);
                   10302:                                        G0=mc2grs(G,["get0",K4]);
                   10303:                                        L0=anal2sp(G0,[["put1",1,0],["+",0,U]]);
                   10304:                                        LT=anal2sp(LT,["add",L0]);
                   10305:                                        G0=mc2grs(G,["get0",[[0,J[0]],K4]]);
                   10306:                                        L0=anal2sp(G0,[["get",1,0],["+",0,U]]);
                   10307:                                        LT=anal2sp(LT,["sub",L0]);
                   10308:                                        G0=mc2grs(G,["get0",[[0,J[1]],K4]]);
                   10309:                                        L0=anal2sp(G0,[["get",1,0],["+",0,U]]);
                   10310:                                        LT=anal2sp(LT,["sub",L0]);
                   10311:                                        G0=mc2grs(G,["get0",[K0,J]]);
                   10312:                                        L0=anal2sp(G0,[["get",1,0],["+",C,0]]);
                   10313:                                        LT=anal2sp(LT,["sub",L0]);
                   10314:                                        G0=mc2grs(G,["get0",[[0,4],J]]);
                   10315:                                        L0=anal2sp(G0,[["+",-C,0],["get",1,0]]);
                   10316:                                        LT=anal2sp(LT,[["sub",L0],0]);
                   10317:                                        L=cons(cons([K0,J],LT),L);
                   10318:                                }
                   10319:                        /* [[0,1],[2,4]] : [K,I]=[[0,k],[i,4]] S=[j,k] : 6 cases */
                   10320:                                for(K=1;K<4;K++){
                   10321:                                  for(I=1;I<4;I++){
                   10322:                                        if(I==K) continue;
                   10323:                                        for(J=1;J<4;J++) if(J!=I&&J!=K)  break;
                   10324:                                        I4=[I,4];S=(J<K)?[J,K]:[K,J];K0=[0,K];
                   10325:                                        G0=cdr(mc2grs(G,["get",[K0,I4]]));
                   10326:                                        LT=anal2sp(G0,["+",C,0]);
                   10327:                                        G0=cdr(mc2grs(G,["get",I4]));
                   10328:                                        L0=anal2sp(G0,["put1",1,0]);
                   10329:                                        LT=anal2sp(LT,["add",L0]);
                   10330:                                        G0=cdr(mc2grs(G,["get",S]));
                   10331:                                        L0=anal2sp(G0,[["put1",1,0],["+",0,-C-U]]);
                   10332:                                        LT=anal2sp(LT,["add",L0]);
                   10333:
                   10334:                                        G0=cdr(mc2grs(G,["get",[[0,I],S]]));
                   10335:                                        L0=anal2sp(G0,[["get",1,0],["+",0,-C-U]]);
                   10336:                                        LT=anal2sp(LT,["sub",L0]);
                   10337:                                        G0=cdr(mc2grs(G,["get",[[0,J],I4]]));
                   10338:                                        L0=anal2sp(G0,["get",1,0]);
                   10339:                                        LT=anal2sp(LT,["sub",L0]);
                   10340:                                        G0=cdr(mc2grs(G,["get",[K0,I4]]));
                   10341:                                        L0=anal2sp(G0,[["get",1,0],["+",C,0]]);
                   10342:                                        LT=anal2sp(LT,["sub",L0]);
                   10343:                                        G0=cdr(mc2grs(G,["get",[[0,4],S]]));
                   10344:                                        L0=anal2sp(G0,[["get",1,C],["+",-C,-C-U]]);
                   10345:                                        LT=anal2sp(LT,[["sub",L0],0]);
                   10346:                                        L=cons(cons([K0,I4],LT),L);
                   10347:                                  }
                   10348:                                }
                   10349:                        /* [[0,4],[2,3]] : [[0,4],J]=[[0,4],[i,j]] 3 cases */
                   10350:                                for(K=3;K>0;K--){
                   10351:                                        J=lsort([1,2,3],[K],1);
                   10352:                                        G0=mc2grs(G,["get0",[[0,4],J]]);
                   10353:                                        LT=anal2sp(G0,["+",-C,0]);
                   10354:                                        G0=mc2grs(G,["get0",J]);
                   10355:                                        L0=anal2sp(G0,["put1",1,-C]);
                   10356:                                        LT=anal2sp(LT,["add",L0]);
                   10357:                                        G0=mc2grs(G,["get0",[K,4]]);
                   10358:                                        L0=anal2sp(G0,[["put1",1,-C],["+",0,U]]);
                   10359:                                        LT=anal2sp(LT,["add",L0]);
                   10360:
                   10361:                                        G0=mc2grs(G,["get0",[[0,J[0]],[K,4]]]);
                   10362:                                        L0=anal2sp(G0,[["get",1,0],["+",-C,U]]);
                   10363:                                        LT=anal2sp(LT,["sub",L0]);
                   10364:                                        G0=mc2grs(G,["get0",[[0,J[1]],[K,4]]]);
                   10365:                                        L0=anal2sp(G0,[["get",1,0],["+",-C,U]]);
                   10366:                                        LT=anal2sp(LT,["sub",L0]);
                   10367:                                        G0=mc2grs(G,["get0",[[0,K],J]]);
                   10368:                                        L0=anal2sp(G0,[["get",1,0],["+",-C,0]]);
                   10369:                                        LT=anal2sp(LT,["sub",L0]);
                   10370:                                        G0=mc2grs(G,["get0",[[0,4],J]]);
                   10371:                                        L0=anal2sp(G0,[["get",1,C],["put",1,0]]);
                   10372:                                        LT=anal2sp(LT,[["sub",L0],0]);
                   10373:                                        L=cons(cons([[0,4],J],LT),L);
                   10374:                                }
                   10375:                        /* [[1,2],[3,4]] : [J,K]=[[i,j],[k,4]] 3 cases  */
                   10376:                                for(K=3;K>0;K--){
                   10377:                                        J=lsort([1,2,3],[K],1);
                   10378:                                        if(K>1)
                   10379:                                                LT=mc2grs(G,["get0",[J,[K,4]]]);
                   10380:                                        else{
                   10381:                                                LT=mc2grs(G,["get0",[[K,4],J]]);
                   10382:                                                LT=anal2sp(LT,"swap");
                   10383:                                        }
                   10384:                                        G0=mc2grs(G,["get0",J]);
                   10385:                                        L0=anal2sp(G0,[["put1"],["+",0,-C-U]]);
                   10386:                                        LT=anal2sp(LT,["add",L0]);
                   10387:                                        G0=mc2grs(G,["get0",[K,4]]);
                   10388:                                        L0=anal2sp(G0,[["put1"],["+",U,0]]);
                   10389:                                        LT=anal2sp(LT,["add",L0]);
                   10390:
                   10391:                                        G0=mc2grs(G,["get0",[[0,J[0]],[K,4]]]);
                   10392:                                        L0=anal2sp(G0,[["get1",1,0],["put1"],["+",U,0]]);
                   10393:                                        LT=anal2sp(LT,["sub",L0]);
                   10394:                                        G0=mc2grs(G,["get0",[[0,J[1]],[K,4]]]);
                   10395:                                        L0=anal2sp(G0,[["get1",1,0],["put1"],["+",U,0]]);
                   10396:                                        LT=anal2sp(LT,["sub",L0]);
                   10397:                                        G0=mc2grs(G,["get0",[[0,K],J]]);
                   10398:                                        L0=anal2sp(G0,[["get1",1,0],["put1"],["+",0,-C-U]]);
                   10399:                                        LT=anal2sp(LT,["sub",L0]);
                   10400:                                        G0=mc2grs(G,["get0",[[0,4],J]]);
                   10401:                                        L0=anal2sp(G0,[["get1",1,C],["put1"],["+",0,-C-U]]);
                   10402:                                        LT=anal2sp(LT,[["sub",L0],0]);
                   10403:                                        if(K==1){
                   10404:                                                LT=anal2sp(LT,"swap");
                   10405:                                                L=cons(cons([[K,4],J],LT),L);
                   10406:                                        }else L=cons(cons([J,[K,4]],LT),L);
                   10407:                                }
                   10408:                                G=L;
                   10409:                          }else if(length(S)==2){        /* general mc */
                   10410:                                if(S[1]!=0){
                   10411:                                        I=S[0];
                   10412:                                        if(I!=0) G=mc2grs(G,["swap",[0,I]]);
                   10413:                                        G=mc2grs(G,[S[1]]);
                   10414:                                        if(I!=0) G=mc2grs(G,["swap",[0,I]]);
                   10415:                                }
                   10416:                        }else if(length(S)==3||length(S)==4){   /* addition */
                   10417:                                for(I=1;I<4;I++,S=cdr(S))
                   10418:                                        if(S[0]) G=mc2grs(G,[[[0,I],S[0]]]);
                   10419:                                if(length(S)==1 && S[0])                        /* mc */
                   10420:                                        G=mc2grs(G,[S[0]]);
                   10421:                        }
                   10422:                }
                   10423:        }
                   10424:        return mc2grs(G,"sort");
                   10425: }
                   10426:
                   10427: def mcmgrs(G,P)
                   10428: {
                   10429:        if(type(G)<2){
                   10430:                if(G>1){
                   10431:                        N=G+2;G=[];
                   10432:                        for(I=1;I<=N;I++){
                   10433:                                for(J=1;J<N;J++){
                   10434:                                        if(I==J) continue;
                   10435:                                        for(K=J+1;K<=N;K++){
                   10436:                                                if(I==K) continue;
                   10437:                                                G=cons([[[0,I],[J,K]],[1,0,0]],G);
                   10438:                                        }
                   10439:                                }
                   10440:                        }
                   10441:                        for(I=1;I<=N;I++){
                   10442:                                for(J=1;J<I;J++) G=cons([[[0,I],[0,J,I]],[1,0,0]],G);
                   10443:                                for(J=I+1;J<=N;J++) G=cons([[[0,I],[0,I,J]],[1,0,0]],G);
                   10444:                        }
                   10445:                        return reverse(G);
                   10446:                }
                   10447:                return 0;
                   10448:        }
                   10449:        if(type(G)==7) G=os_md.s2sp(G);
                   10450:        if(type(G)!=4||type(G[0])!=4) return 0;
                   10451:        if(type(G[0][0])!=4){                   /* spectre type -> GRS */
                   10452:                G=s2sp(G|std=1);
                   10453:                L=length(G);
                   10454:                for(V=[],I=L-2;I>=0;I--) V=cons(makev([I+10]),V);
                   10455:                V=cons(makev([L+9]),V);
                   10456:                G=sp2grs(G,V,[1,length(G[0]),-1]|mat=1);
                   10457:                if(getopt(short)!=0){
                   10458:                        V=append(cdr(V),[V[0]]);
                   10459:                        G=shortv(G,V);
                   10460:                }
                   10461:                R=chkspt(G|mat=1);
                   10462:                if(R[2] != 2 || R[3] != 0 || !(R=getbygrs(G,1|mat=1))) return 0;
                   10463:                if(getopt(anal)==1) return R;   /* called by mcmgrs() */
                   10464:                if(!(G=mcmgrs(L-2,0))) return 0;
                   10465:                for(R=cdr(R);R!=[];R=cdr(R)){
                   10466:                        TR=car(R)[0];
                   10467:                        if(TR[0]) G=mcmgrs(G,[[TR[0]]]);
                   10468:                        G=mcmgrs(G,[cdr(TR)]);
                   10469:                }
                   10470:        }
                   10471:        L=length(G);
                   10472:        for(N=4;N<25;N++){
                   10473:                K=N^2*(N-1)/2;
                   10474:                if(K>L) return 0;
                   10475:                if(K==L) break;
                   10476:        }
                   10477:        if(type(P)<2) return G;
                   10478:        F=0;
                   10479:        if(type(P)==7||(type(P)==4&&type(P[0])<4)) P=[P];
                   10480:        if((Dvi=getopt(dviout))!=1&&Dvi!=2&&Dvi!=-1) Dvi=0;
                   10481:        Keep=(Dvi==2)?1:0;
                   10482:        if(type(P)==4 && type(F=car(P))==7){
                   10483:                if(F=="mult"){
1.24      takayama 10484:                        for(P=cdr(P);P!=[];P=cdr(P)) G=mc2grs(G,car(P)|option_list=getopt());
1.6       takayama 10485:                        return G;
                   10486:                }
                   10487:                if(F=="get"||F=="get0"){
                   10488:                        if(Dvi!=0) F="get";
                   10489:                        if(length(P)==2){
                   10490:                                if(type(P[1])==4){
                   10491:                                        if(type(P[1][1])==4){           /* [[,],[,]] */
                   10492:                                                for(PG=reverse(G);PG!=[];PG=cdr(PG)){
                   10493:                                                        TP=car(PG);
                   10494:                                                        if(TP[0]==P[1]) return (F=="get")?TP:cdr(TP);
                   10495:                                                }
                   10496:                                                return [];
                   10497:                                        }
                   10498:                                        if(P[1][0]==0){
                   10499:                                                if(length(P[1])==2){    /* [0,] */
                   10500:                                                        for(J=1;J<=N;J++) if(J!=P[1][1]) break;
                   10501:                                                        for(K=J+1;K<=N;K++) if(K!=P[1][1]) break;
                   10502:                                                        L=mcmgrs(G,["get0",[P[1],[J,K]]]);
                   10503:                                                        L=anal2sp(L,["get1",1]);
                   10504:                                                }else{                                  /* [0,*,*] */
                   10505:                                                        L=mcmgrs(G,["get0",[[P[1][0],P[1][1]],P[1]]]);
                   10506:                                                        L=anal2sp(L,["get1",2]);
                   10507:                                                }
                   10508:                                        }else{                                          /* [,] */
                   10509:                                                for(J=1;J<=N;J++) if(J!=P[1][0]&&J!=P[1][1]) break;
                   10510:                                                L=mcmgrs(G,["get0",[[0,J],P[1]]]);
                   10511:                                                L=anal2sp(L,["get1",2]);
                   10512:                                        }
                   10513:                                        L=anal2sp(L,0);
                   10514:                                        if(F=="get") L=cons(P[1],L);
                   10515:                                        return L;
                   10516:                                }else{  /* I */
                   10517:                                        for(L=[],I=P[1],J=0;J<=N;J++){
                   10518:                                                if(I==J) continue;
                   10519:                                                II=(I<J)?[I,J]:[J,I];
                   10520:                                                L=cons(mcmgrs(G,[F,II]),L);
                   10521:                                        }
                   10522:                                }
                   10523:                        }else{
                   10524:                                for(L=[],I=0;I<N;I++){
                   10525:                                        for(J=I+1;J<=N;J++) L=cons(mcmgrs(G,[F,[I,J]]),L);
                   10526:                                }
                   10527:                        }
                   10528:                        if(Dvi){
                   10529:                                for(R=S=[];L!=[];L=cdr(L)){
                   10530:                                        T=car(L);
                   10531:                                        R=cons(cdr(T),R);
                   10532:                                        if(S==[]) S="A_{"+rtostr(T[0][0])+rtostr(T[0][1])+"}\\\\\n";
                   10533:                                        else S="A_{"+rtostr(T[0][0])+rtostr(T[0][1])+"}&"+S;
                   10534:                                }
                   10535:                                L=ltotex(R|opt="GRS",pre=S);
                   10536:                                if(type(V=getopt(div))!=4) V=[];
                   10537:                                if(V==[]&&(K=length(R))>10)
                   10538:                                        for(I=9;I<K;I+=9) V=cons(I,V);
                   10539:                                V=reverse(V);
                   10540:                                if(V!=[]) L=divmattex(L,V);
                   10541:                                if(Dvi>0){
                   10542:                                        if(V!=[]) dviout(L|keep=Keep);
                   10543:                                        else dviout(L|eq=0,keep=Keep);
                   10544:                                }
                   10545:                        }else L=reverse(L);
                   10546:                        return L;
                   10547:                }
                   10548:                if(F=="show"){
                   10549:                        for(R=str_tb(0,0);G!=[];){
                   10550:                                L=car(G);
                   10551:                                I=L[0][0];J=L[0][1];
                   10552:                                str_tb("[A_{"+rtostr(I[0])+rtostr(I[1])+"}:A_{"+rtostr(J[0])+rtostr(J[1]),R);
                   10553:                                if(length(J)==3) str_tb(rtostr(J[2]),R);
                   10554:                                str_tb("}]&=\\left\\{",R);
                   10555:                                for(L=cdr(L);;){
                   10556:                                        S=car(L);
                   10557:                                        str_tb("["+my_tex_form(S[1])+":"+my_tex_form(S[2])+"]",R);
                   10558:                                        if(S[0]!=1) str_tb("_{"+rtostr(S[0])+"}",R);
                   10559:                                        if((L=cdr(L))==[]) break;
                   10560:                                        str_tb(",\\,",R);
                   10561:                                }
                   10562:                                str_tb("\\right\\}",R);
                   10563:                                if((G=cdr(G))==[]) break;
                   10564:                                str_tb(texcr(43),R);
                   10565:                        }
                   10566:                        R=texbegin("align*",str_tb(0,R));
                   10567:                        if(Dvi!=-1) dviout(R|keep=Keep);
                   10568:                        return R;
                   10569:                }
                   10570:                if(F=="show0"){
                   10571:                        for(C=N*(N-1)*(N-2)/2,S="",L=[];G!=[];G=cdr(G)){
                   10572:                                for(TL=[],TG=cdr(car(G));TG!=[];TG=cdr(TG)) TL=cons(car(TG)[0],TL);
                   10573:                                TL=msort(TL,[-1,0]);
                   10574:                                if(Dvi){
                   10575:                                        if(S!=""){
                   10576:                                                if(--C==0) S=S+";";
                   10577:                                                else S=S+",";
                   10578:                                        }
                   10579:                                        for(I=J=0,T=append(TL,[[0]]);T!=[];T=cdr(T)){
                   10580:                                                if(car(T)==I) J++;
                   10581:                                                else{
                   10582:                                                        if(I>0&&J>0){
                   10583:                                                                if(I>9) S=S+"("+rtostr(I)+")";
                   10584:                                                                else S=S+rtostr(I);
                   10585:                                                                if(J>1){
                   10586:                                                                        if(J>9) S=S+"^{"+rtostr(J)+"}";
                   10587:                                                                        else S=S+"^"+rtostr(J);
                   10588:                                                                }
                   10589:                                                        }
                   10590:                                                        I=car(T);J=1;
                   10591:                                                }
                   10592:                                        }
                   10593:                                }
                   10594:                                L=cons(TL,L);
                   10595:                        }
                   10596:                        if(Dvi){
1.43      takayama 10597:                                if(Dvi!=-1) dviout(S|eq=0,keep=Keep);
1.6       takayama 10598:                                return S;
                   10599:                        }
                   10600:                        return reverse(L);
                   10601:                }
                   10602:                if(F=="spct"){
                   10603:                        G=mcmgrs(G,"get");
                   10604:                        M=newmat(N+1,N+1);
                   10605:                        for(;G!=[];G=cdr(G)){
                   10606:                                GT=car(G);I=GT[0][0];J=GT[0][1];
                   10607:                                for(S=0,L=[],GT=cdr(GT);GT!=[];GT=cdr(GT)){
                   10608:                                        L=cons(car(GT)[0],L);
                   10609:                                }
                   10610:                                L=reverse(qsort(L));
                   10611:                                M[I][J]=M[J][I]=L;
                   10612:                        }
                   10613:                        for(D=0,GT=M[0][1];GT!=[];GT=cdr(GT)) D+=car(GT);
                   10614:                        for(I=0;I<=N;I++){
                   10615:                                S=-(N-2)*D^2;
                   10616:                                for(J=0;J<=N;J++){
                   10617:                                        if(I==J) continue;
                   10618:                                        for(L=M[I][J];L!=[];L=cdr(L)) S+=car(L)^2;
                   10619:                                }
                   10620:                                M[I][I]=S;
                   10621:                        }
                   10622:                        if(Dvi){
                   10623:                                S=[];
                   10624:                                for(LS=[],I=N;I>=0;I--){
                   10625:                                        L=[M[I][I]];
                   10626:                                        for(J=N;J>=0;J--){
                   10627:                                                if(I==J) L=cons("",L);
                   10628:                                                else L=cons(s2sp([M[I][J]]),L);
                   10629:                                        }
                   10630:                                        S=cons(L,S);
                   10631:                                        LS=cons("$x_"+rtostr(I)+"$",LS);
                   10632:                                }
                   10633:                                S=cons(append(LS,["idx"]),S);
                   10634:                                M=ltotex(S|opt="tab",hline=[0,1,z],vline=[0,1,z-1,z],left=cons("",LS));
                   10635:                                if(Dvi>0) dviout(M|keep=Keep);
                   10636:                        }
                   10637:                        return M;
                   10638:                }
                   10639:                if(F=="deg"){
                   10640:                        for(S=I=0;I<N-1;I++){
                   10641:                                for(J=I+1;J<N;J++){
                   10642:                                        L=mcmgrs(G,["get0",[I,J]]);
                   10643:                                        L=anal2sp(L,"val");
                   10644:                                        S+=L[1];
                   10645:                                }
                   10646:                        }
                   10647:                        return S/L[0];
                   10648:                }
                   10649:        }
                   10650:        L=[];
                   10651:        if(type(F)!=4) return 0;
                   10652:        if(type(P[0])!=4||length(P[0])==2) P=[P];
                   10653:        for(;P!=[];P=cdr(P)){
                   10654:                if(type(T=(S=car(P))[0])==4){ /* addition */
                   10655:                        if((K=P[0][1])!=0){
                   10656:                                if(T[0]>T[1]) T=[T[1],T[0]];
                   10657:                                T1=[T[0],N];T2=[T[1],N];
                   10658:                                T01=cons(0,T1);T02=cons(0,T2);
                   10659:                                for(PG=G;PG!=[];PG=cdr(PG)){
                   10660:                                        R=car(PG);R0=R[0];K1=K2=0;
                   10661:                                        TP=R0[0];
                   10662:                                        if(TP==T) K1=K;
                   10663:                                        else if(TP==T1||TP==T2) K1=-K;
                   10664:                                        if(length(TP=R0[1])==2){
                   10665:                                                if(TP==T) K2=K;
                   10666:                                                else if(TP==T1||TP==T2) K2=-K;
                   10667:                                        }else{
                   10668:                                                S=0;
                   10669:                                                if(findin(T[0],TP)>=0) S++;
                   10670:                                                if(findin(T[1],TP)>=0) S++;
                   10671:                                                if(S>0&&TP[2]==N) K2=-K;
                   10672:                                                else if(S==2) K2=K;
                   10673:                                        }
                   10674:                                        R1=anal2sp(cdr(R),["+",K1,K2]);
                   10675:                                        L=cons(cons(R0,R1),L);
                   10676:                                }
                   10677:                                G=reverse(L);
                   10678:                        }
                   10679:                }else if(length(S)==1){         /* middle convolution */
                   10680:                        C=S[0];L=[];
                   10681:                        for(I=1;I<=N;I++){
                   10682:                                for(J=1;J<=N;J++){
                   10683:                                        if(I==J) continue;
                   10684:                                        for(K=J+1;K<=N;K++){    /* [[0,I],[J,K]] */
                   10685:                                                if(I==K)continue;
                   10686:                                                T=[[0,I],JK=[J,K]];
                   10687:                                                if(I==N){
                   10688:                                                        LT=mcmgrs(G,["get0",T]);
                   10689:                                                        G0=mcmgrs(G,["get0",JK]);
                   10690:                                                        L0=anal2sp(G0,[["put1",1,0],["mult",N-3]]);
                   10691:                                                        G0=mcmgrs(G,["get0",[0,J,K]]);
                   10692:                                                        LT=anal2sp(LT,["add",L0]);
                   10693:                                                        L0=anal2sp(G0,["put1",1,0]);
                   10694:                                                        LT=anal2sp(LT,["add",L0]);
                   10695:                                                        for(V=1;V<=N;V++){
                   10696:                                                                if(V==I){
                   10697:                                                                        G0=mcmgrs(G,["get0",T]);
                   10698:                                                                        L0=anal2sp(G0,["get",1,C]);
                   10699:                                                                }else if(V==J||V==K){
                   10700:                                                                        G0=mcmgrs(G,["get0",[[0,V],[0,J,K]]]);
                   10701:                                                                        L0=anal2sp(G0,["get",1,0]);
                   10702:                                                                }else{
                   10703:                                                                        G0=mcmgrs(G,["get0",[[0,V],JK]]);
                   10704:                                                                        L0=anal2sp(G0,["get",1,0]);
                   10705:                                                                }
                   10706:                                                                LT=anal2sp(LT,["sub",L0]);
                   10707:                                                        }
                   10708:                                                        LT=anal2sp(LT,["+",-C,0]);
                   10709:                                                }else if(K==N){
                   10710:                                                        LT=mcmgrs(G,["get0",T]);
                   10711:                                                        LT=anal2sp(LT,["+",C,0]);
                   10712:                                                        G0=mcmgrs(G,["get0",JK]);
                   10713:                                                        L0=anal2sp(G0,[["put1",1,0],["mult",N-3]]);
                   10714:                                                        LT=anal2sp(LT,["add",L0]);
                   10715:                                                        G0=mcmgrs(G,["get0",[0,J,K]]);
                   10716:                                                        L0=anal2sp(G0,[["put1",1,0],["+",0,-C]]);
                   10717:                                                        LT=anal2sp(LT,["add",L0]);
                   10718:                                                        for(V=1;V<=N;V++){
                   10719:                                                                if(V==I){
                   10720:                                                                        G0=mcmgrs(G,["get0",T]);
                   10721:                                                                        L0=anal2sp(G0,[["get",1,0],["+",C,0]]);
                   10722:                                                                }else if(V==J){
                   10723:                                                                        G0=mcmgrs(G,["get0",[[0,V],[0,J,K]]]);
                   10724:                                                                        L0=anal2sp(G0,[["get",1,0],["+",0,-C]]);
                   10725:                                                                }else if(V==N){
                   10726:                                                                        G0=mcmgrs(G,["get0",[[0,V],[0,J,K]]]);
                   10727:                                                                        L0=anal2sp(G0,[["get",1,C],["+",-C,-C]]);
                   10728:                                                                }else{
                   10729:                                                                        G0=mcmgrs(G,["get0",[[0,V],JK]]);
                   10730:                                                                        L0=anal2sp(G0,["get",1,0]);
                   10731:                                                                }
                   10732:                                                                LT=anal2sp(LT,["sub",L0]);
                   10733:                                                        }
                   10734:                                                }else{
                   10735:                                                        G0=mcmgrs(G,["get0",T]);
                   10736:                                                        LT=anal2sp(G0,["+",C,0]);
                   10737:                                                        G0=mcmgrs(G,["get0",JK]);
                   10738:                                                        L0=anal2sp(G0,[["put1",1,0],["mult",N-3]]);
                   10739:                                                        LT=anal2sp(LT,["add",L0]);
                   10740:                                                        G0=mcmgrs(G,["get0",[0,J,K]]);
                   10741:                                                        L0=anal2sp(G0,["put1",1,0]);
                   10742:                                                        LT=anal2sp(LT,["add",L0]);
                   10743:                                                        for(V=1;V<=N;V++){
                   10744:                                                                if(V==I){
                   10745:                                                                        G0=mcmgrs(G,["get0",T]);
                   10746:                                                                        L0=anal2sp(G0,[["get",1,0],["+",C,0]]);
                   10747:                                                                }else if(V==J||V==K){
                   10748:                                                                        G0=mcmgrs(G,["get0",[[0,V],[0,J,K]]]);
                   10749:                                                                        L0=anal2sp(G0,["get",1,0]);
                   10750:                                                                }else if(V==N){
                   10751:                                                                        G0=mcmgrs(G,["get0",[[0,V],JK]]);
                   10752:                                                                        L0=anal2sp(G0,[["get",1,C],["+",-C,0]]);
                   10753:                                                                }else{
                   10754:                                                                        G0=mcmgrs(G,["get0",[[0,V],JK]]);
                   10755:                                                                        L0=anal2sp(G0,["get",1,0]);
                   10756:                                                                }
                   10757:                                                                LT=anal2sp(LT,["sub",L0]);
                   10758:                                                        }
                   10759:                                                }
                   10760:                                                LT=anal2sp(LT,0);
                   10761:                                                L=cons(cons(T,LT),L);
                   10762:                                        }
                   10763:                                        T=[[0,I],(I<J)?[0,I,J]:[0,J,I]]; /* [0,I], [0,I,J] */
                   10764:                                        JK=(I<J)?[I,J]:[J,I];
                   10765:                                        if(I==N){
                   10766:                                                G0=mcmgrs(G,["get0",T]);
                   10767:                                                LT=anal2sp(G0,["+",-C,0]);
                   10768:                                                G0=mcmgrs(G,["get0",JK]);
                   10769:                                                L0=anal2sp(G0,[["put1",1,-C],["mult",N-3]]);
                   10770:                                                LT=anal2sp(LT,["add",L0]);
                   10771:                                                G0=mcmgrs(G,["get0",T[1]]);
                   10772:                                                L0=anal2sp(G0,["put1",1,-C]);
                   10773:                                                LT=anal2sp(LT,["add",L0]);
                   10774:                                                for(V=1;V<=N;V++){
                   10775:                                                        if(V==J){
                   10776:                                                                G0=mcmgrs(G,["get0",T]);
                   10777:                                                                L0=anal2sp(G0,[["get",1,0],["+",-C,0]]);
                   10778:                                                        }else if(V==N){
                   10779:                                                                G0=mcmgrs(G,["get0",[[0,V],T[1]]]);
                   10780:                                                                L0=anal2sp(G0,[["get",1,C],["+",-C,0]]);
                   10781:                                                        }else{
                   10782:                                                                G0=mcmgrs(G,["get0",[[0,V],JK]]);
                   10783:                                                                L0=anal2sp(G0,[["get",1,0],["+",-C,0]]);
                   10784:                                                        }
                   10785:                                                        LT=anal2sp(LT,["sub",L0]);
                   10786:                                                }
                   10787:                                                LT=anal2sp(LT,["+",0,C]);
                   10788:                                        }else if(J==N){
                   10789:                                                G0=mcmgrs(G,["get0",T]);
                   10790:                                                LT=anal2sp(G0,["+",C,0]);
                   10791:                                                G0=mcmgrs(G,["get0",T[0]]);
                   10792:                                                L0=anal2sp(G0,[["put1",1,0],["mult",N-3]]);
                   10793:                                                LT=anal2sp(LT,["add",L0]);
                   10794:                                                G0=mcmgrs(G,["get0",T[1]]);
                   10795:                                                L0=anal2sp(G0,["put1",1,0]);
                   10796:                                                LT=anal2sp(LT,["add",L0]);
                   10797:                                                for(V=1;V<=N;V++){
                   10798:                                                        if(V==I){
                   10799:                                                                G0=mcmgrs(G,["get0",T]);
                   10800:                                                                L0=anal2sp(G0,[["get",1,0],["+",C,0]]);
                   10801:                                                        }else if(V==N){
                   10802:                                                                G0=mcmgrs(G,["get0",[[0,V],T[1]]]);
                   10803:                                                                L0=anal2sp(G0,[["get",1,C],["+",-C,0]]);
                   10804:                                                        }else{
                   10805:                                                                G0=mcmgrs(G,["get0",[[0,V],JK]]);
                   10806:                                                                L0=anal2sp(G0,["get",1,0]);
                   10807:                                                        }
                   10808:                                                        LT=anal2sp(LT,["sub",L0]);
                   10809:                                                }
                   10810:                                                LT=anal2sp(LT,["+",0,-C]);
                   10811:                                        }else{
                   10812:                                                G0=mcmgrs(G,["get0",T]);
                   10813:                                                LT=anal2sp(G0,["+",C,C]);
                   10814:                                                G0=mcmgrs(G,["get0",JK]);
                   10815:                                                L0=anal2sp(G0,[["put1",1,0],["mult",N-3]]);
                   10816:                                                LT=anal2sp(LT,["add",L0]);
                   10817:                                                G0=mcmgrs(G,["get0",T[1]]);
                   10818:                                                L0=anal2sp(G0,[["put1",1,0],["+",0,C]]);
                   10819:                                                LT=anal2sp(LT,["add",L0]);
                   10820:                                                for(V=1;V<=N;V++){
                   10821:                                                        if(V==I){
                   10822:                                                                G0=mcmgrs(G,["get0",T]);
                   10823:                                                                L0=anal2sp(G0,[["get",1,0],["+",C,C]]);
                   10824:                                                        }else if(V==J){
                   10825:                                                                G0=mcmgrs(G,["get0",[[0,V],T[1]]]);
                   10826:                                                                L0=anal2sp(G0,[["get",1,0],["+",0,C]]);
                   10827:                                                        }else if(V==N){
                   10828:                                                                G0=mcmgrs(G,["get0",[[0,V],JK]]);                                                                                                                                       L0=anal2sp(G0,[["get",1,C],["+",-C,0]]);
                   10829:                                                        }else{
                   10830:                                                                G0=mcmgrs(G,["get0",[[0,V],JK]]);
                   10831:                                                                L0=anal2sp(G0,["get",1,0]);
                   10832:                                                        }
                   10833:                                                        LT=anal2sp(LT,["sub",L0]);
                   10834:                                                }
                   10835:                                        }
                   10836:                                        LT=anal2sp(LT,0);
                   10837:                                        L=cons(cons(T,LT),L);
                   10838:                                }
                   10839:                        }
                   10840:                        for(G0=G=[];L!=[];L=cdr(L)){
                   10841:                                if(length(car(L)[0][1])==2) G0=cons(car(L),G0);
                   10842:                                else G=cons(car(L),G);
                   10843:                        }
                   10844:                        G=append(G0,G);
                   10845:                }else{
                   10846:                        if(length(S)==N-1||length(S)==N){               /* [a_1,...,a_{N-1},c] */
                   10847:                                for(I=1;I<N;S=cdr(S),I++) G=mcmgrs(G,[[0,I],car(S)]);
                   10848:                                if(length(S)==1) G=mcmgrs(G,[S[0]]);
                   10849:                        }else return 0;
                   10850:                }
                   10851:        }
                   10852:        return G;
                   10853: }
                   10854:
                   10855:
                   10856: def delopt(L,S)
                   10857: {
1.70      takayama 10858:        if((Inv=getopt(inv))!=1&&Inv!=2) Inv=0;
                   10859:        if(Inv&&type(S)==4&&type(car(S))==4){
                   10860:                for(R=[];L!=[];L=cdr(L)){
                   10861:                        L0=car(L)[0];
                   10862:                        for(F=0,TS=[];S!=[];S=cdr(S)){
                   10863:                                if(!F&&L0==car(S)[0]){
                   10864:                                        R=cons(car(S),R);
                   10865:                                        F++;
                   10866:                                        continue;
                   10867:                                }
                   10868:                                TS=cons(car(S),TS);
                   10869:                        }
                   10870:                        if(!F) R=cons(car(L),R);
                   10871:                        S=reverse(TS);
                   10872:                }
                   10873:                R=reverse(R);
                   10874:                return Inv==1?append(S,R):append(R,S);
                   10875:        }
1.6       takayama 10876:        for(R=[];L!=[];L=cdr(L)){
                   10877:                if(type(car(L))!=4) F=0;
                   10878:                else if(type(S)==4) F=(findin(car(L)[0],S)<0)?0:1;
                   10879:                else F=(car(L)[0]==S)?1:0;
                   10880:                if(F==Inv) R=cons(car(L),R);
                   10881:        }
                   10882:        return reverse(R);
                   10883: }
                   10884:
                   10885: def str_char(S,N,L)
                   10886: {
                   10887:        if(type(S)==7){
                   10888:                if(type(L)==1) L=asciitostr([L]);
                   10889:                return str_chr(S,N,L);
                   10890:        }
                   10891:        if(type(L)==7)  L=strtoascii(L)[0];
                   10892:        if(type(S)==4){
                   10893:                M=N;
                   10894:                while(M-->0) S=cdr(S);
                   10895:                M=findin(L,S);
                   10896:                return (M>=0)?findin(L,S)+N:-1;
                   10897:        }else if(type(S)==5){
                   10898:                K=length(S);
                   10899:                for(I=N;I<K;I++)
                   10900:                        if(S[I]==L) return I;
                   10901:        }
                   10902:        return -1;
                   10903: }
                   10904:
                   10905: def str_pair(S,N,I,J)
                   10906: {
                   10907:        if(type(I)==7)  I=(II=strtoascii(I))[0];
                   10908:        if(type(J)==7)  J=(JJ=strtoascii(J))[0];
                   10909:        if(type(S)==7)  S=strtoascii(S);
                   10910:        if(getopt(inv)==1){
                   10911:                if(II!=0){
                   10912:                        I=asciitostr(reverse(II));
                   10913:                        IL=length(II);
                   10914:                }else IL=1;
                   10915:                if(JJ!=0) J=asciitostr(reverse(JJ));
                   10916:                R=str_pair(reverse(S),length(S)-N-1,J,I);
                   10917:                if(R>=0) R=length(S)-IL-R;
                   10918:                return R;
                   10919:        }
                   10920:        if((SJIS=getopt(sjis))!=1) SJIS=0;
                   10921:        if((II!=0&&length(II)>1)||(JJ!=0&&length(JJ)>1)){
                   10922:                for(;;){
                   10923:                        MJ=str_str(S,N|top=JJ,sjis=SJIS);
                   10924:                        if(MJ>=0){
                   10925:                                MI=str_str(S,II|top=N,sjis=SJIS);
                   10926:                                if(MI<0 || MI>MJ){
                   10927:                                        if(C==0) return MJ;
                   10928:                                        C--; N=MJ+length(II);
                   10929:                                }else if(MI>=0){
                   10930:                                        C++; N=MI+length(JJ);
                   10931:                                }
                   10932:                        }
                   10933:                        return -1;
                   10934:                }
                   10935:        }
                   10936:        if(type(S)==4){
                   10937:                M=N;
                   10938:                while(M-->0) S=cdr(S);
                   10939:                while(S!=[]){
                   10940:                        if(car(S)==I) C++;
                   10941:                        else if(car(S)==J){
                   10942:                                if(C==0) return N;
                   10943:                                C--;
                   10944:                        }
                   10945:                        S=cdr(S);N++;
                   10946:                }
                   10947:        }else if(type(S)==5){
                   10948:                K=length(S);
                   10949:                for(T=N;T<K && C>=0;T++){
                   10950:                        if(S[T]==I) C++;
                   10951:                        else if(S[T]==J){
                   10952:                                if(C==0) return T;
                   10953:                                C--;
                   10954:                        }
                   10955:                }
                   10956:        }
                   10957:        return -1;
                   10958: }
                   10959:
                   10960:
                   10961: def str_cut(S,I,J)
                   10962: {
                   10963:        if(type(S)==7) return sub_str(S,I,J);
                   10964:        if((JJ=length(S))<=J) J=JJ-1;
                   10965:        if(type(S)==5){
                   10966:                for(L=[],K=J; K>=I; K--)        L=cons(S[K],L);
                   10967:        }else if(type(S)==4){
                   10968:                J-=I;
                   10969:                while(I-->0) S=cdr(S);
                   10970:                for(L=[];J-->=0;S=cdr(S)) L=cons(car(S),L);
                   10971:                L=reverse(L);
                   10972:        }
                   10973:        return asciitostr(L);
                   10974: }
                   10975:
                   10976: def str_str(S,T)
                   10977: {
                   10978:        if(S==0) return -1;
                   10979:        if(type(S) == 7)
                   10980:                S = strtoascii(S);
                   10981:        if(type(J=getopt(top))!=1 || J<0) J=0;
                   10982:        LS=length(S);
                   10983:        if(LS-J<1)      return -1;
                   10984:        if(type(S)==4){
                   10985:                LS-=(J0=J);
                   10986:                for( ; J>0 && S!=[]; S=cdr(S),J--);
                   10987:        }
                   10988:        if(type(JJ=getopt(end))!=1 && JJ!=0) JJ=LS;
                   10989:        else JJ-=J0;
                   10990:        if((SJIS=getopt(sjis))!=1) SJIS=0;
                   10991:        if(JJ-J<0) return -1;
                   10992:        /* search from J-th to JJ-th */
                   10993:        if(type(T)==1)  T=[T];
                   10994:        else if(type(T)==7)     T = strtoascii(T);
                   10995:        else if(type(T)==4 && type(T[0])>3){
                   10996:                for(K=(KF=-1)-J0; T!=[]; F++,T=cdr(T)){
                   10997:                        JK=str_str(S,car(T)|top=J,end=JJ,sjis=SJIS);
                   10998:                        if(JK>=0){
                   10999:                                JJ=(K=JK)-1; KF=F;
                   11000:                                if(J>JJ) break;
                   11001:                        }
                   11002:                }
                   11003:                return [KF,J0+K];
                   11004:        }
                   11005:        if(type(T)==4)  T=ltov(T);
                   11006:        LT = length(T);
                   11007:        if(LT>0){
                   11008:                LE = LS-LT;
                   11009:                LP = T[0];
                   11010:                if(JJ==0 ||(type(JJ)==1 && JJ<LE)) LE=JJ;
                   11011:                if(type(S)==5){
                   11012:                        for(; J <= LE; J++){
                   11013:                                if(S[J] != LP){
                   11014:                                        if(SJIS && (V=S[J])>128){
                   11015:                                                if(V<160 || (V>223 && V<240)) J++;
                   11016:                                        }
                   11017:                                        continue;
                   11018:                                }
                   11019:                                for(I = 1; I < LT && S[I+J] == T[I]; I++);
                   11020:                                if(I >= LT)  return J;
                   11021:                        }
                   11022:                }else if(type(S)==4){
                   11023:                        for(; J<=LE; S=cdr(S),J++){
                   11024:                                if(car(S) != LP){
1.56      takayama 11025:                                        if(SJIS && (V=car(S))>128){
                   11026:                                                if((V<160 || (V>223 && V<240))&&S!=[]) {
                   11027:                                                        J++;S=cdr(S);
                   11028:                                                }
1.6       takayama 11029:                                        }
                   11030:                                        continue;
                   11031:                                }
                   11032:                                for(ST=cdr(S), I = 1; I < LT && car(ST) == T[I]; I++, ST=cdr(ST));
                   11033:                                if(I >= LT) return J0+J;
                   11034:                        }
                   11035:                }
                   11036:        }
                   11037:        return -1;
                   11038: }
                   11039:
                   11040: def str_times(S,N)
                   11041: {
                   11042:        if(!isint(N))   return "";
                   11043:        if(type(S)==7){
                   11044:                for(Tb=str_tb(0,0);N-->0;)
                   11045:                        str_tb(S,Tb);
                   11046:                return str_tb(0,Tb);
                   11047:        }
                   11048:        if(type(S)==4){
                   11049:                for(LT=[],I=0;I<N;I++){
                   11050:                        if(type(car(S))==7){
                   11051:                                LT=cons(car(S),LT);
                   11052:                                S=cdr(S);
                   11053:                                if(S==[]) S=[[""]];
                   11054:                        }else if(type(car(S))==4){
                   11055:                                ST=car(S);
                   11056:                                for(J=0;I<N;I++){
                   11057:                                        if(J==length(ST)) J=0;
                   11058:                                        LT=cons(ST[J++],LT);
                   11059:                                }
                   11060:                        }
                   11061:                }
                   11062:                return reverse(LT);
                   11063:        }
                   11064:        return S;
                   11065: }
                   11066:
                   11067: def ssubgrs(M,L)
                   11068: {
                   11069:        if(type(L)==7) L=s2sp(L);
                   11070:        for(S=0, L=L, M=M; L!=[]; L=cdr(L), M=cdr(M)){
                   11071:                 for(LT=car(L), MT=car(M); LT!=[]; LT=cdr(LT), MT=cdr(MT)){
                   11072:                         S += car(LT)*car(MT)[1];
                   11073:                 }
                   11074:        }
                   11075:        return S;
                   11076: }
                   11077:
                   11078: def s2os(S)
                   11079: {
                   11080:        return str_subst(S,[["\\","\\\\"],["\"","\\\""]],0);
                   11081: }
                   11082:
                   11083: def l2os(S)
                   11084: {
                   11085:        if(type(S)==6)
                   11086:                S=m2ll(S);
                   11087:        else if(type(S)==5)
                   11088:                S=vtol(S);
                   11089:        else if(type(S)==7) return "\""+s2os(S)+"\"";
                   11090:        else if(type(S)<4) return rtostr(S);
                   11091:        if(type(S)==4){
                   11092:                for(F=0,Tb=str_tb("[",0);S!=[];S=cdr(S)){
                   11093:                        if(F++) str_tb(", ",Tb);
                   11094:                        str_tb(l2os(car(S)),Tb);
                   11095:                }
                   11096:                str_tb("]",Tb);
                   11097:                return str_tb(0,Tb);
                   11098:        }
                   11099:        return 0;
                   11100: }
                   11101:
                   11102: def r2os(S)
                   11103: {
                   11104:        if(type(S)==6){
                   11105:                for(T="",S=m2ll(S);S!=[];S=cdr(S)){
                   11106:                        if(T!="") T=T+","+r2os(car(S));
                   11107:                        else T=r2os(car(S));
                   11108:                }
                   11109:                return "mat("+T+")\n";
                   11110:        }else if(type(S)==5){
                   11111:                for(T="",S=v2l(S);S!=[];S=cdr(S)){
                   11112:                        if(T!="") T=T+","+r2os(car(S));
                   11113:                        else T=r2os(car(S));
                   11114:                }
                   11115:                return "vect("+T+")\n";
                   11116:        }else if(type(S)<4) return rtostr(S);
                   11117:        else if(type(S)==4){
                   11118:                for(T="";S!=[];S=cdr(S)){
                   11119:                        if(T!="") T=T+","+r2os(car(S));
                   11120:                        else T=r2os(car(S));
                   11121:                }
                   11122:                return "["+T+"]";
                   11123:        }else if(type(S)==7) return "\""+s2os(S)+"\"";
                   11124:        return "";
                   11125: }
                   11126:
                   11127: def s2euc(S)
                   11128: {
                   11129:        for(R=[],CR=0,L=strtoascii(S);L!=[];L=cdr(L)){
                   11130:                if((C=car(L)) == 0x1b && length(L)>1) {
                   11131:                        if((C=car(L=cdr(L)))==0x24 && length(L)>1){     /* $ */
                   11132:                                if((C = car(L=cdr(L))) == 0x40 || C == 0x42) {  /* @, B */
                   11133:                                        Mode = 1;
                   11134:                                } else return 0;
                   11135:                        }else if(C == 0x28 && length(L)>1) {    /* ( */
                   11136:                                if((C = car(L=cdr(L)))== 0x42 || C == 0x4a) {  /* B, J */
                   11137:                                        Mode = 0;
                   11138:                                }else if(C == 0x49) {   /* I */
                   11139:                                        Mode = 2;
                   11140:                                }else{
                   11141:                                        R=cons(0x1b,R);R=cons(0x28,R);R=cons(C,R);
                   11142:                                }
                   11143:                        }else if (C == 0x26 && length(L)>1 && car(cdr(L))==0x1b) { /* & ESC */
                   11144:                                L=cdr(L);
                   11145:                        }else{
                   11146:                                R=cons(0x1b,R);R=cons(C,R);
                   11147:                        }
                   11148:                }else if(C == 0x0e) {
                   11149:                        Mode = 2;
                   11150:         }else if(C == 0x0f) {
                   11151:             Mode = 0;
                   11152:                }else if(Mode == 1 && C>0x20 && C<0x7f && length(L)>1) {        /* JIS KANJI */
                   11153:                        D=car(L=cdr(L));
                   11154:                        if(D>0x20 && D<0x7f) {
                   11155:                                R=cons(ior(C,0x80),R);R=cons(ior(D,0x80),R);
                   11156:                        } else return 0;
                   11157:                }else if(Mode == 2 && C > 0x1f && C < 0x60) {                   /* JIS KANA */
                   11158:                        R=cons(0x8e,R);  R=cons(ior(C,0x80),R);
                   11159:                }else if(((C>0x80 && C<0xa0) || (C>0xdf && C<0xf0)) && length(L)>1) {   /* ShiftJIS */
                   11160:                        D=car(L=cdr(L));
                   11161:                        if(D>0x3f && D<0xfd && D!=0x7f) {
                   11162:                                T=sjis2jis([C,D]);
                   11163:                                R=cons(ior(T[0],0x80),R); R=cons(ior(T[1],0x80),R);
                   11164:                        }else return 0;
                   11165:                }else if(C>0x9f && C<0xe0) {            /* HanKana */
                   11166:                        R=cons(0x8e,R);  R=cons(C,R);
                   11167:                }else if(C == 0x0a){
                   11168:                        CR++;
                   11169:                }else if(C == 0x0d){
                   11170:                        R=cons(0x0d,R);
                   11171:                        CR=0;
                   11172:                }else{
                   11173:                        while(CR-->0) R=cons(0x0d,R);
                   11174:                        R=cons(C,R);
                   11175:                }
                   11176:        }
                   11177:        while(CR-->0) R=cons(0x0d,R);
                   11178:        return asciitostr(reverse(R));
                   11179: }
                   11180:
                   11181: def s2sjis(S)
                   11182: {
                   11183:        for(R=[],CR=0,L=strtoascii(S);L!=[];L=cdr(L)){
                   11184:                if((C=car(L)) == 0x1b && length(L)>1) {
                   11185:                        if((C=car(L=cdr(L)))==0x24 && length(L)>1){     /* $ */
                   11186:                                if((C = car(L=cdr(L))) == 0x40 || C == 0x42) {  /* @, B */
                   11187:                                        Mode = 1;
                   11188:                                } else return 0;
                   11189:                        }else if(C == 0x28 && length(L)>1) {    /* ( */
                   11190:                                if((C = car(L=cdr(L)))== 0x42 || C == 0x4a) {  /* B, J */
                   11191:                                        Mode = 0;
                   11192:                                }else if(C == 0x49) {   /* I */
                   11193:                                        Mode = 2;
                   11194:                                }else{
                   11195:                                        R=cons(0x1b,R);R=cons(0x28,R);R=cons(C,R);
                   11196:                                }
                   11197:                        }else if (C == 0x26 && length(L)>1 && car(cdr(L))==0x1b) { /* & ESC */
                   11198:                                L=cdr(L);
                   11199:                        }else{
                   11200:                                R=cons(0x1b,R);R=cons(C,R);
                   11201:                        }
                   11202:                }else if(C == 0x0e) {
                   11203:                        Mode = 2;
                   11204:         }else if(C == 0x0f) {
                   11205:             Mode = 0;
                   11206:                }else if(Mode == 1 && C>0x20 && C<0x7f && length(L)>1) {        /* JIS KANJI */
                   11207:                        D=car(L=cdr(L));
                   11208:                        if(D>0x20 && D<0x7f) {
                   11209:                                T=jis2sjis([C,D]);
                   11210:                                R=cons(T[0],R);R=cons(T[1],R);
                   11211:                        } else return 0;
                   11212:                }else if(Mode == 2 && C > 0x1f && C < 0x60) {                   /* JIS KANA */
                   11213:                        R=cons(ior(C,0x80),R);
                   11214:                }else if(C>0xa0 && C<0xff && length(L)>1) {                             /* EUC */
                   11215:                        D=car(L=cdr(L));
                   11216:                        if(D>0xa0 && D<0xff) {
                   11217:                                T=jis2sjis([iand(C,0x7f),iand(D,0x7f)]);
                   11218:                                R=cons(T[0],R);R=cons(T[1],R);
                   11219:                        }else return 0;
                   11220:                }else if(C == 0x0a){
                   11221:                        CR++;
                   11222:                }else if(C == 0x0d){
                   11223:                        R=cons(0x0a,R);R=cons(0x0d,R);
                   11224:                        CR=0;
                   11225:                }else{
                   11226:                        while(CR-->0){
                   11227:                                R=cons(0x0a,R);R=cons(0x0d,R);
                   11228:                        }
                   11229:                        R=cons(C,R);
                   11230:                }
                   11231:        }
                   11232:        while(CR-->0){
                   11233:                R=cons(0x0a,R);R=cons(0x0d,R);
                   11234:        }
                   11235:        return asciitostr(reverse(R));
                   11236: }
                   11237:
                   11238: def r2ma(S)
                   11239: {
                   11240:        return evalma(S|inv=1);
                   11241: }
                   11242:
                   11243: def evalma(S)
                   11244: {
                   11245:        L0=["\n","\d","{","}","[","]","Log","Exp","Sinh","Cosh","Tanh","Sin","Cos","Tan",
                   11246:                "ArcSin","ArcCos","ArcTan"];
                   11247:        L1=["",  ""  ,"[","]","(",")","log","exp","sinh","cosh","tanh","sin","cos","tan",
                   11248:                "asin",  "acos", "atan"];
                   11249:        if(getopt(inv)==1){
                   11250:                if(type(S)==6) S=m2ll(S);
                   11251:                else if(type(S)==5) S=vtol(S);
                   11252:                if(type(S)==4){
                   11253:                        for(L=[];S!=[];S=cdr(S)){
                   11254:                                if(type(car(S))==6) L=cons(m2ll(car(S)),L);
                   11255:                                else if(type(car(S))==5) L=cons(vtol(car(S)),L);
                   11256:                                else L=cons(car(S),L);
                   11257:                        }
                   11258:                        S=reverse(L);
                   11259:                }else return 0;
                   11260:                return str_subst(rtostr(S),cdr(cdr(L1)),cdr(cdr(L0)));
                   11261:        }
                   11262:        if(S==0){
                   11263:                print("Mathematica text (terminated by ;) ?");
                   11264:                purge_stdin();
                   11265:                Tb=str_tb(0,0);
                   11266:                for(;;){
                   11267:                        S=get_line();
                   11268:                        str_tb(S,Tb);
                   11269:                        if(str_char(S,0,";")>=0) break;
                   11270:                }
                   11271:                S=str_tb(0,Tb);
                   11272:        }
                   11273: /*
                   11274:        while((P=str_chr(S,0,";"))>=0){
                   11275:                V0=evalma(str_cut(S,0,P+1));
                   11276:                S=str_cut(S,P+1,length(S));
                   11277:        }
                   11278:        if((P=str_char(S,0,"="))>=0){
                   11279:                X=strtoascii(str_cut(S,0,P));
                   11280:                L=length(X);
                   11281:                for(P0=P1=-1,I=0;I<L;I++){
                   11282:                        if(L(I)<=32) continue;
                   11283:                        if(isalphanum(L[I])){
                   11284:                                if(P0<0){
                   11285:                                        if(isnum(L[I])) break;
                   11286:                                        P0=I;
                   11287:                                }
                   11288:                                else if(P1!=I+1) break;
                   11289:                                P1=I;
                   11290:                        }
                   11291:                }
                   11292:                if(I==L && P0>=0){
                   11293:                        for(I==P0;I-->0;) X=cdr(X);
                   11294:                        if((X0=car(X))>96) X0-=32;
                   11295:                        Y=[X0];X=cdr(X);
                   11296:                        for(I=P1-P0;I-->0;X=cdr(X))
                   11297:                                Y=cons(car(X),Y);
                   11298:                        Y=cons(61,Y);
                   11299:                        Var=asciitostr(reverse(Y));
                   11300:                        S=str_cut(S,P,length(S));
                   11301:                }
                   11302:        }
                   11303: */
                   11304:        S=eval_str(str_subst(S,L0,L1));
                   11305:        if(type(S)==4){
                   11306:                for(L=-1,T=S;T!=[];T=cdr(T)){
                   11307:                        if(type(T0=car(T))>4) break;
                   11308:                        if(type(T0)<4){
                   11309:                                if(L>=0) break;
                   11310:                                L=-2;continue;
                   11311:                        }
                   11312:                        if(L<-2) break;
                   11313:                        if(L==-1) L=length(T0);
                   11314:                        else if(L!=length(T0)) break;
                   11315:                }
                   11316:                if(T==[]){
                   11317:                        if(L>0) S=s2m(S);
                   11318:                        else S=ltov(S);
                   11319:                }
                   11320:        }
                   11321: /*
                   11322:        if(S==0 && V0!=0) return V0;
                   11323:        if(type(Var)==7){
                   11324:                T=rtostr(S);
                   11325:                if(type(S)==7) T="\""+T+"\"";
                   11326:                S=eval_str(Var+T);
                   11327:                mycat(["Define",Var]);
                   11328:        }
                   11329: */
                   11330:        return S;
                   11331: }
                   11332:
1.73      takayama 11333: def evalcoord(L)
                   11334: {
                   11335:        if(type(L)==7) L=strtoascii(L);
                   11336:        I=str_str(L,"(");
                   11337:        if(I>=0) J=str_pair(L,I+1,"(",")");
                   11338:        if(I<0 || J<I) return [0,[]];
                   11339:        for(F=1,K=I+1;K<J;K++){
                   11340:                C=L[K];
                   11341:                if(C>32&&(C<40||C>58)){F=0;break;}
                   11342:        }
                   11343:        S0=str_cut(L,I+1,J-1);
                   11344:        for(;J>=0;J--) L=cdr(L);
                   11345:        while(L!=[]&&car(L)<33) L=cdr(L);
                   11346:        if(F){
                   11347:                S="["+S0+"]";
                   11348:                return [eval_str(S),L];
                   11349:        }else return [[S0],L];
                   11350: }
                   11351:
                   11352: def readTikZ(L)
                   11353: {
                   11354:        if(type(L)!=4) L=strtoascii(L);
                   11355:        R=[];
                   11356:        while(L!=0&&L!=[]){
                   11357:                while(L!=[]&&car(L)<33) L=cdr(L);
                   11358:                if(L==[]) break;
                   11359:                if(L[0]==34){                                                   /* % */
                   11360:                        while(L!=[]&&car(L)!=10) L=cdr(L);
                   11361:                        continue;
                   11362:                }
                   11363:                if(str_str(L,"\\begin")==0){
                   11364:                        for(K=str_str(L,"}");K>=0;K--) L=cdr(L);
                   11365:                        continue;
                   11366:                }
                   11367:                if(!(DF=str_str(L,"\\draw"))|| (DF=(str_str(L,"\\fill")+1))==1){
                   11368:                        S=T=0;
                   11369:                        I=str_str(L,"(");J=str_str(L,"[");
                   11370:                        if(J>0&&I>J){
                   11371:                                K=str_str(L,"]");
                   11372:                                S=str_cut(L,J+1,K-1);
                   11373:                        }
                   11374:                        F0=F=0;C=[];
                   11375:                        while(L!=0&&L!=[]){
                   11376:                                V=evalcoord(L);
                   11377:                                L=V[1];
                   11378:                                if(L==[]) break;
                   11379:                                if(F0){
                   11380:                                        if (!F) C=cons(0,C);
                   11381:                                        else if(F0!=3) C=cons(1,C);
                   11382:                                }
                   11383:                                C=cons(V[0],C);
                   11384:                                F0=F;F=0;
                   11385:                                if(L[0]==34){                                           /* % */
                   11386:                                        while(L!=[]&&car(L)!=10) L=cdr(L);
                   11387:                                        continue;
                   11388:                                }
                   11389:                                if(!str_str(L,"..")){                   /* .. */
                   11390:                                        L=cdr(L);L=cdr(L);
                   11391:                                        F=1;
                   11392:                                }else if(!str_str(L,"--")){             /* -- */
                   11393:                                        L=cdr(L);L=cdr(L);
                   11394:                                        F=2;
                   11395:                                }
                   11396:                                while(L!=[]&&car(L)<33) L=cdr(L);
                   11397:                                if(L==[]){L=0; break;}
                   11398:                                if(!str_str(L,"cycle")){
                   11399:                                        if(F==2) C=cons(1,C);
                   11400:                                        C=cons(-1,C);
                   11401:                                        F0=F=0;
                   11402:                                        continue;
                   11403:                                }
                   11404:                                if(!str_str(L,"and")||!str_str(L,"control"))
                   11405:                                        F=3;                            /* control, and */
                   11406:                                else if(car(L)==59){                    /* ; */
                   11407:                                        L=cdr(L);
                   11408:                                        break;
                   11409:                                }else if(isalpha(car(L))){
                   11410:                                        for(T=[];isalpha(car(L));L=cdr(L)) T=cons(car(L),T);
                   11411:                                        while(car(L)<33) L=cdr(L);
                   11412:                                        if(car(L)==40){
                   11413:                                                F0=0;continue;
                   11414:                                        }
                   11415:                                        T=cons(32,T);
                   11416:                                        while(car(L)!=40 && car(L)!=59){ /* ( ; */
                   11417:                                                T=cons(car(L),T);
                   11418:                                                if((L=cdr(L))==[]){L=0;break;}
                   11419:                                        }
                   11420:                                        T=asciitostr(reverse(T));
                   11421:                                        if(car(L)==59){
                   11422:                                                L=cdr(L);
                   11423:                                                break;
                   11424:                                        }
                   11425:                                        F0=0;continue;
                   11426:                                }else if(F!=1&&F!=2){
                   11427:                                        L=0;break;
                   11428:                                }
                   11429:                        }
                   11430:                        if(T){
1.74    ! takayama 11431:                                if(length(C)==2){
        !          11432:                                        if(!S) S=
        !          11433:                                        S=(!S)?["",T]:[S,T];
        !          11434:                                }else L=0;
        !          11435:                        }
        !          11436:                        S=(!S)? []:[["opt",S]];
        !          11437:                        if(DF) S==cons(["cmd","fill"],S);
        !          11438:                        if(T&&L){
        !          11439:                                if(L) R=cons([3,S,C[0],C[1]],R);
        !          11440:                        }else
        !          11441:                                R=cons([1,S,reverse(C)],R);
        !          11442:                }else if(!str_str(L,"\\node")){
1.73      takayama 11443:                        U=0;
                   11444:                        I=str_str(L,"(");J=str_str(L,"[");
                   11445:                        if(J>0&&I>J){
                   11446:                                K=str_str(L,"]");
                   11447:                                U=str_cut(L,J+1,K-1);
                   11448:                        }
                   11449:                        V=evalcoord(L);
                   11450:                        C=V[0];L=V[1];
                   11451:                        J=str_str(L,"{");K=str_pair(L,J+1,"{","}");
                   11452:                        S=str_cut(L,J+1,K-1);
                   11453:                        if(U) S=[U,S];
                   11454:                        R=cons([2,[],C,S],R);
                   11455:                        for(;K>=0;K--) L=cdr(L);
                   11456:                        K=str_str(L,";");
                   11457:                        for(;K>=0;K--) L=cdr(L);
                   11458:                }else L=0;
                   11459:        }
                   11460:        if(!L){
                   11461:                mycat("Can't understand!");
                   11462:                return -1;
                   11463:        }
                   11464:        return R;
                   11465: }
                   11466:
1.6       takayama 11467: def i2hex(N)
                   11468: {
                   11469:        Opt=getopt();
                   11470:        if(type(N)==4 && isint(car(N))){
                   11471: #ifdef USEMODULE
                   11472:                L=mtransbys(os_md.i2hex,N,[]|option_list=Opt);
                   11473: #else
                   11474:                L=mtransbys(i2hex,N,[]|option_list=Opt);
                   11475: #endif
                   11476:                return rtostr(L);
                   11477:        }
                   11478:        if(!isint(N) || N<0) return 0;
                   11479:        if(!N) L=[];
                   11480:        else{
                   11481:                Cap=(getopt(cap)==1)?32:0;
                   11482:                for(L=[];N!=0;N=ishift(N,4)){
                   11483:                        J=iand(N,15);
                   11484:                        L=cons(((J>9)?(87-Cap):48)+J,L);
                   11485:                }
                   11486:        }
                   11487:        if(!isint(Min=getopt(min))) Min=2;
                   11488:        for(Min-=length(L);Min-->0;)
                   11489:                L=cons(48,L);
                   11490:        if(getopt(num)==1){
                   11491:                L=cons(120,L);L=cons(48,L);
                   11492:        }
                   11493:        return asciitostr(L);
                   11494: }
                   11495:
                   11496: def sjis2jis(L)
                   11497: {
                   11498:        L1=L[1];
                   11499:        if((L0=L[0])<=0x9f){
                   11500:                if(L1<0x9f) L0=L0*2-0xe1;
                   11501:                else L0=(L0*2)-0xe0;
                   11502:        }else{
                   11503:                if(L1<0x9f) L0=L0*2-0x161;
                   11504:                else L0=L0*2-0x160;
                   11505:        }
                   11506:        if(L1<0x7f) return [L0,L1-0x1f];
                   11507:        else if(L1<0x9f) return [L0,L1-0x20];
                   11508:        return [L0,L1-0x7e];
                   11509: }
                   11510:
                   11511: def jis2sjis(L)
                   11512: {
                   11513:        L1=L[1];
                   11514:        if(iand(L0=L[0],1)){
                   11515:                if(L1<0x60) L=[L1+0x1f];
                   11516:                else L=[L1+0x20];
                   11517:        }else L=[L1+0x7e];
                   11518:        if(L0<0x5f) return cons(ishift(L0+0xe1,1),L);
                   11519:        return cons(ishift(L0+0x161,1),L);
                   11520: }
                   11521:
                   11522: def verb_tex_form(P)
                   11523: {
                   11524:        L = reverse(strtoascii(rtostr(P)));
                   11525:        for(SS = []; L != []; L = cdr(L)){
                   11526:                Ch = car(L);  /* ^~\{} */
                   11527:                if(Ch == 92 || Ch == 94 || Ch == 123 || Ch == 125 || Ch == 126){
                   11528:                        SS = append([92,Ch,123,125],SS); /* \Ch{}  */
                   11529:                        if(Ch != 94 && Ch != 126)        /* \char` */
                   11530:                                SS = append([92,99,104,97,114,96],SS);
                   11531:                        continue;
                   11532:                }
                   11533:                SS = cons(Ch, SS);
                   11534:                if((Ch >= 35 && Ch <= 38) || Ch == 95)  /* #$%&_ */
                   11535:                        SS = cons(92, SS);  /* \Ch */
                   11536:        }
                   11537:        return asciitostr(SS);
                   11538: }
                   11539:
                   11540: def tex_cuteq(S,P)
                   11541: {
                   11542:        if(P==0) return 0;
                   11543:        if(S[P]==125){ /* } */
                   11544:                if((Q=str_pair(S,P-1,"{","}"|inv=1))<0) return -1;
                   11545:                if(Q<2||S[Q-1]!=95) return Q;
                   11546:                return tex_cuteq(S,Q-2);
                   11547:        }
                   11548:        if(!isalphanum(S[Q=P--])) return -1;
                   11549:        while(P>0&&isalphanum(S[P])) P--;
                   11550:        if(S[P]==92){ /* \ */
                   11551:                if(P==0) return P;
                   11552:                else P--;
                   11553:        }
                   11554:        if(S[P]!=95||P==0) return Q; /* _ */
                   11555:        return tex_cuteq(S,P-1);
                   11556: }
                   11557:
                   11558:
                   11559: def texket(S)
                   11560: {
                   11561:        if(!isint(F=getopt(all))) F=0;
                   11562:        if(type(S)==7){
                   11563:                L=str_len(S);
                   11564:                SS=strtoascii(S);
                   11565:        }else{
                   11566:                L=length(S);
                   11567:                SS=S;
                   11568:        }
                   11569:        for(T="",I=I0=0;I<L-1;){
                   11570:                J=str_char(SS,I,"(");
                   11571:                if(J<0) break;
                   11572:                if(J<L-1 && J>4 && str_str(SS,"\\left"|top=J-5,end=J-1)>=0){
                   11573:                        I=J+1;continue;
                   11574:                }
                   11575:                if((K=str_pair(SS,J+1,"(",")"))>=0){
                   11576:                        KK=str_char(SS,J+2,"(");
                   11577:                        if(KK>K||KK<0){
                   11578:                                if(F!=1){
                   11579:                                        if(!F){
                   11580:                                                for(N=J+1;N<K;N++)      /* + - _   { } */
                   11581:                                                        if(!isalphanum(P=SS[N])&&findin(P,[32,43,45,95,123,125])<0) break;
                   11582:                                        }else N=K;
                   11583:                                        if(N==K){
                   11584:                                                I=K+1;continue;
                   11585:                                        }
                   11586:                                }
                   11587:                                T=T+str_cut(SS,I0,J-1)+"\\left"+str_cut(SS,J,K-1)+"\\right)";
                   11588:                                I0=I=K+1;
                   11589:                        }else{
                   11590:                                T=T+str_cut(SS,I0,J-1)+"\\left("+texket(str_cut(SS,J+1,K-1)|all=F) +"\\right)";
                   11591:                                I0=I=K+1;
                   11592:                        }
                   11593:                }else break;
                   11594:        }
                   11595:        return T+str_cut(SS,I0,L);
                   11596: }
                   11597:
                   11598:
                   11599: def my_tex_form(S)
                   11600: {
                   11601:        if(getopt(skip) != 1){
                   11602:                if(type(S)==1 && S<0)   return "-"+print_tex_form(-S);
                   11603:                if(type(S)==6) return mtotex(S);
                   11604:                S = print_tex_form(S);
                   11605:                for(F=Top=0;(L=str_str(S,"\\verb`"|top=Top))>=0;Top=LV+1){
                   11606:                        F++;
                   11607:                        if(Top==0)      Tb = string_to_tb("");
                   11608:                        LV = str_chr(S, L+6, "`");
                   11609:                        if(LV<0)        LV=str_len(S);
                   11610:                        str_tb([my_tex_form(sub_str(S, Top, L-1)|skip=1), "\\texttt{"], Tb);
                   11611:                        str_tb([verb_tex_form(sub_str(S,L+6, LV-1)),"}"], Tb);
                   11612:                        Top=LV+1;
                   11613:                }
                   11614:                if(F>0){
                   11615:                        str_tb(my_tex_form(sub_str(S, Top,str_len(S)-1)|skip=1), Tb);
                   11616:                        return tb_to_string(Tb);
                   11617:                }
                   11618:        }
                   11619:        if(S==0) return "";
                   11620:        S = ltov(strtoascii(S));
                   11621:        L = length(S)-1;
                   11622:        while(L >= 1 && S[L] == 10)
                   11623:                L--;
                   11624:        if((Fr=getopt(frac))!=0 && Fr!=1) Fr=2;
                   11625:        for(I = L+1, T = K = 0, SS = []; --I >= 0; ){
                   11626:                if(S[I] == 32 && I!=L){
                   11627:                        if(I==L) continue;
                   11628:                        if(findin(S[I+1], [32,40,41,43,45,123,125]) >= 0  /* " ()+-{}" */
                   11629:                                || (S[I+1] >= 49 && S[I+1] <= 57))  /* 1 - 9 */
                   11630:                                        if(I == 0 || S[I-1] >= 32) continue;
                   11631:                }
                   11632:                if(Fr && S[I]>=48 && S[I]<=57){ /* 2/3 -> \tfrac{2}{3} */
                   11633:                        for(K=0,II=I; II>=0; II--){
                   11634:                                if(S[II]>=48 && S[II]<=57) continue;
                   11635:                                if(S[II]==47){  /* / */
                   11636:                                        if(K>0) break;
                   11637:                                        K=II;
                   11638:                                }else break;
                   11639:                        }
                   11640:                        if(K>II+1){
                   11641:                                SS=cons(125,SS);
                   11642:                                for(J=I; J>K; J--) SS=cons(S[J],SS);
                   11643:                                if(AMSTeX){
                   11644:                                        SS=cons(123,SS);SS=cons(125,SS);
                   11645:                                }else{
                   11646:                                        for(J=[114,101,118,111,92];J!=[];J=cdr(J))      /* \over */
                   11647:                                                SS=cons(car(J),SS);
                   11648:                                }
                   11649:                                for(J=K-1;J>II;J--) SS=cons(S[J],SS);
                   11650:                                SS=cons(123,SS);
                   11651:                                if(AMSTeX){
                   11652:                                        J=(Fr==2)?[99,97,114,102,116,92]:[99,97,114,102,92];
                   11653:                                        for(;J!=[];J=cdr(J))    /* \tfrac */
                   11654:                                                SS=cons(car(J),SS);
                   11655:                                }
                   11656:                                I=II+1;
                   11657:                        }else{
                   11658:                                for(;I>II;I--) SS = cons(S[I], SS);
                   11659:                                I++;
                   11660:                        }
                   11661:                        continue;
                   11662:                }
                   11663:                SS = cons(S[I], SS);
                   11664:        }
1.52      takayama 11665:        SS=str_subst(SS,"\n\\\\\n\\end{pmatrix}","\n\\end{pmatrix}"|raw=1);
1.6       takayama 11666:        SS=str_subst(SS,"\\\\\n\\end{pmatrix}","\n\\end{pmatrix}"|raw=1);
                   11667:        Subst=getopt(subst);
                   11668:        Sub0=["{asin}","{acos}","{atan}"];
                   11669:        Sub1=["\\arcsin ","\\arccos","\\arctan "];
                   11670:        if(type(Subst) == 4){
                   11671:                Sub0=append(Sub0,Subst[0]);Sub1=append(Sub1,Subst[1]);
                   11672:        }
                   11673:        SS = str_subst(SS,Sub0,Sub1|raw=1);
                   11674:        S = ltov(SS);
                   11675:        L = length(S);
                   11676:        SS = [];
                   11677:        while(--L >= 0){
                   11678:                if(S[I=L] == 125){
                   11679:                        while(--I >= 0 && S[I] == 125);
                   11680:                        J = 2*I - L;
                   11681:                        if(J >= 0 && S[I] != 123){
                   11682:                                for(K = J; K < I && S[K] == 123; K++);
                   11683:                                if(K == I){
                   11684:                                        if(J-- <= 0 || S[J] < 65 || S[J] > 122 || (S[J] > 90 && S[J] < 97)){
                   11685:                                                SS = cons(S[I],SS);
                   11686:                                                L = J+1;
                   11687:                                                continue;
                   11688:                                        }
                   11689:                                }
                   11690:                        }
                   11691:                }
                   11692:                SS = cons(S[L],SS);
                   11693:        }
                   11694:        RT=getopt(root);
                   11695:        for(Top=0;;Top++){      /* ((x+1))^{y} , 1/y=2,3,...,9 */
                   11696: #if 1
                   11697:                P=str_str(SS,["))^","^{\\tfrac{1}"]|top=Top);
                   11698:                if(P[0]<0) break;
                   11699:                Sq=0;
                   11700:                if(P[0]==0){
                   11701:                        P=P[1];
                   11702:                        if((Q=str_pair(SS,P,"(",")"|inv=1))<0||SS[Q+1]!=40) continue;
                   11703:                        if((RT==2||(RT!=0 && P-Q<33)) && str_str(SS,"{\\tfrac{1}"|top=P+3,end=P+3)==P+3
                   11704:                        && SS[P+14]==125){
                   11705:                                if((Sq=SS[P+13]-48)<2||Sq>9) Sq=0;
                   11706:                        }
                   11707:                        F=2;
                   11708:                }else{
                   11709:                        P=P[1];
                   11710:                        if(SS[P+12]!=125||(Sq=(SS[P+11]-48))<2||Sq>9) break;
                   11711:                        if(SS[P-1]==125){
                   11712:                                if((Q=str_pair(SS,P-2,"{","}"|inv=1))<0) break;
                   11713:                                if(Q>1&&SS[Q-1]==95){
                   11714:                                        if((Q=tex_cuteq(SS,Q-2))<0) break;
                   11715:                                        F=0;
                   11716:                                }else F=1;
                   11717:                        }else{
                   11718:                                if(!isalphanum(SS[Q=P-1]) || (Q=tex_cuteq(SS,Q))<0) break;
                   11719:                                F=0;
                   11720:                        }
                   11721:                        if(RT!=2&&P-Q>32) break;
                   11722:                }
                   11723: #else
                   11724:                if((P=str_str(SS,"))^"|top=Top))<0 || (Q=str_pair(SS,P,"(",")"|inv=1))<0) break;
                   11725:                else F=2;
                   11726:                Sq=0;
                   11727:                if((RT==2||(RT!=0 && P-Q<33)) && str_str(SS,"{\\tfrac{1}"|top=P+3,end=P+3)==P+3
                   11728:                   && SS[P+14]==125){
                   11729:                        if((Sq=SS[P+13]-48)<2||Sq>9) Sq=0;
                   11730:                }
                   11731: #endif
                   11732:                for(I=0,S=[];SS!=[];SS=cdr(SS),I++){
                   11733:                        if(I==Q){
                   11734:                                if(Sq){
                   11735:                                        S=append([116,114,113,115,92],S);
                   11736:                                        if(Sq>2) S=append([93,Sq+48,91],S);
                   11737:                                        S=cons(123,S);
                   11738:                                        if(F==2) SS=cdr(SS);
                   11739:                                        else if(F==0) S=cons(car(SS),S);
1.68      takayama 11740:                                }else if(F==2&&P-Q==3){         /* (2)^x -> 2^x */
1.6       takayama 11741:                                        SS=cdr(SS);SS=cdr(SS);
                   11742:                                        S=cons(123,S);S=cons(car(SS),S);S=cons(125,S);
                   11743:                                        SS=cdr(SS);SS=cdr(SS);
                   11744:                                        I+=3;
                   11745:                                }
                   11746:                                continue;
                   11747:                        }else if(I==P){
                   11748:                                if(Sq){
                   11749:                                        if(F>0) S=cdr(S);
                   11750:                                        S=cons(125,S);
                   11751:                                        if(F==2) SS=cdr(SS);
                   11752:                                        for(J=0;J<12;J++) SS=cdr(SS);
                   11753:                                }
                   11754:                                continue;
                   11755:                        }
                   11756:                        S=cons(car(SS),S);
                   11757:                }
                   11758:                SS=reverse(S);
                   11759:                Top=P;
                   11760:        }
1.68      takayama 11761:     for(F=G=0,S=[];SS!=[];SS=cdr(SS)){  /* 22^x -> 2\cdot 2^x */
                   11762:                if(F==1&&G!=-1&&car(SS)==123 && length(SS)>1 && isnum(SS[1]))
                   11763:                        S=append([116,111,100,99,92],S);
                   11764:                G=F;
                   11765:                if(car(SS)==125||car(SS)==95) F=-1;
                   11766:                else F=isnum(car(SS));
                   11767:                S=cons(car(SS),S);
                   11768:        }
                   11769:        S=asciitostr(reverse(S));
                   11770: /*     S=asciitostr(SS); */
1.6       takayama 11771:        if((K=getopt(ket))==1) S=texket(S);
                   11772:        else if(K==2) S=texket(S|all=1);
                   11773:        return S;
                   11774: }
                   11775:
                   11776: def smallmattex(S)
                   11777: {
                   11778:  return str_subst(S,[["\\begin{pmatrix}","\\left(\\begin{smallmatrix}"],
                   11779:        ["\\end{pmatrix}","\\end{smallmatrix}\\right)"],
                   11780:        ["\\begin{Bmatrix}","\\left\\{\\begin{smallmatrix}"],
                   11781:        ["\\end{Bmatrix}","\\end{smallmatrix}\\right\\}"],
                   11782:        ["\\begin{bmatrix}","\\left[{\\begin{smallmatrix}"],
                   11783:        ["\\end{bmatrix}","\\end{smallmatrix}\\right]"],
                   11784:        ["\\begin{vmatrix}","\\left|\\begin{smallmatrix}"],
                   11785:        ["\\end{vmatrix}","\\end{smallmatrix}\\right|"],
                   11786:        ["\\begin{Vmatrix}","\\left\\|\\begin{smallmatrix}"],
                   11787:        ["\\end{Vmatrix}","\\end{smallmatrix}\\right\\|"],
                   11788:        ["\\begin{matrix}","\\begin{smallmatrix}"],
                   11789:        ["\\end{matrix}","\\end{smallmatrix}"]],0);
                   11790: }
                   11791:
                   11792:
                   11793: def divmattex(S,T)
                   11794: {
                   11795:        TF=["matrix","pmatrix","Bmatrix","bmatrix","vmatrix","Vmatrix"];
                   11796:        TG=[0,"(","\\{","[","|","\\|"];
                   11797:        TH=[0,")","\\}","]","|","\\|"];
                   11798:        if(type(S)!=7) S=mtotex(S);
                   11799:        S=strtoascii(S0=S);
                   11800:        if((P0=str_str(S,"\\begin{"))<0 || (P1=str_str(S,"}"|top=P0+7))<0)
                   11801:                return S0;
                   11802:        F=str_cut(S,P0+7,P1-1);
                   11803:        if((K=findin(F,TF))<0) return S0;
                   11804:        Q=str_str(S,"\\end{"+F+"}");
                   11805:        if(Q<0) return S0;
                   11806:        for(J=P1+1;S[J]<33;J++);
                   11807:        for(L0=L=[],I=J;J<Q;J++){
                   11808:                if(S[J]==38){   /* & */
                   11809:                        if(I>=J) L0=cons(0,L0);
                   11810:                        else L0=cons(str_cut(S,I,J-1),L0);
                   11811:                        I=J+1;
                   11812:                }
                   11813:                if(S[J]==92&&S[J+1]==92){ /* \\ */
                   11814:                        if(I>=J) L0=cons(0,L0);
                   11815:                        else L0=cons(str_cut(S,I,J-1),L0);
                   11816:                        L=cons(reverse(L0),L);
                   11817:                        L0=[];
                   11818:                        J++;
                   11819:                        for(I=J+1;S[I]<33;I++);
                   11820:                }
                   11821:        }
                   11822:        J--;
                   11823:        if(S[J]<33) J--;
                   11824:        if(I<=J) L0=cons(str_cut(S,I,J),L0);
                   11825:        if(length(L0)>0) L=cons(reverse(L0),L);
                   11826:        L=lv2m(reverse(L));     /* get matrix */
                   11827:        if(T==0) return L;
1.26      takayama 11828:        if(type(T)==1) T=[T];
1.6       takayama 11829:        Size=size(L);S0=Size[0];
                   11830:        if(type(T[0])!=4){
                   11831:                S1=Size[1];
                   11832:                T=append(T,[S1]);
                   11833:                for(TT=[],I=0;T!=[];T=cdr(T)){
                   11834:                        J=car(T);
                   11835:                        if(J>S1) J=S1;
                   11836:                        for(T0=[];J>I;J--) T0=cons(J-1,T0);
                   11837:                        if(T0!=[]) TT=cons(T0,TT);
                   11838:                        I=car(T);
                   11839:                }
                   11840:                T=reverse(TT);
                   11841:        }
                   11842:        SS=length(T);
                   11843:        St=str_tb(0,0);
                   11844:        if(SS==1) St=str_tb("\\begin{"+F+"}\n",St);
                   11845:        else{
                   11846:                if(K>0) St=str_tb("&\\left"+TG[K],St);
                   11847:                St=str_tb("\\begin{matrix}\n",St);
                   11848:        }
                   11849:        for(;T!=[];T=cdr(T)){
                   11850:                for(I=0;I<S0;I++){
                   11851:                        for(J=0,TT=car(T);TT!=[];TT=cdr(TT),J++){
                   11852:                                if(J>0) St=str_tb("&",St);
                   11853:                                if(L[I][car(TT)]!=0) St=str_tb(L[I][car(TT)],St);
                   11854:                        }
                   11855:                        if(I<S0-1) St=str_tb("\\\\",St);
                   11856:                        St=str_tb("\n",St);
                   11857:                }
                   11858:                if(length(T)>1)
                   11859:                        St=str_tb("\\end{matrix}\\right.\\\\\n&\\quad\\left.\\begin{matrix}\n",St);
                   11860:                else{
                   11861:                        if(SS==1) St=str_tb("\\end{"+F+"}\n",St);
                   11862:                        else St=str_tb("\\end{matrix}\\right"+TH[K]+"\n",St);
                   11863:                }
                   11864:        }
                   11865:        S=str_tb(0,St);
                   11866:        if(SS==1) return S;
                   11867:        return texbegin("align*",S);
                   11868: }
                   11869:
                   11870: def str_subst(S, L0, L1)
                   11871: {
                   11872:        if(type(S) == 7)
                   11873:                S = strtoascii(S);
                   11874:        if(type(S) == 4)
                   11875:                S = ltov(S);
                   11876:        SE = length(S);
                   11877:        if(L1 == 0){
                   11878:                for(L1 = L = [], L0 = reverse(L0); L0 != []; L0 = cdr(L0)){
                   11879:                        L  = cons(car(L0)[0], L);
                   11880:                        L1 = cons(car(L0)[1], L1);
                   11881:                }
                   11882:                L0 = L;
                   11883:        }
                   11884:        if(type(L0)==7) L0 = [strtoascii(L0)];
                   11885:        else{
                   11886:                for(LT = []; L0 != []; L0 = cdr(L0))
                   11887:                        LT = cons(strtoascii(car(L0)), LT);
                   11888:                L0 = ltov(LT);
                   11889:        }
                   11890:        E0 = length(L0);
                   11891:        if(type(L1)==7) L1 = [strtoascii(L1)];
                   11892:        else{
                   11893:                for(LT = []; L1 != []; L1 = cdr(L1))
                   11894:                        LT = cons(strtoascii(car(L1)), LT);
                   11895:                L1 = ltov(LT);
                   11896:        }
                   11897:        if(getopt(inv)==1){
                   11898:                L2=L0;L0=L1;L0=L2;
                   11899:        }
                   11900:        if((SJIS=getopt(sjis))!=1) SJIS=0;
                   11901:        for(J = JJ = 0, ST = []; J < SE; J++){
                   11902:                SP = S[J];
                   11903:                for(I = E0-1; I >= 0; I--){
                   11904:                        if(SP != L0[I][0] || J + (K = length(L0[I])) > SE)
                   11905:                                continue;
                   11906:                        while(--K >= 1)
                   11907:                                if(L0[I][K] != S[J+K]) break;
                   11908:                        if(K > 0) continue;
                   11909:                        for(KE = length(L1[I]), K = 0 ;K < KE; K++)
                   11910:                                ST = cons(L1[I][K],ST);
                   11911:                        J += length(L0[I])-1;
                   11912:                        break;
                   11913:                }
                   11914:                if(I < 0){
                   11915:                        ST = cons(S[J],ST);
                   11916:                        if(SJIS && (V=S[J])>128){
                   11917:                                if(V<160 || (V>223 && V<240)) ST = cons(S[J++],ST);
                   11918:                        }
                   11919:                }
                   11920:        }
                   11921:        if(getopt(raw)==1) return reverse(ST);
                   11922:        return asciitostr(reverse(ST));
                   11923: }
                   11924:
                   11925: def dviout0(L)
                   11926: {
1.70      takayama 11927:        Cmd=["TikZ","TeXLim","TeXEq","DVIOUT","XYPrec","XYcm","XYLim","Canvas","TeXPages"];
1.6       takayama 11928:        if(type(Opt=getopt(opt))==7){
                   11929:                if((F=findin(Opt,Cmd)) < 0) return -1;
                   11930:                if(L==-1){
                   11931:                        if(F<=3){
                   11932:                                if(F==0) V=TikZ;
                   11933:                                else if(F==1) V=TeXLim;
                   11934:                                else if(F==2) V=TeXEq;
                   11935:                                else V=iand(DVIOUTF,1);
                   11936:                        }else{
                   11937:                                if(F==4) V=XYPrec;
                   11938:                                else if(F==5) V=XYcm;
                   11939:                                else if(F==6) V=XYLim;
1.70      takayama 11940:                                else if(F==7) V=Canvas;
                   11941:                                else if(F==8) V=TeXPages;
1.6       takayama 11942:                        }
                   11943:                        return V;
                   11944:                }
                   11945:                if(F==0) TikZ=L;
                   11946:                else if(F==2) TeXEq=L;
                   11947:                else if(F==3){
                   11948:                        if(iand(DVIOUTF,1)==L)
                   11949:                                mycat0(["DVIOUTA=\"", DVIOUTA,"\""],1);
                   11950:                        else dviout0(4);
                   11951:                        return 1;
                   11952:                }else if(F==7&&type(L)==4)
                   11953:                        Canvas=L;
                   11954:                else if(L>0){
                   11955:                        if(F==1) TeXLim=L;
                   11956:                        else if(F==4) XYPrec=L;
                   11957:                        else if(F==5) XYcm=L;
                   11958:                        else if(F==6) XYLim=L;
1.70      takayama 11959:                        else if(F==8) TeXPages=L;
1.6       takayama 11960:                }
                   11961:                mycat0([Cmd[F],"=",L],1);
                   11962:                return 1;
                   11963:        }
                   11964:        if(type(L) == 4){
                   11965:                for( ; L != []; L = cdr(L)) dviout0(car(L));
                   11966:                return 1;
                   11967:        }
                   11968:        if(type(L) == 7){
                   11969:                if(L=="")  dviout(" \n"|keep=1);
                   11970:                else if(L=="cls")  dviout0(0);
                   11971:                else if(L=="show") dviout(" ");
                   11972:                else if(L=="?")    dviout0(3);
                   11973:                else dviout("\\"+L+"\n"|keep=1);
                   11974:                return 1;
                   11975:        }
                   11976:        if(L == 0)
                   11977:                dviout(" "|keep=1,clear=1);
                   11978:        else if(L == 1)
                   11979:                dviout(" ");
                   11980:        else if(L == 2)
                   11981:                dviout(" "|clear=1);
                   11982:        else if(L>10)
                   11983:                dviout("\\setcounter{MaxMatrixCols}{"+rtostr(L)+"}%"|keep=1);
                   11984:        else if(L < 0)
                   11985:                dviout(" "|delete=-L,keep=1);
                   11986:        else if(L == 3){
                   11987:                mycat0(["DIROUT =\"", DIROUT,"\""],1);
                   11988:                mycat0(["DVIOUTH=\"", DVIOUTH,"\""],1);
                   11989:                mycat0(["DVIOUTA=\"", DVIOUTA,"\""],1);
                   11990:                mycat0(["DVIOUTB=\"", DVIOUTB,"\""],1);
                   11991:                mycat0(["DVIOUTL=\"", DVIOUTL,"\""],1);
                   11992:                mycat(["Canvas =", Canvas]);
                   11993:                mycat(["TeXLim =", TeXLim]);
1.70      takayama 11994:                mycat(["TeXPages =", TeXPages]);
1.6       takayama 11995:                mycat(["TeXEq  =", TeXEq]);
                   11996:                mycat(["AMSTeX =", AMSTeX]);
                   11997:                mycat(["TikZ   =", TikZ]);
                   11998:                mycat(["XYPrec =", XYPrec]);
                   11999:                mycat(["XYcm   =", XYcm]);
                   12000:                mycat(["XYLim  =", XYLim]);
                   12001:        }else if(L==4){
                   12002:                Tmp=DVIOUTA; DVIOUTA=DVIOUTB; DVIOUTB=Tmp;
                   12003:                mycat0(["DVIOUTA=\"", DVIOUTA,"\""],1);
                   12004:                DVIOUTF++;
                   12005:        }else if(L==5){
                   12006:                if(!iand(DVIOUTF,1)) dviout0(4);
                   12007:        }else if(L==6){
                   12008:                TikZ=1;mycat("TikZ=1");
                   12009:        }else if(L==7){
                   12010:                TikZ=0;mycat("TikZ=0");
                   12011:        }
                   12012:        return 1;
                   12013: }
                   12014:
                   12015: def myhelp(T)
                   12016: {
                   12017:        /* extern DVIOUT;       */
                   12018:        /* extern HDVI; */
                   12019:        /* extern DVIOUTH;      */
                   12020:
                   12021:        if(type(T)==2){
                   12022:                if(T==getbygrs){
                   12023:                        getbygrs(0,0);
                   12024:                        return 0;
                   12025:                }
                   12026:                else if(T==m2mc){
                   12027:                        m2mc(0,0);
                   12028:                        return 0;
                   12029:                }
                   12030:                else if(T==mgen){
                   12031:                        mgen(0,0,0,0);
                   12032:                        return 0;
                   12033:                }
                   12034:                else T=rtostr(T);
                   12035:        }
                   12036:        if(type(T)==4 && typeT[0]==7){
                   12037:                if(length(T)==2 && type(T[1])==1){
                   12038:                        DVIOUTH="start "+T[0]+" -"+rtostr(T[1])+"-hyper:0x90 \"%ASIRROOT%\\help\\os_muldif.dvi\" #r:%LABEL%";
                   12039:                }else if(str_len(T[0])>2)       DVIOUTH=T[0];
                   12040:                mycat(["DVIOUTH="+DVIOUTH,"\nmyhelp(fn) is set!"]);
                   12041:                return 0;
                   12042:        }
                   12043:        if(T==0){
                   12044:                mycat([
                   12045:                        "myhelp(t) : show help\n",
                   12046: #ifdef USEMODULE
                   12047:                        " t : -1 (dvi), 1 (pdf) or os_md.getbygrs, os_md.m2mc, os_md.mgen\n",
                   12048: #else
                   12049:                        " t : -1 (dvi), 1 (pdf) or getbygrs, m2mc, mgen\n",
                   12050: #endif
                   12051:                        "    \"fn\"    : Help of the function fn\n",
                   12052:                        "    [path,n]  : path of dviout, n = # dviout\n",
                   12053:                        "    [DVIOUTH] : Way to jump to the help of a function\n",
                   12054:                        "       default: start dviout -2 \"%ASIRTOOT%\\help\\os_muldif.dvi\" #r:%LABEL%"
                   12055:                ]);
                   12056:                return 0;
                   12057:        }
                   12058:        if(type(T)==7){
                   12059:                if(str_str(T,"os_md.")==0) T=str_cut(T,6,str_len(T)-1);
                   12060:                Dr=str_subst(DVIOUTH,["%ASIRROOT%","%LABEL%"],[get_rootdir(),"r:"+str_subst(T,"_","")]);
                   12061:                shell(Dr);
                   12062:                return 0;
                   12063:        }
                   12064:        Dr=get_rootdir();
                   12065:        if(T==-1) Dr+="\\help\\os_muldif.dvi";
                   12066:        else Dr+="\\help\\os_muldif.pdf";
                   12067:        if(!isMs()) Dr=str_subst(Dr,"\\","/");
                   12068:        shell(Dr);
                   12069:        return 0;
                   12070: }
                   12071:
                   12072: def isMs()
                   12073: {
                   12074:        if(type(Tmp=getenv("TEMP"))!=7) {
                   12075:        if (type(Tmp=getenv("TMP")) != 7) Tmp=getenv("HOME");
                   12076:     }
                   12077:        if(type(Tmp)==7 && str_chr(Tmp,0,"\\")==2) return 1;
                   12078:        else return 0;
                   12079: }
                   12080:
                   12081: def tocsv(L)
                   12082: {
                   12083:        if(type(L)==6) L=m2ll(L);
                   12084:        else if(type(L)==5) L=vtol(L);
                   12085:        Null=getopt(null);
                   12086:        Tb=str_tb(0,0);
                   12087:        for(LL=L; LL!=[]; LL=cdr(LL)){
                   12088:                LT=car(LL);
                   12089:                if(type(LT)==5) LT=vtol(LT);
                   12090:                if(type(LT)<4) LT=[LT];
                   12091:                for(N=0; LT!=[]; LT=cdr(LT),N++){
1.55      takayama 12092:                        if(N) str_tb(",",Tb);
1.6       takayama 12093:                        if((T=car(LT))==Null) continue;
                   12094:                        if(type(T)==7){
                   12095:                                K=str_len(T);
                   12096:                                T=str_subst(T,["\""],["\"\""]);
                   12097:                                if(str_len(T)>K||str_char(T,0,",")>=0) T="\""+T+"\"";
                   12098:                                str_tb(T,Tb);
                   12099:                        }else str_tb(rtostr(T),Tb);
                   12100:                }
                   12101:                str_tb("\n",Tb);
                   12102:        }
1.16      takayama 12103:        S=str_tb(0,Tb);
                   12104:        if(type(EXE=getopt(exe))!=1&&EXE!=0&&type(EXE)!=7) return S;
                   12105:        if(type(F)!=7){
1.18      takayama 12106:                fcat(-1,0);
1.16      takayama 12107:                F="risaout";
                   12108:                if(EXE>=2&&EXE<=9) F+=rtostr(EXE);
                   12109:                F=DIROUTD+F+".csv";
                   12110:        }else F=S;
                   12111:        if(EXE!=0 && access(F)) remove_file(F);
                   12112:        fcat(F,S|exe=1);
                   12113:        return 1;
1.6       takayama 12114: }
                   12115:
                   12116: def readcsv(F)
                   12117: {
                   12118:        if((ID=open_file(F))<0) return -1;
                   12119:        SJIS=isMs();
                   12120:        L=[];
                   12121:        if(type(V=getopt(eval))!=4){
                   12122:                if(V=="all") V=1;
                   12123:                else if(type(V)==1) V=[V];
                   12124:                else V=[];
                   12125:        }
1.9       takayama 12126:        Eq=getopt(eq);
1.6       takayama 12127:        Sp=getopt(sp);
                   12128:        if(type(T=getopt(col))!=1) T=0;
                   12129:        Null=getopt(null);
1.9       takayama 12130:        if(type(Null)<0) Null=(Eq==1)?0:"";
1.6       takayama 12131:        while((S=get_line(ID))!=0){
                   12132:                S=strtoascii(S);
                   12133:                N=length(S);
                   12134:                for(I=J=F=0,LL=LT=[];I<N;I++){
                   12135:                        C=S[I];
                   12136:                        if(F==0){
                   12137:                                if(C<=32) continue;
                   12138:                                if(C==34){F=2;continue;}
                   12139:                                F=1;
                   12140:                        }
                   12141:                        if(F==2 && C==34){
                   12142:                                if(I<N-1&& S[I+1]==34){
                   12143:                                        LT=cons(34,LT);I++;continue;
                   12144:                                }
                   12145:                                F=-2;
                   12146:                        }
                   12147:                        if(F==1){
                   12148:                                if((C==44&&Sp!=1)||(C<=32&&Sp==1)) F=-1;
                   12149:                                else if(C<32 && C!=9) continue;
                   12150:                        }
                   12151:                        if(SJIS && I<N-1 && ((C>128 && C<160)||(C>223 && C<240))){
                   12152:                                LT=cons(C,LT);LT=cons(S[++I],LT);continue;
                   12153:                        }
                   12154:                        if(F>0){
                   12155:                                LT=cons(C,LT);continue;
                   12156:                        }
                   12157:                        LS=asciitostr(reverse(LT));
1.9       takayama 12158:                        if(V==1||findin(++J,V)>=0){
                   12159:                                if(Eq==1) LS=(LS=="")?Null:eval_str(LS);
                   12160:                                else LS=(isdecimal(LS))?eval_str(LS):((LS=="")?Null:LS);
                   12161:                        }
1.6       takayama 12162:                        if(!T || T==J) LL=cons(LS,LL);
                   12163:                        if(F==-2) while(++I<N && Sp!=1 && S[I]!=44);
                   12164:                        F=0;LT=[];
                   12165:                }
                   12166:                if(I<=N && (Sp!=1 || length(LT)>0)){ /* lastline */
                   12167:                        LS=asciitostr(reverse(LT));
1.9       takayama 12168:                        if(V==1||findin(++J,V)>=0){
                   12169:                                if(Eq==1) LS=(LS=="")?Null:eval_str(LS);
                   12170:                                else LS=(isdecimal(LS))?eval_str(LS):((LS=="")?Null:LS);
                   12171:                        }
1.6       takayama 12172:                        if(!T || T==J) LL=cons(LS,LL);
                   12173:                }
                   12174:                L=cons(reverse(LL),L);
                   12175:        }
                   12176:        close_file(ID);
                   12177:        if(T) L=m2l(L|flat=1);
1.16      takayama 12178:        L=reverse(L);
                   12179:        return L;
1.6       takayama 12180: }
                   12181:
1.55      takayama 12182: def getline(ID)
                   12183: {
                   12184:        if(isint(Maxlen=getopt(Max))>0) Maxlen=1024;
                   12185:        if(type(CR=getopt(CR))!=4) CR=[13];
                   12186:        if(type(LF=getopt(LF))!=4) LF=[10];
                   12187:        S=[];
                   12188:        for(I=0; I<1023; I++){
                   12189:                C=get_byte(ID);
                   12190:                if(C<0) return 0;
                   12191:                if(findin(C,CR)>=0) continue;
                   12192:                if(findin(C,LF)>=0) break;
                   12193:                S=cons(C,S);
                   12194:        }
                   12195:        return asciitostr(reverse(S));
                   12196: }
                   12197:
1.6       takayama 12198: def showbyshell(S)
                   12199: {
                   12200:        Id = getbyshell(S);
                   12201:        if(Id<0) return Id;
                   12202:        while((S=get_line(Id))!=0) print(S,2);
                   12203:        return close_file(Id);
                   12204: }
                   12205:
                   12206:
                   12207: def getbyshell(S)
                   12208: {
                   12209:        /* extern DIROUT;       */
                   12210:
                   12211:        Home=getenv("HOME");
                   12212:        if(type(Home)!=7) Home="";
                   12213:        if(type(Tmp=getenv("TEMP"))!=7 && type(Tmp=getenv("TMP")) != 7)
                   12214:                Tmp=str_subst(DIROUT,["%HOME%","%ASIRROOT%"],[Home,get_rootdir()]);
                   12215:        Sep=isMs()?"\\":"/";
                   12216:        F=Tmp+Sep+"muldif.tmp";
1.16      takayama 12217:        if(type(S)<=1 && S>=0)  close_file(S);
1.6       takayama 12218:        remove_file(F);
                   12219:        if(type(S)<=1) return -1;
                   12220:        shell(S+" > \""+F+"\"");
                   12221:        return open_file(F);
                   12222: }
                   12223:
1.69      takayama 12224: def isfctr(P)
                   12225: {
                   12226:        if(type(P)>3) return 0;
                   12227:        if(type(P)==3) return (!isfctr(nm(P))||!isfctr(dn(P)))?0:1;
                   12228:        V=ptol(P,vars(P)|opt=0);
                   12229:        for(;V!=[];V=cdr(V)){
                   12230:                if(type(car(V))>1||ntype(car(V))>0) return 0;
                   12231:        }
                   12232:        return 1;
                   12233: }
                   12234:
1.6       takayama 12235: def show(P)
                   12236: {
                   12237:        T=type(P);
                   12238:        S=P;
                   12239:        Var=getopt(opt);
1.69      takayama 12240:        if((Raw=getopt(raw))!=1) Raw=0;
1.6       takayama 12241:        if(Var=="verb"){
1.69      takayama 12242:                S="{\\tt"+verb_tex_form(T)+"}\n\n";
                   12243:                if(Raw) return S;
                   12244:                dviout(S);return;
1.6       takayama 12245:        }
                   12246:        if(type(Var)<0) Var=getopt(var);
                   12247:        if(T==6){
                   12248:                if((Sp=getopt(sp))==1 || Sp==2)
                   12249:                        S=mtotex(P|lim=1,small=2,sp=Sp,null=1,mat="B");
                   12250:                else if(type(Var)==4 || type(Var)==7)
                   12251:                        S=mtotex(P|lim=1,small=2,var=Var);
                   12252:                else
                   12253:                        S=mtotex(P|lim=1,small=2);
                   12254:                Size=size(P);
                   12255:                Size=(Size[0]>Size[1])?Size[0]:Size[1];
                   12256:                if(Size>10)     dviout0(Size);
                   12257:        }else if(T<=3){
                   12258:                X=0;
                   12259:                if(Var=="pfrac") X=var(P);
                   12260:                else X=getopt(pfrac);
                   12261:                if(isvar(X)){
1.69      takayama 12262:                        if(Raw) return pfrac(P,X|TeX=1);
                   12263:                        pfrac(P,X|dviout=1);return;
1.6       takayama 12264:                }
1.69      takayama 12265:                Opt=getopt();
                   12266:                if(type(Var)!=2&&type(Var)!=4&&type(Var)!=7){
1.6       takayama 12267:                        if(isdif(P)!=0) Opt=cons(["var","dif"],Opt);
                   12268:                        else Opt=cons(["br",1],Opt);
                   12269:                }
1.69      takayama 12270:                if(!isfctr(P)){
                   12271:                        if(Raw) return my_tex_form(P);
                   12272:                        else{
                   12273:                                dviout(P); return;
                   12274:                        }
                   12275:                }
                   12276:                if(Raw) return fctrtos(P|option_list=cons(["TeX",3],Opt));
1.70      takayama 12277:                fctrtos(P|option_list=cons(["pages",2],cons(["dviout",1],Opt)));return;
1.6       takayama 12278:        }else if(T==4){
1.70      takayama 12279:                F=0;N=length(getopt());
                   12280:                if(Raw) N--;
                   12281:                if(N==1){
                   12282:                        if(type(Var=getopt(var))>1){
                   12283:                                if(isvar(Var)) Var=[0,Var];
1.71      takayama 12284:                                else if(type(Var)==4&&Var[0]!=0) Var=cons(0,Var);
1.70      takayama 12285:                                else Var=0;
                   12286:                        }else if(type(Var=getopt(eqs))!=4) Var=0;
                   12287:                }else if(N==0) Var=[];
                   12288:                else Var=0;
                   12289:                if(type(Var)==4){
                   12290:                        for(F=0,L=P;L!=[];L=cdr(L)){ /* */
                   12291:                                if(type(car(L))==2) F+=nmono(car(L));
                   12292:                                else{
                   12293:                                        F=0;break;
                   12294:                                }
                   12295:                        }
                   12296:                }
                   12297:                if(F>50){
                   12298:                        S=texbegin("align*",eqs2tex(P,Var));
                   12299:                        if(Raw) return S;
                   12300:                        dviout(S);return;
                   12301:                }
1.6       takayama 12302:                if(type(Var)==4 || type(Var)==7){
                   12303:                        S=ltotex(P|option_list=getopt());
                   12304:                        if(Var=="text"){
1.69      takayama 12305:                                if(Raw) return S;
                   12306:                                dviout(S);return;
1.6       takayama 12307:                        }
                   12308:                }else{
                   12309:                        for(F=0,L=P;L!=[] && F!=-1;L=cdr(L)){
                   12310:                                LL=car(L);
                   12311:                                if(type(LL)==4){
                   12312:                                        if(F==0){
                   12313:                                                T=type(LL[0]);
                   12314:                                                if(T==4)        F=2;                    /* [[[? */
                   12315:                                                else if(T==1 || T==0)   F=1;    /* [[num,.. */
                   12316:                                        }
                   12317:                                        if(F==1){
                   12318:                                                if(length(LL)!=2 || !isint(LL[0]) || LL[0]<0 || type(LL[1])>3)
                   12319:                                                        F=-1;                                   /* [[num,rat],[num,rat],...] */
                   12320:                                        }else if(F==2){
                   12321:                                                for(LLT=LL; LLT!=[] && F!=-1; LLT=cdr(LLT)){
                   12322:                                                        LLL=car(LLT);           /* [[[num,rat],[num,rat],...],[[..],..]],....] */
                   12323:                                                        if(length(LLL)!=2 || !isint(LLL[0]) || LLL[0]<0 || type(LLL[1])>3)
                   12324:                                                                F=-1;
                   12325:                                                }
                   12326:                                        }
                   12327:                                }else if((F==0 || F==7) && type(LL)==7){
                   12328:                                        F=7;
                   12329:                                }else F=-1;
                   12330:                        }
                   12331:                        if(F==1)        S=ltotex(P|opt="spt");
                   12332:                        else if(F==2){
                   12333:                                M=mtranspose(lv2m(S));
1.69      takayama 12334:                                if(Raw) return show(M|sp=1,raw=1);      /* GRS */
                   12335:                                show(M|sp=1);return;
1.6       takayama 12336:                        }else if(F==7)  S=ltotex(P|opt="spts");
                   12337:                        else{
                   12338:                                for(F=0,L=P;L!=[] && F!=-1;L=cdr(L)){
                   12339:                                        LL=car(L);
                   12340:                                        if(type(LL)!=4){
                   12341:                                                F=-1; break;
                   12342:                                        }
                   12343:                                        for(LLT=LL; LLT!=[] && F!=-1; LLT=cdr(LLT)){
                   12344:                                                T=type(LLL=car(LLT));
                   12345:                                                if(T<7 && T!=4) F0++;
                   12346:                                                else if(T==7){
                   12347:                                                        if(str_char(LLL,0,"\\")<0) F1++;
                   12348:                                                        else F2++;
                   12349:                                                }else F=-1;
                   12350:                                        }
                   12351:                                }
                   12352:                        }
                   12353:                        if(F==0 && F0>0 && (F1+F2)>0){  /* list of list of eq and str */
                   12354:                                if(F2>0)        S=ltotex(P|opt=["cr","spts0"],str=1);
                   12355:                                else    S=ltotex(P|opt=["cr","spts"]);
                   12356:                        }else{
                   12357:                                for(S="[";;){
                   12358:                                        S+=my_tex_form(car(P));
                   12359:                                        if((P=cdr(P))==[]){
                   12360:                                                S+="]";break;
                   12361:                                        }
                   12362:                                        S+=",";
                   12363:                                }
                   12364:                        }
                   12365:                }
                   12366:        }else if(T==7){
1.71      takayama 12367:                if(Var=="raw") S=P+"\n\n";
                   12368:                else if(Var != "eq" &&str_str(P,"\\begin"|end=128)<0){
                   12369:                        if((TikZ&&str_str(P,"\\draw"|end=128)>=0)||(!TikZ&&str_str(P,"\\ar@"|end=128)>=0))
                   12370:                                S=xyproc(P);
1.72      takayama 12371:                }else if(Var !="eq"){
                   12372:                        if(str_str(P,"\\begin{align")>=0 || str_str(P,"\\[")>=0
                   12373:                                || str_str(P,"\\begin{equation")>=0
                   12374:                                || (str_char(P,0,"^")<0 && str_char(P,0,"_")<0 && str_char(P,0,"&")<0))
                   12375:                                        S=P+"\n\n";
                   12376:                }
1.71      takayama 12377:                if(P!=S){
                   12378:                        if(Raw) return S;
                   12379:                        dviout(S); return;
1.6       takayama 12380:                }
                   12381:        }
1.69      takayama 12382:        if(Raw) return "\\begin{align}\\begin{split}\n &"+S+"\\end{split}\\end{align}";
                   12383:        else dviout(S|eq=5);
1.6       takayama 12384: }
                   12385:
                   12386:
                   12387: /* options : eq = 1 - 8, clear=1, keep=1, delete=1, title=s,
                   12388:                                                 fctr=1, begin=s  */
                   12389: def dviout(L)
                   12390: {
                   12391:        /* extern AMSTeX, TeXEq, DIROUT, DVIOUTA, DVIOUTB, DVIOUTL;     */
                   12392:
                   12393:        MyEq = [
                   12394:                ["\\[\n ","\\]"],
                   12395:                ["\\begin{align}\n","\\end{align}"],
                   12396:                ["\\begin{gather}\n ","\\end{gather}"],
                   12397:                ["\\begin{multline}\n ","\\\\[-15pt]\\end{multline}"],
                   12398:                ["\\begin{align}\\begin{split}\n &","\\end{split}\\end{align}"],
                   12399:                ["\\begin{align*}\n &","\\end{align*}"],
                   12400:                ["\\begin{gather*}\n ","\\end{gather*}"],
                   12401:                ["\\begin{equation}\n ","\\end{equation}"]
                   12402:        ];
                   12403:        if(!chkfun("print_tex_form", "names.rr"))
                   12404:                return 0;
                   12405:        Home=getenv("HOME");
                   12406:        if(type(Home)!=7) Home="";
                   12407:        Dir=str_subst(DIROUT,["%HOME%","%ASIRROOT%","\\"],[Home,get_rootdir(),"/"]);
                   12408:        Dirout=Dir+(AMSTeX?"/out.tex":"/out0.tex");
                   12409:        Risaout=(AMSTeX)?"risaout":"risaout0";
                   12410:        Dirisa=Dir+"/"+Risaout+".tex";
                   12411:        Viewer="dviout";
                   12412:        SV=["c:/w32tex/dviout","c:/dviout"];
                   12413:        Risatex=str_subst(AMSTeX?DVIOUTA:DVIOUTL,
                   12414:                        ["%HOME%","%ASIRROOT%","%TikZ%"],[Home,get_rootdir(),rtostr(TikZ)]);
                   12415:        if(isMs() && !access(Risatex)){
                   12416:                for(TV=SV; TV!=[]; TV=cdr(TV)){
                   12417:                        VV=car(TV)+"/dviout.exe";
                   12418:                        if(access(VV)){
                   12419:                                Viewer=str_subst(VV,"/","\\");
                   12420:                                break;
                   12421:                        }
                   12422:                }
                   12423:                output(Risatex);
                   12424:                print("cd \""+str_subst(Dir,"/","\\")+"\"");
                   12425:                print("latex -src=cr,display,hbox,math,par "+Risaout);
                   12426:                print("start "+Viewer+" -1 \""+Dr+"\\tex\\"+Risaout+"\" 1000");
                   12427:                output();
                   12428:        }
                   12429:        if(access(Dirisa) == 0){
                   12430:                D0="\""+(isMs()?str_subst(Dir,"/","\\")+"\"":Dir);
                   12431:                shell("mkdir "+D0);
                   12432:                output(Dirisa);
                   12433:                if(AMSTeX){
                   12434:                        print("\\documentclass[a4paper]{amsart}");
                   12435:                        print("\\usepackage{amsmath,amssymb,amsfonts}");
                   12436:                }else
                   12437:                        print("\\documentclass[a4paper]{article}");
                   12438:                print("\\pagestyle{empty}\n\\begin{document}\n\\thispagestyle{empty}");
                   12439:                print(AMSTeX?"\\input{out}\n\\end{document}":"\\input{out0}\n\\end{document}");
                   12440:                output();
                   12441:        }
                   12442:        if((K = getopt(delete)) >= 1){  /* delete */
                   12443:                LC = 0;
                   12444:                if(type(K) == 1 && K > 10) K = 10;
                   12445:                if(type(K) == 4){
                   12446:                        K = qsort(K);
                   12447:                        LC = 1; /* specific lines */
                   12448:                }
                   12449:                Done = 1;
                   12450:                Id  = open_file(Dirout);
                   12451:                if(Id >= 0){
                   12452:                        Buf = Buf0 = Buf1 = Key = "";
                   12453:                        PE  = 0;
                   12454:                        if(type(K) == 1)
                   12455:                                BufE = newvect(K--);
                   12456:                        Dout = Dirout+"0";
                   12457:                        remove_file(Dout);
                   12458:                        output(Dout);
                   12459:                        while((S = get_line(Id)) != 0){
                   12460:                                if(LC){
                   12461:                                        while(K != [] && car(K) < LC)
                   12462:                                                K = cdr(K);
                   12463:                                        if(K == [] || car(K) > LC)
                   12464:                                                output(S);
                   12465:                                }
                   12466:                                if(Key == ""){
                   12467:                                         if((P0 = str_str(S,"\\begin{")) == 0){
                   12468:                                                 Key = sub_str(S,7,str_str(S,"}")-1);
                   12469:                                                 if(findin(Key,["align", "gather","multline", "equation","align*"]) < 0)
                   12470:                                                         Key = "";
                   12471:                                                 else{
                   12472:                                                         Key = "\\end{"+Key+"}";
                   12473:                                                         if(!LC){
                   12474:                                                                 if(Buf != ""){
                   12475:                                                                         if(PE < K)
                   12476:                                                                                 BufE[PE++] = Buf1+Buf;
                   12477:                                                                         else{
                   12478:                                                                                 if(K > 0){
                   12479:                                                                                         print(BufE[0]);
                   12480:                                                                                         for(I = 1; I < K; I++)
                   12481:                                                                                                 BufE[I-1]=BufE[I];
                   12482:                                                                                         BufE[K-1] = Buf1+Buf;
                   12483:                                                                                 }else
                   12484:                                                                                         print(Buf1+Buf);
                   12485:                                                                                 Done = 0;
                   12486:                                                                         }
                   12487:                                                                         Buf1 = Buf0;
                   12488:                                                                         Buf = Buf0 ="";
                   12489:                                                                 }
                   12490:                                                         }
                   12491:                                                 }
                   12492:                                         }
                   12493:                                         if(Key == "" && !LC) Buf0 += S;
                   12494:                                }
                   12495:                                if(Key != ""){
                   12496:                                        if(!LC) Buf += S;
                   12497:                                        if(str_str(S,Key) >= 0){
                   12498:                                                Key = "";
                   12499:                                                if(LC) LC++;
                   12500:                                        }
                   12501:                                }
                   12502:                        }
                   12503:                        output();
                   12504:                        close_file(Id);
                   12505:                }
                   12506:                if(Done==0){
                   12507:                         Id = open_file(Dout);
                   12508:                         if(Id >= 0){
                   12509:                                 remove_file(Dirout);
                   12510:                                 output(Dirout);
                   12511:                                 while((S = get_line(Id)) != 0)
                   12512:                                         print(S,0);
                   12513:                                 output();
                   12514:                                 close_file(Id);
                   12515:                         }
                   12516:                         remove_file(Dout);
                   12517:                }else L=" ";
                   12518:        }
                   12519:        if(getopt(clear) == 1 || Done == 1){  /* clear */
                   12520:                remove_file(Dirout);
                   12521:                if(L == "" || L == " "){
                   12522:                        output(Dirout);
                   12523:                        print("\\centerline{Risa/Asir}");
                   12524:                        output();
                   12525:                }
                   12526:        }
                   12527:        if(L != " "){
                   12528:                Eq=1;
                   12529:                Eqo = getopt(eq);
                   12530:                Fc = getopt(fctr);
                   12531:                if(Fc == 1 && (type(L) == 2 || type(L) == 3)){
                   12532:                        L = fctrtos(L|TeX=1);
                   12533:                        if(type(L) == 4)
                   12534:                                L = "\\fact{"+L[0]+"}{"+L[1]+"}";
                   12535:                        if(type(Eqo) != 0 && type(Eqo) !=7){
                   12536:                                Eqo=0;
                   12537:                        }
                   12538:                }
                   12539:                if(type(L) != 4 || getopt(mult) != 1)
                   12540:                        L = [L];
                   12541:                if(type(Eqo)!=7 && (Eqo<1 || Eqo>8))
                   12542:                        Eqo = (AMSTeX==1)?TeXEq:1;
                   12543:                Title = getopt(title);
                   12544:                if(type(Title) == 7){
                   12545:                        output(Dirout);
                   12546:                        print(Title);
                   12547:                        output();
                   12548:                }
                   12549:                Sb = getopt(subst);
                   12550:                for( ; L != []; L = cdr(L)){
                   12551:                        Eq = 1;
                   12552:                        if(type(LT=car(L)) != 7 && type(LT) != 21)
                   12553:                                LT = my_tex_form(LT);
                   12554:                        else if(type(getopt(eq)) < 0)
                   12555:                                Eq = 0;
                   12556:                        if(type(Sb) == 4)
                   12557:                                LT = str_subst(LT,Sb[0],Sb[1]);
                   12558:                        output(Dirout);
                   12559:                        if(Eq == 1){
                   12560:                                if(type(Eqo)==7)
                   12561:                                        print(texbegin(Eqo,LT));
                   12562:                                else if(Eqo >= 1 && Eqo <= 8){
                   12563:                                        mycat0([MyEq[Eqo-1][0],LT,"%"],1);
                   12564:                                        print(MyEq[Eqo-1][1]);
                   12565:                                }else print(LT);
                   12566:                        }else print(LT);
                   12567:                        output();
                   12568:                }
                   12569:        }
                   12570:        if(str_char(Risatex,0," ")>=0 && str_char(DVIOUTA,0," ")<0 && str_char(DVIOUTB,0," ")<0
                   12571:         && str_char(DVIOUTL,0," ")<0)
                   12572:                Risatex="\""+Risatex+"\"";
                   12573:        if(getopt(keep) != 1) shell(Risatex);
                   12574:        return 1;
                   12575: }
                   12576:
                   12577: def rtotex(P)
                   12578: {
                   12579:        S = my_tex_form(P);
                   12580:        return (str_len(S) == 1)?S:"{"+S+"}";
                   12581: }
                   12582:
                   12583: def mtotex(M)
                   12584: {
                   12585:        /* extern TexLim;       */
                   12586:
                   12587:        MB=mat(["(",")","p"],["\\{","\\}","B"],["[","]","b"],["|","|","v"],
                   12588:                ["\\|","\\|","V"], [".",".",""]);
                   12589:        if(type(MT=getopt(mat))==7){
                   12590:                MT=findin(MT,["p","B","b","v","V",""]);
                   12591:                if(MT<0)        MT=0;
                   12592:        }
                   12593:        else MT=0;
                   12594:        MT=MB[MT];
                   12595:        if((F=getopt(small))!=1 && F!=2) F=0;
                   12596:        Lim=getopt(lim);
                   12597:        if(type(Lim)==1){
                   12598:                 if(Lim<30 && Lim!=0) Lim = TexLim;
                   12599:        }else Lim=0;
                   12600:        FL=getopt(len);
                   12601:        Rw=getopt(raw);
                   12602:        Sp=getopt(sp);
                   12603:        Idx=getopt(idx);
                   12604:        if(type(Idx)==4) Idx=ltov(Idx);
                   12605:        if(type(Idx)==6 && length(Idx)==0)      Idx=-1;
                   12606:        Var=getopt(var);
                   12607:        if(Lim>0) FL=1;
                   12608:        Null=getopt(null);
                   12609:        if(Null!=1 && Null!=2) Null=0;
                   12610:        if(type(M)==5) M=lv2m([V]);
                   12611:        else if(type(M)!=6) return monototex(M);
                   12612:        S=size(M);
                   12613:        if(FL==1){
                   12614:                L=newmat(S[0],S[1]);    LL=newvect(S[1]);
                   12615:        }
                   12616:        SS=newmat(S[0],S[1]);
                   12617:        for(I=0; I<S[0]; I++){
                   12618:                for(J=0; J<S[1]; J++){
                   12619:                        if(type(P=M[I][J])<=3){
                   12620:                                if(P!=0 || Null == 0 || (Null==2 && I==J)){
                   12621:                                        SS[I][J]=(type(Var)>1)?fctrtos(P|TeX=2,lim=0,var=Var):fctrtos(P|TeX=2,lim=0);
                   12622:                                        if(type(P)==1 && str_str(SS[I][J],"\\frac{-"|end=0)==0)
                   12623:                                                SS[I][J]="-\\frac{"+str_cut(SS[I][J],7,100000);
                   12624:                                }
                   12625:                        }else if(type(P)==6){
                   12626:                                ST= mtotex(P|small=1,len=1);
                   12627:                                SS[I][J]=ST[0];
                   12628:                                L[I][J]=ST[1];
                   12629:                        }else if(type(P)==7){
                   12630:                                if(Rw==1)       SS[I][J]=P;
                   12631:                                else            SS[I][J]="\\text{"+P+"\}";
                   12632:                        }else if(type(P)==4 && length(P)==2 && P[0]>0 && (Sp==1 || Sp==2)){
                   12633:                                if(P[0]==1){
                   12634:                                        SS[I][J]=fctrtos(P[1]|TeX=2,lim=0);
                   12635:                                }else{
                   12636:                                        ST=my_tex_form(P[0]);
                   12637:                                        if(Sp==2)       ST="("+ST+")";
                   12638:                                        SS[I][J]="["+fctrtos(P[1]|TeX=2,lim=0)+"]_";
                   12639:                                        if(str_len(ST)<2)       SS[I][J]+=ST;
                   12640:                                        else    SS[I][J]+="{"+ST+"}";
                   12641:                                }
                   12642:                        }else
                   12643:                                SS[I][J]=my_tex_form(P);
                   12644:                        if(FL==1) L[I][J]=texlen(SS[I][J]);
                   12645:                }
                   12646:        }
                   12647:        if(Lim>0 || FL==1){
                   12648:                for(LLL=J=0; J<S[1];J++){
                   12649:                        for(I=K=0; I<S[0];I++){
                   12650:                                if(K<L[I][J])   K=L[I][J];
                   12651:                        }
                   12652:                        LLL+=(LL[J]=K);
                   12653:                }
                   12654:        }
                   12655:        if(Lim>0){
                   12656:                if(F==2 && LLL>Lim-2*S[1]-2)    F=1;
                   12657:                if(F==1)
                   12658:                        Lim=idiv(Lim*6,5);
                   12659:                if(LLL<=Lim-(2-F)*S[I]-2)       Lim=0;
                   12660:        }
                   12661:        Mat=(F==1)?"smallmatrix}":"matrix}";
                   12662:        if(F==1)        Out=str_tb("\\left"+MT[0]+"\\begin{",0);
                   12663:        else            Out=str_tb((Lim==0)?"\\begin{"+MT[2]:"\\left"+MT[0]+"\\begin{",0);
                   12664:        Out = str_tb(Mat,Out);
                   12665:        for(I=II=LT=0; II<=S[0]; II++){
                   12666:                if(Lim==0) II=S[0];
                   12667:                if(II<S[0]){
                   12668:                        K=LL[II]+(2-F);
                   12669:                        if(I==II){
                   12670:                                LT+=K;
                   12671:                                continue;
                   12672:                        }
                   12673:                        if(LT+K<Lim-2)  continue;
                   12674:                        LT=K;
                   12675:                }
                   12676:                for(I0=I; I<II; I++){
                   12677:                        if(I==I0){
                   12678:                                str_tb((I==0)?
                   12679:                                  "\n ":
                   12680:                                  "\\right.\\\\\n \\allowdisplaybreaks\\\\\n &\\ \\left.\\begin{"+Mat+"\n ", Out);
                   12681:                                if(Idx==1||Idx==0||type(Idx)==5){
                   12682:                                        for(J=I; J<II; J++){
                   12683:                                                if(type(Idx)!=4)
                   12684:                                                        str_tb("("+rtostr(J+Idx)+")",Out);
                   12685:                                                else{
                   12686:                                                        JJ=length(Idx)-1;
                   12687:                                                        if(J<JJ) JJ=J;
                   12688:                                                        str_tb(my_tex_form(Idx[JJ]),Out);
                   12689:                                                }
                   12690:                                                if(J<II) str_tb(" & ",Out);
                   12691:                                        }
                   12692:                                        str_tb("\\\\\n ",Out);
                   12693:                                }
                   12694:                        }
                   12695:                        else str_tb("\\\\\n ",Out);
                   12696:                        for(J=0; J<S[1]; J++){
                   12697:                                if(J!=0) str_tb(" & ",Out);
                   12698:                                if(type(SS[I][J])==7)   str_tb(SS[I][J],Out);
                   12699:                        }
                   12700:                }
                   12701:                Out=str_tb("\n\\end{", Out);
                   12702:                if(II==S[0])    Out=str_tb((Lim==0&&F!=1)?MT[2]+Mat:Mat+"\\right"+MT[1],Out);
                   12703:                else                    Out=str_tb(Mat+"\\right.",Out);
                   12704:        }
                   12705:        SS = str_tb(0,Out);
                   12706:        if(FL!=1)       return SS;
                   12707:        if(F==1)        LLL=idiv((LLL+S[1])*5+13,6);
                   12708:        else LLL+=2*(1+S[1]);
                   12709:        return [SS,LLL];
                   12710: }
                   12711:
                   12712: def sint(N,P)
                   12713: {
1.11      takayama 12714:     if( type(N)==1 || N==0 ) {
1.6       takayama 12715:                NT=ntype(N);
                   12716:                if((type(Opt=getopt(str))==1 || Opt==0) && Opt>=0 && P>=0){
                   12717:                        if(Opt==2 || Opt==4 || Opt==0){
1.11      takayama 12718:                                if(N==0) return (Opt>0)?"0":0;
1.6       takayama 12719:                                Pw=0;
                   12720:                                if(NT==4){
                   12721:                                        NN=abs(real(N));N1=abs(imag(N));
                   12722:                                        if(NN<N1) NN=N1;
                   12723:                                }else NN=abs(N);
                   12724:                                while(NN<1 && NN>-1){
                   12725:                                        Pw--;
                   12726:                                        N*=10;NN*=10;
                   12727:                                }
                   12728:                                while(N>=10 || N<=-10){
                   12729:                                        Pw++;
                   12730:                                        N/=10;NN/=10;
                   12731:                                }
                   12732:                                if(Opt==0) return sint(N*10^Pw,P-Pw-1);
                   12733:                                S=(getopt(sqrt)==1)?sint(N,P|str=(Opt==4)?3:1,sqrt=1):sint(N,P|str=(Opt==4)?3:1);
                   12734:                                if(Pw==0) return S;
                   12735:                                if(NT==4)
                   12736:                                        S="("+S+")";
                   12737:                                if(Pw==1){
                   12738:                                        if(Opt==2)
                   12739:                                                return S+"*10";
                   12740:                                        else
                   12741:                                                return S+"\\times10";
                   12742:                                }
                   12743:                                if(Opt==2)
                   12744:                                        return S+"*10^("+rtostr(Pw)+")";
                   12745:                                else
                   12746:                                        return S+"\\times10^{"+rtostr(Pw)+"}";
                   12747:                        }
                   12748:                        if(NT==4){
                   12749:                                NN=real(N);
                   12750:                                if(NN!=0){
                   12751:                                        S=sint(NN,P|str=1);
                   12752:                                        if(imag(N)>0) S=S+"+";
                   12753:                                }
                   12754:                                else S="";
                   12755:                                S=S+sint(imag(N),P|str=1)+((Opt==3)?((getopt(sqrt)==1)?"\\sqrt{-1}":"i"):"@i");
                   12756:                                return S;
                   12757:                        }
                   12758:                        if(N<0){
                   12759:                                N=-N;
                   12760:                                Neg="-";
                   12761:                        }else Neg="";
1.11      takayama 12762:                        N=rint(N*10^P)/10^P;
1.6       takayama 12763:                        NN=floor(N);
1.11      takayama 12764:                        NV=(N-NN+1)*10^P;
1.6       takayama 12765:                        NS=rtostr(NN);
                   12766:                        if(P<=0) return Neg+NS;
                   12767:                        if(NN==0 && getopt(zero)==0) NS="";
1.11      takayama 12768:                        return Neg+NS+"."+str_cut(rtostr(NV),1,P);
1.6       takayama 12769:                }
                   12770:                if(NT==4)
                   12771:                        return sint(real(N),P)+sint(imag(N),P)*@i;
                   12772:         X = rint( N*10^P );
1.11      takayama 12773:         return deval(X/10^P);
1.6       takayama 12774:        }
                   12775:     if( (type(N)==2) || (type(N)==3) ){
                   12776:                NN = eval(N);
                   12777:                if( type(NN)==1 )
                   12778:                        return sint(NN,P|option_list=getopt());
                   12779:                else return N;
                   12780:        }
1.8       takayama 12781:     if( type(N)>3 && type(N) < 7)
1.6       takayama 12782: #ifdef USEMODULE
                   12783:         return mtransbys(os_md.sint,N,[P]|option_list=getopt());
                   12784: #else
                   12785:         return mtransbys(sint,N,[P]|option_list=getopt()));
                   12786: #endif
1.8       takayama 12787:        return N;
1.6       takayama 12788: }
                   12789:
                   12790: def frac2n(N)
                   12791: {
                   12792:        if((T=type(N))<0) return N;
                   12793:        E=(getopt(big)==1)?eval(@e):0.1;
                   12794:        if(T==1){
1.15      takayama 12795:                if(ntype(N)==0) return (E*N)/E;
1.6       takayama 12796:                else if(ntype(N)!=4) return N;
1.15      takayama 12797:                else return (E*(1+@i)*N)/(E*(1+@i));
1.6       takayama 12798:        }
                   12799:        if(T==3||T==2){
                   12800:                N=red(N);
                   12801:                Nm=nm(N);Var=vars(Nm);V=car(Var);K=length(Var);
                   12802:                for(S=0,I=mydeg(Nm,V);I>=0;I--) S+=frac2n(mycoef(Nm,I,V))*V^I;
                   12803:                return S/dn(N);
                   12804:        }
1.15      takayama 12805:        if(T<4) return (E*N)/E;
1.6       takayama 12806: #ifdef USEMODULE
                   12807:         return mtransbys(os_md.frac2n,N,[]|option_list=getopt());
                   12808: #else
                   12809:         return mtransbys(frac2n,N,[]|option_list=getopt());
                   12810: #endif
                   12811: }
                   12812:
1.71      takayama 12813: /* Option : opt */
1.70      takayama 12814: def ptconvex(L)
                   12815: {
1.71      takayama 12816:        if(!(isint(Opt=getopt(opt)))) Opt=0;
                   12817:        L0=car(L);X=L0[0];Y=L0[1];
1.70      takayama 12818:        for(TL=cdr(L);TL!=[];TL=cdr(TL)){       /* find the most left pt L0 */
1.71      takayama 12819:                if(X<car(TL)[0]||(X==car(TL)[0]&&Y<car(TL)[1])) continue;
1.70      takayama 12820:                L0=car(TL);X=car(L0);
                   12821:        }
1.71      takayama 12822:        if(Opt==3) return L0;
1.70      takayama 12823:
                   12824:        R=[];   /* find a polygone through all points */
                   12825:        X0=L0[0];Y0=L0[1];
                   12826:        for(TL=L;TL!=[];TL=cdr(TL)){
1.71      takayama 12827:                L0=car(TL);
                   12828:                X=L0[0]-X0;Y=L0[1]-Y0;S=X^2+Y^2;
                   12829:                L0=(!S)? append([-8,0],L0):append([(Y>0?Y^2:-Y^2)/S,S],L0);
                   12830:                R=cons(L0,R);
1.70      takayama 12831:        }
                   12832:        L=qsort(R);
                   12833:        if(Opt==2) return L;
                   12834:
1.71      takayama 12835:        for(R=[],TL=L;TL!=[];TL=cdr(TL)){
                   12836:                if(Opt==4){
                   12837:                        L0=car(TL);
                   12838:                        V=car(L0);
                   12839:                        L0=append(cdr(cdr(L0)),[V]);
                   12840:                }else L0=cdr(cdr(car(TL)));
                   12841:                R=cons(L0,R);
                   12842:        }
                   12843:        L=reverse(R);
                   12844:        if(Opt==1) return L;
                   12845:        R=[cons(V0=-8,L0=car(L))];
1.70      takayama 12846:        for(TL=cdr(L);TL!=[];TL=cdr(TL)){
1.71      takayama 12847:                V=darg(L0,L1=car(TL));
                   12848:                if(V<-4) continue;
1.70      takayama 12849:                while(V<V0){
                   12850:                        R=cdr(R);
1.71      takayama 12851:                        V0=car(car(R));
                   12852:                        V=darg(cdr(car(R)),L1);
1.70      takayama 12853:                }
                   12854:                if(V==V0) R=cdr(R);
1.71      takayama 12855:                R=cons(cons(V0=V,L0=L1),R);
1.70      takayama 12856:        }
1.71      takayama 12857:        for(L=[],TL=R;TL!=[];TL=cdr(TL)) L=cons(cdr(car(TL)),L);
1.70      takayama 12858:        return L;
                   12859: }
                   12860:
1.71      takayama 12861: def darg(P,Q)
                   12862: {
                   12863:        if(type(car(P))==4){
                   12864:                if((V=darg(Q[0],Q[1]))<-1) return -8;
                   12865:                if((V-=darg(P[0],P[1]))>2){
                   12866:                        if((V-=4)>4) return -4;
                   12867:                }else if(V<=-2) V+=4;
                   12868:                return V;
                   12869:        }
                   12870:        X=Q[0]-P[0];Y=Q[1]-P[1];
                   12871:        if(!(S=X^2+Y^2)) return -8;
                   12872:        V=Y^2/S;
                   12873:        if(Y<0) V=-V;
                   12874:        return X<=0?2-V:V;
                   12875: }
                   12876:
                   12877: def dwinding(P,Q)
                   12878: {
                   12879:        V=V0=V1=darg(P,Q0=car(Q));
                   12880:        Q=cons(Q0,reverse(Q));
                   12881:        for(Q=cdr(Q);Q!=[];Q=cdr(Q)){
                   12882:                if((V2=darg(P,car(Q)))<-4) return 1/3;
                   12883:                V1=V2-V1;
                   12884:                if(V1==2||V1==-2) return 1/2;
                   12885:                if(V1<-2) V1+=4;
                   12886:                else if(V1>2) V1-=4;
                   12887:                V+=V1;
                   12888:                V1=V2;
                   12889:        }
                   12890:        return floor((V0-V+1/2)/4);
                   12891: }
                   12892:
1.6       takayama 12893: def xyproc(F)
                   12894: {
                   12895:        if(type(Opt=getopt(opt))!=7) Opt="";
                   12896:        if(type(Env=getopt(env))!=7)
                   12897:                Env=(!TikZ)?"xy":"tikzpicture";
                   12898:        if(F==1)
                   12899:                return(Opt=="")?"\\begin{"+Env+"}\n":"\\begin{"+Env+"}["+Opt+"]\n";
                   12900:        if(F==0) return "\\end{"+Env+"}\n";
                   12901:        if(type(F)==7){
                   12902:                F=xyproc(1|opt=Opt,env=Env)+F+xyproc(0|env=Env);
                   12903:                if(getopt(dviout)==1) dviout(F);
                   12904:                else return F;
                   12905:        }
                   12906: }
                   12907:
                   12908: def xypos(P)
                   12909: {
                   12910:        if(type(P[0])==7){
                   12911:                if(P[0]=="") S="";
                   12912:                else S=(!TikZ)?"\""+P[0]+"\"":"("+P[0]+")";
                   12913:        }
                   12914:        else{
                   12915:                if(TikZ==0 && XYcm==1){
                   12916:                        X=sint(P[0]*10,XYPrec); Y=sint(P[1]*10,XYPrec);
                   12917:                }else{
                   12918:                        X=sint(P[0],XYPrec); Y=sint(P[1],XYPrec);
                   12919:                }
                   12920:                S="("+rtostr(X)+","+rtostr(Y)+")";
                   12921:        }
                   12922:        if(!TikZ){
                   12923:                if(length(P)>2 && (PP=P[2])!=""){
                   12924:                        S=S+" *";
                   12925:                        if(type(PP)==4 && length(PP)==2 && type(PP[0])==7){
                   12926:                                S=S+PP[0];
                   12927:                                PP=PP[1];
                   12928:                        }
                   12929:                        if(type(PP)==7){
                   12930:                                L=str_len(PP);
                   12931:                                if(str_chr(PP,0,"$")==0 && str_chr(PP,L-1,"$")==L-1){
                   12932:                                        PP=str_cut(PP,1,L-2);
                   12933:                                }else S+="\\txt";
                   12934:                        }
                   12935:                        else PP=my_tex_form(PP);
                   12936:                        S=S+"{"+PP+"}";
                   12937:                }
                   12938:                if(length(P)>3){
                   12939:                        if(type(P[3])==7 && P[3]!="") S=S+"=\""+P[3]+"\"";
                   12940:                        if(length(P)>4 && type(P[4])==7) S=S+P[4];
                   12941:                }
                   12942:        }else{
                   12943:                T="";
                   12944:                if(length(P)>2 && (PP=P[2])!=""){
                   12945:                        F=1;
                   12946:                        if(type(PP)==4){
                   12947:                                if(length(PP)==2 && type(PP[0])==7){
                   12948:                                        T="["+PP[0]+"]";
                   12949:                                        PP=PP[1];
                   12950:                                }
                   12951:                        }
                   12952:                        if(type(PP)!=7) PP="$"+my_tex_form(PP)+"$";
                   12953:                        S=S+"{"+PP+"}";
                   12954:                }else F=0;
                   12955:                if(length(P)>3){
                   12956:                        if(type(P[3])==7 && P[3]!="") T=T+"("+P[3]+")";
                   12957:                        else if(P[3]==1) T=T+"(_)";
                   12958:                        if(length(P)>4 && type(P[4])==7) S=S+P[4];
                   12959:                }
                   12960:                if(length(P)>2){
                   12961:                        if(F) S="node"+T+" at"+S;
                   12962:                        else  S="coordinate"+T+" at"+S;
                   12963:                }
                   12964:        }
                   12965:        return S;
                   12966: }
                   12967:
                   12968: def xyput(P)
                   12969: {
                   12970:        if((type(Sc=getopt(scale))==1 && Sc!=1) || type(Sc)==4){
                   12971:                if(type(Sc)==1) Sc=[Sc,Sc];
                   12972:                Sx=Sc[0];Sy=Sc[1];
                   12973:                if(length(P)>2)
                   12974:                        P1=cons(Sy*P[1],cdr(cdr(P)));
                   12975:                else P1=[Sy*P[1]];
                   12976:                P=cons((type(P[0])==7)?P[0]:(Sx*P[0]),P1);
                   12977:        }
                   12978:        if(!TikZ) return "{"+xypos(P)+"};\n";
                   12979:        return "\\"+xypos(P)+";\n";
                   12980: }
                   12981:
                   12982: def xyline(P,Q)
                   12983: {
                   12984:        if(!TikZ)       return "{"+xypos(P)+" \\ar@{-} "+xypos(Q)+"};\n";
                   12985:        if(type(T=getopt(opt))!=7) T="";
                   12986:        else T="["+T+"]";
                   12987:        if(length(P)<3 && length(Q)<3)
                   12988:                return "\\draw"+T+xypos(P)+"--"+xypos(Q)+";\n";
                   12989:        if(length(P)==2) P=[P[0],P[1],"","_0"];
                   12990:        else if(length(P)==3 || (length(P)==4 && P[3]==""))
                   12991:                P=[P[0],P[1],P[2],"_0"];
                   12992:        else if(length(P)>4 && P[3]=="")
                   12993:                P=[P[0],P[1],P[2],"_0",P[4]];
                   12994:        if(length(Q)==2) Q=[Q[0],Q[1],"","_1"];
                   12995:        else if(length(Q)==3 || (length(Q)==4 && Q[3]==""))
                   12996:                Q=[Q[0],Q[1],Q[2],"_1"];
                   12997:        else if(length(Q)>4 && Q[3]=="")
                   12998:                Q=[Q[0],Q[1],Q[2],"_1",Q[4]];
                   12999:        return "\\draw "+T+xypos(P)+" "+xypos(Q)+"("+P[3]+")--("+Q[3]+");\n";
                   13000: }
                   13001:
                   13002: def xylines(P)
                   13003: {
                   13004:        Lf=getopt(curve);
                   13005:        if(type(Lf)!=1) Lf=0;
                   13006:        SS=getopt(opt);
                   13007:        SF=(SS==0)?1:0;
                   13008:        if((Proc=getopt(proc))==1||Proc==2||Proc==3){
                   13009:                OL=cons(["opt",0],delopt(getopt(),["opt","proc"]));
                   13010:                R=xylines(P|option_list=OL);
                   13011:                OP=(type(SS)<0)?[]:((type(SS)==4)?[["opt",SS[0]],["cmd",SS[1]]]:[["opt",SS]]);
                   13012:                return [1,OP,R];
                   13013:        }
                   13014:        if(type(SS)!=7 && type(SS)!=4){
                   13015:                if(Lf==0 && !TikZ) SS="@{-}";
                   13016:                else SS="";
                   13017:        }
                   13018:        if(type(Sc=getopt(scale))==1 || type(Sc)==4){
                   13019:                if(type(Sc)==1) Sc=[Sc,Sc];
                   13020:                Sx=Sc[0];Sy=Sc[1];
                   13021:                if(Sx!=1 || Sy!=1){
                   13022:                        for(PP=[], P0=P; P0!=[]; P0=cdr(P0)){
                   13023:                                PT=car(P0);
                   13024:                                if((type(PT)!=4 && type(PT)!=5) || (type(PT[0])!=1 && PT[0]!=0))
                   13025:                                        PP=cons(PT,PP);
                   13026:                                else{
                   13027:                                        if(length(PT)>2 && type(PT)==4)
                   13028:                                                P1=cons(Sy*PT[1],cdr(cdr(PT)));
                   13029:                                        else P1=[Sy*PT[1]];
                   13030:                                        PP=cons(cons(Sx*PT[0],P1),PP);
                   13031:                                }
                   13032:                        }
                   13033:                        P=reverse(PP);
                   13034:                }
                   13035:        }
                   13036:        if(type(Cl=CL0=getopt(close))!=1) Cl=0;
                   13037:        if((Vb=getopt(verb))!=1&&type(Vb)!=4) Vb=0;
                   13038:        if(type(Lf)!=1 || Lf==0){       /* lines */
                   13039:                if(TikZ||SF){
                   13040:                        for(L=[],F=0,PT=P;PT!=[];PT=cdr(PT)){
                   13041:                                if(type(car(PT))<4){
                   13042:                                        L=cons(car(PT),L);
                   13043:                                        F=0;
                   13044:                                }else{
                   13045:                                        if(F++>1) L=cons(1,L);
                   13046:                                        L=cons(car(PT),L);
                   13047:                                }
                   13048:                        }
                   13049:                        if(Cl==1){
                   13050:                                L=cons(1,L);L=cons(-1,L);
                   13051:                        }
                   13052:                        if(L) L=reverse(L);
                   13053:                        if(SF) return L;
                   13054:                        if(type(SS)!=4) S=xybezier(L|opt=SS);
                   13055:                        else S=xybezier(L|opt=SS[0],cmd=SS[1]);
                   13056:
                   13057:                }else{
                   13058:                        Out = str_tb(0,0);
                   13059:                        for(PT=P; PT!=[]; ){
                   13060:                                PS1=car(PT);
                   13061:                                PT=cdr(PT);
                   13062:                                if(PT==[]){
                   13063:                                        if(Cl==1)       PS2=car(P);
                   13064:                                        else PS2=0;
                   13065:                                }else PS2=car(PT);
                   13066:                                str_tb(xyarrow(PS1,PS2|opt=SS),Out);
                   13067:                        }
                   13068:                        S=str_tb(0,Out);
                   13069:                }
                   13070:        }else if(Lf==2){        /* B-spline */
                   13071:                if(SF) return P;
                   13072:                if(!TikZ){
                   13073:                        Out = str_tb("{\\curve{",0);
                   13074:                        for(PT=P;PT!=[];PT=cdr(PT)){
                   13075:                                if(car(PT)==0){
                   13076:                                        str_tb("}};\n{\\curve{",Out);
                   13077:                                        continue;
                   13078:                                }
                   13079:                                if(PT!=P) str_tb("&",Out);
                   13080:                                str_tb(xypos([car(PT)[0],car(PT)[1]]),Out);
                   13081:                        }
                   13082:                        str_tb("}};\n",Out);
                   13083:                        S=str_tb(0,Out);
                   13084:                }else Out=str_tb(xybezier(P|opt=SS),0);
                   13085:                for(I=0;I<2;I++){
                   13086:                        Q=car(P);
                   13087:                        if(length(Q)>2)
                   13088:                                str_tb(xyput(Q),Out);
                   13089:                        P=reverse(P);
                   13090:                }
                   13091:                S=str_tb(0,Out);
                   13092:        }else{          /* extended Bezier */
                   13093:                RTo=getopt(ratio);
                   13094:                if(type(Acc=getopt(Acc))!=1) Acc=0;
                   13095:                if(type(RTo)!=1 || RTo>1.5 || RTo<0.001) RTo=0;
                   13096:                if(Cl==1){
                   13097:                        PR=reverse(P);
                   13098:                        PT=car(PR);
                   13099:                        PR=cons(P[0],PR);
                   13100:                        PR=cons(P[1],PR);
                   13101:                        P=cons(PT,reverse(PR));
                   13102:                }else if(Cl==-1) Cl=1;
                   13103:                for(L=P2=P3=0,PT=P;;){
                   13104:                        P1=P2;P2=P3;P3=P4;
                   13105:                        P4=(PT==[])?0:car(PT);
                   13106:                        if(PT==[] && (Cl==1 || P3==0)) break;
                   13107:                        PT=cdr(PT);
                   13108:                        if(P3==0)       str_tb("%\n", Out);
                   13109:                        if(P2==0 || P3==0 || (Cl==1 && P1==0)) continue;
                   13110:                        if(L!=0){
                   13111:                                if(car(L)==P2)
                   13112:                                        L=cons(1,L);
                   13113:                                else{
                   13114:                                        L=cons(0,L); L=cons(P2,L);
                   13115:                                }
                   13116:                        }else L=[P2];
                   13117:                        X=P3[0]-P2[0];Y=P3[1]-P2[1];
                   13118:                        DL1=DL2=0;DL=Acc?sqrt(X^2+Y^2):dsqrt(X^2+Y^2);
                   13119:                        if(P4!=0){
                   13120:                                XD1=P4[0]-P2[0];YD1=P4[1]-P2[1];DL1=Acc?sqrt(XD1^2+YD1^2):dsqrt(XD1^2+YD1^2);
                   13121:                        }
                   13122:                        if(P1!=0){
                   13123:                                XD2=P3[0]-P1[0];YD2=P3[1]-P1[1];DL2=Acc?sqrt(XD2^2+YD2^2):dsqrt(XD2^2+YD2^2);
                   13124:                        }
                   13125:                        if(RTo!=0)
                   13126:                                R=RTo;
                   13127:                        else if(DL1>0 && DL2>0){
                   13128:                                Cos=(XD1*XD2+YD1*YD2)/(DL1*DL2);
                   13129:                                RT=4/(3*(Acc?sqrt((1+Cos)/2):dsqrt((1+Cos)/2))+3);
                   13130:                                R=DL*RT/(DL1+DL2);
                   13131:                        }else if(DL1!=0)
                   13132:                                R=DL/(2*DL1);
                   13133:                        else if(DL2!=0)
                   13134:                                R=DL/(2*DL2);
                   13135:                        if(DL2!=0)      L=cons([P2[0]+R*XD2,P2[1]+R*YD2],L);
                   13136:                        if(DL1!=0)      L=cons([P3[0]-R*XD1,P3[1]-R*YD1],L);
                   13137:                        L=cons([P3[0],P3[1]],L);
                   13138:                }
                   13139:                if(CL0==1) L=cons(-1,cdr(L));
                   13140:                if(L!=0) L=reverse(L);
                   13141:                if(SF) return L;
                   13142:                if(type(SS)==4)
                   13143:                        S=xybezier(L|opt=SS[0],cmd=SS[1],verb=Vb);
                   13144:                else
                   13145:                        S=xybezier(L|opt=SS,verb=Vb);
                   13146:        }
                   13147:        if(getopt(dviout)!=1) return S;
                   13148:        xyproc(S|dviout=1);
                   13149: }
                   13150:
                   13151: def saveproc(S,Out)
                   13152: {
                   13153:        if(type(Out)==4){
                   13154:                Out=cons(S,Out);
                   13155:                return Out;
                   13156:        }else{
                   13157:                str_tb(S,Out);
                   13158:                return Out;
                   13159:        }
                   13160: }
                   13161:
1.18      takayama 13162: def xygrid(X,Y)
                   13163: {
                   13164:        for(RR=[],I=0,Z=X;I<2;I++){
1.19      takayama 13165:                U=Z[2];L=LL=[];M=Z[3];
                   13166:                if(Z[1]==1||Z[1]==-1){
1.18      takayama 13167:                        if(type(M)==4) L=M;
                   13168:                        else{
1.19      takayama 13169:                                if(U*(-dlog(1-1/20)/dlog(10))>=M){
1.18      takayama 13170:                                        L=cons([1,2,1/10],L);
1.19      takayama 13171:                                        LL=cons([1,2,1/2],LL);
                   13172:                                }else if(U*(-dlog(1-1/10)/dlog(10))>=M)
1.18      takayama 13173:                                        L=cons([1,2,1/5],L);
                   13174:                                else if(U*(-dlog(1-1/4)/dlog(10))>=M)
                   13175:                                        L=cons([1,2,1/2],L);
1.19      takayama 13176:                                if(U*(-dlog(1-1/50)/dlog(10))>=M){
1.18      takayama 13177:                                        L=cons([2,5,1/10],L);
1.19      takayama 13178:                                        LL=cons([2,5,1/2],LL);
                   13179:                                }else if(U*(-dlog(1-1/25)/dlog(10))>=M)
1.18      takayama 13180:                                        L=cons([2,5,1/5],L);
                   13181:                                else if(U*(-dlog(1-1/10)/dlog(10))>=M)
                   13182:                                        L=cons([2,5,1/2],L);
1.19      takayama 13183:                                if(U*(-dlog(1-1/100)/dlog(10))>=M){
1.18      takayama 13184:                                        L=cons([5,10,1/10],L);
1.19      takayama 13185:                                        LL=cons([5,10,1/2],LL);
                   13186:                                }
1.18      takayama 13187:                                else if(U*(-dlog(1-1/50)/dlog(10))>=M)
                   13188:                                        L=cons([5,10,1/5],L);
                   13189:                                else if(U*(-dlog(1-1/20)/dlog(10))>=M)
                   13190:                                        L=cons([5,10,1/2],L);
1.19      takayama 13191:                                L=cons(L,cons(LL,[[[1,10,1]]]));
1.18      takayama 13192:                        }
                   13193:                        R=scale(L|scale=U);
1.19      takayama 13194:                        if(Z[1]==-1){
                   13195:                                for(LL=[];R!=[];R=cdr(R)){
                   13196:                                        for(L=[],T=car(R);T!=[];T=cdr(T)) L=cons(U-car(T),L);
                   13197:                                        LL=cons(reverse(L),LL);
                   13198:                                }
                   13199:                                R=reverse(LL);
                   13200:                        }
1.18      takayama 13201:                }else if(Z[1]==0){
                   13202:                        if(type(M)==4){
                   13203:                                R=scale(M|f=x,scale=U);
                   13204:                        }else{
                   13205:                                V=0;
                   13206:                                if(U/10>=M) V=1/10;
                   13207:                                else if(U/5>=M) V=1/5;
                   13208:                                else if(U/2>=M) V=1/2;
                   13209:                                R=[];
                   13210:                                if(V>0){
                   13211:                                        UU=U*V;
                   13212:                                        for(R=[],J=UU;J<U;J+=UU) R=cons(J,R);
                   13213:                                }
1.19      takayama 13214:                                if(V==1/10) L=[U/2];
                   13215:                                else L=[];
                   13216:                                R=cons(R,cons(L,[[0,U]]));
1.18      takayama 13217:                        }
                   13218:                }else if(type(Z[1])==4){
                   13219:                        R=Z[1];
1.19      takayama 13220:                        if(length(R)==0||type(R[0])!=4) R=[[],[],R];
1.18      takayama 13221:                }else return 0;
1.19      takayama 13222:                K=length(R);
                   13223:                S=newvect(K);
                   13224:                for(J=0;J<K;J++){
                   13225:                        for(S[J]=[],JJ=0;JJ<=Z[0];JJ+=U){
                   13226:                                for(P=R[J];P!=[];P=cdr(P))
                   13227:                                        if(car(P)+JJ<=Z[0]) S[J]=cons(car(P)+JJ,S[J]);
                   13228:                        }
                   13229:                }
                   13230:                for(J=0;J<K;J++) S[J]=lsort(S[J],[],1);
                   13231:                for(U=[],J=K-1;J>0;J--){
                   13232:                        U=lsort(S[J],U,0);S[J-1]=lsort(S[J-1],U,1);
1.18      takayama 13233:                }
1.19      takayama 13234:                RR=cons(vtol(S),RR);
1.18      takayama 13235:                Z=Y;
                   13236:        }
                   13237:        if((Raw=getopt(raw))==1) return RR;
                   13238:        SS=[];
                   13239:        if(type(Sf=getopt(shift))==7){
                   13240:                Sx=Sf[0];Sy=Sf[1];
                   13241:        }else Sx=Sy=0;
                   13242:        for(I=0;I<2;I++){
                   13243:                for(S0=[],L=RR[I];L!=[];L=cdr(L)){
                   13244:                        for(S=[],T=car(L);T!=[];T=cdr(T)){
                   13245:                                if(S!=[]) S=cons(0,S);
                   13246:                                if(I==0){
                   13247:                                        S=cons([X[0]+Sx,car(T)+Sy],S);
                   13248:                                        S=cons([Sx,car(T)+Sy],S);
                   13249:                                }else{
                   13250:                                        S=cons([car(T)+Sx,Y[0]+Sy],S);
                   13251:                                        S=cons([car(T)+Sx,Sy],S);
                   13252:                                }
                   13253:                        }
                   13254:                        S0=cons(S,S0);
                   13255:                }
                   13256:                SS=cons(reverse(S0),SS);
                   13257:        }
                   13258:        SS=reverse(SS);
                   13259:        if(Raw==2) return SS;
                   13260:        if(length(Y)<5) T=[["",""]];
                   13261:        else if(type(Y[4])==4) T=[Y[4]];
                   13262:        else T=[Y[4],Y[4]];
                   13263:        if(length(X[4])==4) T=cons([""],T);
                   13264:        else if(type(X[4])==4) T=cons(X[4],T);
                   13265:        else T=cons([X[4]],T);
                   13266:        for(Sx=Sy=[],I=0;I<2;I++){
                   13267:                TT=T[I];
                   13268:                for(V=SS[I];V!=[];V=cdr(V)){
                   13269:                        Op=car(TT);
                   13270:                        if(length(TT)>1) TT=cdr(TT);
                   13271:                        if(car(V)==[]) continue;
                   13272:                        if(Op=="") S=xylines(car(V));
                   13273:                        else S=xylines(car(V)|opt=Op);
                   13274:                        if(I==0) Sx=cons(S,Sx);
                   13275:                        else Sy=cons(S,Sy);
                   13276:                }
                   13277:        }
                   13278:        for(S="",Sx=reverse(Sx), Sy=reverse(Sy);Sx!=[]&&Sy!=[];){
                   13279:                if(Sx!=[]){
                   13280:                        S+=car(Sx);Sx=cdr(Sx);
                   13281:                }
                   13282:                if(Sy!=[]){
                   13283:                        S+=car(Sy);Sy=cdr(Sy);
                   13284:                }
                   13285:        }
                   13286:        return S;
                   13287: }
                   13288:
                   13289:
1.22      takayama 13290: def addIL(I,L)
1.18      takayama 13291: {
1.22      takayama 13292:        if(I==0){
                   13293:                for(R=[];L!=[];L=cdr(L)) R=addIL(car(L),R);
                   13294:                return reverse(R);
1.18      takayama 13295:        }
1.22      takayama 13296:        if(type(In=getopt(in))==1){
                   13297:                if(In==-1){
                   13298:                        J=JJ=I[1];I=I[0];
                   13299:                        for(R=[];L!=[];L=cdr(L)){
                   13300:                                J=lmin([car(L)[0],JJ]);
                   13301:                                if(J>I) R=cons([I,J],R);
                   13302:                                I=lmax([car(L)[1],I]);
                   13303:                        }
                   13304:                        if(I<JJ) R=cons([I,JJ],R);
                   13305:                        return reverse(R);
                   13306:                }else{
                   13307:                        for(;L!=[];L=cdr(L)){
                   13308:                                if(car(L)[0]>I) return 0;
                   13309:                                if(car(L)[1]>=I){
                   13310:                                        if(In==3) return car(L);
                   13311:                                        if(In==1||(I!=car(L)[0]&&I!=car(L)[1])) return 1;
                   13312:                                        return 2;
                   13313:                                }
                   13314:                        }
                   13315:                        return 0;
                   13316:                }
                   13317:        }
                   13318:        I0=car(I);I1=I[1];
                   13319:        for(F=0,R=[];L!=[];L=cdr(L)){
                   13320:                if(I0>car(L)[1]){
                   13321:                        R=cons(car(L),R);
                   13322:                        continue;
                   13323:                }
                   13324:                if(I0<=car(L)[1]){
                   13325:                        I0=lmin([I0,car(L)[0]]);
                   13326:                        if(I1<car(L)[0]){
                   13327:                                R=cons([I0,I1],R);
                   13328:                                for( ;L!=[];L=cdr(L)) R=cons(car(L),R);
                   13329:                                F=1;
                   13330:                                break;
                   13331:                        }
                   13332:                        I1=lmax([I1,car(L)[1]]);
                   13333:                }
                   13334:        }
                   13335:        if(!F) R=cons([I0,I1],R);
                   13336:        return reverse(R);
1.18      takayama 13337: }
                   13338:
                   13339: def xy2curve(F,N,Lx,Ly,Lz,A,B)
                   13340: {
1.22      takayama 13341:        Raw=getopt(raw);
                   13342:        if(type(Gap=getopt(gap))==4){
                   13343:                MG=Gap[1];Gap=car(Gap);
                   13344:        }else MG=3;
                   13345:        if(type(Gap)!=1 && Gap!=0) Gap=0.7;
                   13346:        if(type(Dvi=getopt(dviout))<1) Dvi=0;
                   13347:        OL=[["dviout",Dvi]];
                   13348:        if(type(Opt=getopt(opt))<1) Opt=0;
                   13349:        else OL=cons(["opt",Opt],OL);
                   13350:        if(type(Sc=getopt(scale))!=1 && type(Sc)!=4) Sc=[1,1,1];
                   13351:        else if(type(Sc)!=4) Sc=[Sc,Sc,Sc];
                   13352:        else if(length(Sc)!=3) Sc=[Sc[0],Sc[1],Sc[1]];
                   13353:        M=diagm(3,Sc);
                   13354:        if(A!=0||B!=0){
                   13355:                if(type(A)==6) M=A;
                   13356:                else M=mrot([0,-B,-A]|deg=1)*M;
                   13357:                V=M*newvect(3,[x,y,z]);
                   13358:                Fx=compdf(V[0],[x,y,z],F);Fy=compdf(V[1],[x,y,z],F);Fz=compdf(V[2],[x,y,z],F);
                   13359:        }else{
                   13360:                for(I=0;I<3;I++){
                   13361:                        if(type(T=F[I])!=4) T=f2df(T);
                   13362:                        if(type(T)==4) T=cons(car(T)*Sc[I],cdr(T));
                   13363:                        else T*=Sc[I];
                   13364:                        if(I==0) Fx=T;
                   13365:                        else if(I==1) Fy=T;
                   13366:                        else Fz=T;
                   13367:                }
                   13368:        }
                   13369:        if(Raw==5||!Gap)
                   13370:                return (Dvi||!Gap)? xygraph([Fy,Fz],N,Lx,Ly,Lz|option_list=OL):[Fx,Fy,Fz];
1.18      takayama 13371:        R=xygraph([Fy,Fz],N,Lx,Ly,Lz|raw=2);
1.22      takayama 13372:        R0=cdr(car(R));R1=R[1];
                   13373:        for(LT=[];R0!=[];R0=cdr(R0),R1=cdr(R1))
                   13374:                if(car(R0)!=0) LT=cons([R1[0],R1[1]],LT);
                   13375:        LT=reverse(LT);
1.19      takayama 13376:        if(N<0){
                   13377:                Be=xylines(car(R)|curve=1,proc=3,close=-1);
                   13378:                LT=reverse(cdr(LT));
                   13379:                LT=reverse(cdr(LT));
                   13380:        }
                   13381:        else Be=xylines(car(R)|curve=1,proc=3);
1.18      takayama 13382:        Be=cdr(cdr(Be));
1.22      takayama 13383:        Be=lbezier(car(Be));
                   13384:        if(Raw==4) return [Be,LT,Lx];
                   13385:        X=ptcombz(Be,0,0);
                   13386:        Var=(length(Lx)==3)?car(Lx):x;
                   13387:        if(type(Eq=getopt(eq))!=1) Eq=0.01;
                   13388:        if(TikZ==1){
                   13389:                Gap/=10;Eq/=10;
1.18      takayama 13390:        }
                   13391:        for(R=[],XT=X;XT!=[];XT=cdr(XT)){
                   13392:                V=car(XT);
1.22      takayama 13393:                U=LT[V[0][0]];
                   13394:                T=U[0]*V[1][0]+U[1]*(1-V[1][0]);
                   13395:                VV=myfdeval(Fx,[Var,T]);
                   13396:                U=LT[V[0][1]];
1.18      takayama 13397:                T=U[0]*V[1][1]+U[1]*(1-V[1][1]);
1.22      takayama 13398:                VV-=myfdeval(Fx,[Var,T]);
                   13399:                if(abs(VV)<Eq) continue;
                   13400:                I=(VV<0)?0:1;
                   13401:                R=cons([V[0][I],V[1][I],V[0][1-I],V[1][1-I]],R);
1.18      takayama 13402:        }
                   13403:        R=qsort(R);
1.22      takayama 13404:        if(Raw==3) return [Be,R];
                   13405:     Db=newvect(L=length(Be));
                   13406:        for(I=0;I<L;I++) Db[I]=[];
                   13407:        for(TR=R;TR!=[];TR=cdr(TR)){
                   13408:        V1=ptbezier(Be,[I=car(TR)[0],P=car(TR)[1]])[1];
                   13409:                V2=ptbezier(Be,[car(TR)[2],car(TR)[3]])[1];
                   13410:                T=dsqrt(1-dvangle(V1,V2)^2);
                   13411:                if(T<1/MG) T=MG;
                   13412:                GP=Gap/T;
                   13413:                W=GP/dnorm(V1);
                   13414:                Db[I]=addIL([P-W,P+W],Db[I]);
                   13415:                if(P-W<0 && I>0) Db[I-1]=addIL([P-W+1,1],Db[I-1]);
                   13416:                if(P+W>1 && I+1<L) Db[I+1]=addIL([0,P+W-1],Db[I+1]);
                   13417:        }
                   13418:        Db=vtol(Db);
                   13419:        for(Bf=[];Be!=[];Be=cdr(Be),Db=cdr(Db)){
                   13420:                if(car(Db)==[]) Bf=cons(car(Be),Bf);
                   13421:                else{
                   13422:                        D=addIL([0,1],car(Db)|in=-1);
                   13423:                        for(;D!=[];D=cdr(D))
                   13424:                                Bf=cons(tobezier(car(Be)|inv=car(D)),Bf);
                   13425:                }
                   13426:        }
                   13427:        Bf=reverse(Bf);
                   13428:        if(Raw==2) return Bf;
                   13429:        OL=[];
                   13430:        if(Opt){
                   13431:                if(type(Opt)==4&&length(Opt)>1) OL=[["opt",Opt[0]],["cmd",Opt[1]]];
                   13432:                else OL=[["opt",Opt]];
                   13433:        }else OL=[];
                   13434:        S=xybezier(lbezier(Bf|inv=1)|option_list=OL);
                   13435:        if(Raw==1||!Dvi) return S;
                   13436:        return xyproc(S|dviout=Dvi);
                   13437: }
                   13438:
                   13439: def rungeKutta(F,N,Lx,Y,IY)
                   13440: {
                   13441:        if((Pr=getopt(prec))==1){
                   13442:                One=eval(exp(0));
                   13443:        }else{
1.58      takayama 13444:                One=deval(exp(0));Pr=0;
1.22      takayama 13445:        }
1.57      takayama 13446:        if(!isint(FL=getopt(mul))||!FL) FL=1;
1.22      takayama 13447:        if(length(Lx)>2){
                   13448:                V=car(Lx);Lx=cdr(Lx);
                   13449:        }else V=x;
1.58      takayama 13450:        if(Pr==1) Lx=[eval(Lx[0]),eval(Lx[1])];
                   13451:        else Lx=[deval(Lx[0]),deval(Lx[1])];
1.22      takayama 13452:        if(type(Y)==4){
                   13453:                if((Sing=getopt(single))==1||type(F)!=4)
                   13454:                        F=append(cdr(Y),[F]);
                   13455:                L=length(Y);
                   13456:                for(TF=[];F!=[];F=cdr(F))
                   13457:                        TF=cons(f2df(car(F)),TF);
                   13458:                F=reverse(TF);
                   13459:        }else{
                   13460:                L=1;
                   13461:                F=f2df(F);
                   13462:        }
                   13463:        if(getopt(val)==1) V1=1;
                   13464:        else V1=0;
1.57      takayama 13465:        if(FL>0) N*=FL;
1.58      takayama 13466:        H=(Lx[1]-Lx[0])/N*One;H2=H/2;
1.22      takayama 13467:        FV=findin(V,vars(F));
                   13468:        K=newvect(4);
                   13469:        if(L==1){
                   13470:                R=[[T=Lx[0],S=IY]];
                   13471:                if(!H) return R;
1.57      takayama 13472:                for(C=0;C<N;C++){
1.22      takayama 13473:                        for(I=0;I<4;I++){
                   13474:                                if(I==0)      W=[[V,T],[Y,S]];
                   13475:                                else if(I==3) W=[[V,T+H],[Y,S+H*K[2]]];
                   13476:                                else          W=[[V,T+H2],[Y,S+H2*K[I-1]]];
                   13477:                                if(FV<0) W=cdr(W);
                   13478:                                K[I]=Pr?myfeval(F,W)*One:myfdeval(F,W);
                   13479:                        }
                   13480:                        S+=(K[0]+2*K[1]+2*K[2]+K[3])*H/6;T+=H;
1.57      takayama 13481:                        if(FL>0&&!((C+1)%FL)) R=cons([deval(T),S],R);
1.22      takayama 13482:                }
                   13483:        }else{
                   13484:                T=Lx[0];
                   13485:                R=[cons(T,V1?[car(IY)]:IY)];
                   13486:                S=ltov(IY);
                   13487:                if(!H) return R;
1.57      takayama 13488:                for(C=0;C<N;C++){
1.22      takayama 13489:                        for(I=0;I<4;I++){
                   13490:                                if(I==0)      W=cons([V,T   ],lpair(Y,vtol(S)));
                   13491:                                else if(I==3) W=cons([V,T+H ],lpair(Y,vtol(S+H*K[2])));
                   13492:                                else          W=cons([V,T+H2],lpair(Y,vtol(S+H2*K[I-1])));
                   13493:                                if(FV<0) W=cdr(W);
                   13494:                                for(TK=[],TF=F;TF!=[];TF=cdr(TF)){
                   13495:                                        TK=cons(Pr?myfeval(car(TF),W)*One:myfdeval(car(TF),W),TK);
                   13496:                                }
                   13497:                                K[I]=ltov(reverse(TK));
                   13498:                        }
                   13499:                        S+=(K[0]+2*K[1]+2*K[2]+K[3])*H/6;T+=H;
                   13500:                        TS=vtol(S);
1.58      takayama 13501:                        if(FL<0||(C+1)%FL) continue;
1.22      takayama 13502:                        if(V1) TS=[car(TS)];
1.58      takayama 13503:                        R=cons(cons(deval(T),TS),R);
1.22      takayama 13504:                }
                   13505:        }
1.58      takayama 13506:        L=(FL<0)?(V1?S[0]:S):reverse(R);
                   13507:        return L;
1.57      takayama 13508: }
                   13509:
                   13510: def pwTaylor(F,N,Lx,Y,Ly,M)
                   13511: {
1.68      takayama 13512:        /* Pr:bigfloat, V1:last, Sf: single, Tf: autonomous,  */
1.58      takayama 13513:        if(!isint(FL=getopt(mul))||!FL) FL=1;
                   13514:        if(getopt(val)==1) V1=1;
                   13515:        else V1=0;
1.59      takayama 13516:        if(length(Lx)>2){
                   13517:                V=car(Lx);Lx=cdr(Lx);
                   13518:        }else V=t;
                   13519:        if(!isvar(T=getopt(var))) V=t;
                   13520:        if(isint(Pr=getopt(prec))&&Pr>0){
                   13521:                One=eval(exp(0));
                   13522:                if(Pr>9){
                   13523:                        setprec(Pr);
                   13524:                        ctrl("bigfloat",1);
                   13525:                }
                   13526:                Pr=1;
                   13527:        }else{
                   13528:                One=deval(exp(0));Pr=0;
                   13529:        }
                   13530:        if(Pr==1) Lx=[eval(Lx[0]),eval(Lx[1])];
                   13531:        else Lx=[deval(Lx[0]),deval(Lx[1])];
1.68      takayama 13532:        Sf=(type(F)!=4)?1:0;
1.59      takayama 13533:        if(type(Y)==4){
                   13534:                if(type(F)!=4)  F=append(cdr(Y),[F]);
                   13535:        }else Y=[Y];
                   13536:        if(type(Ly)!=4) Ly=[Ly];
1.68      takayama 13537:        if(findin(V,vars(F))>=0){
                   13538:                if(type(F)!=4) F=[F];
                   13539:                Tf=1;F=cons(1,subst(F,V,z_z));Y=cons(z_z,Y);Ly=cons(car(Lx),Ly);
                   13540:        }else Tf=0;                                                     /* Tf: autonomous */
1.60      takayama 13541:        ErF=0;
1.59      takayama 13542:        if(type(Er=getopt(err))==4){
1.61      takayama 13543:                if(length(Er)==2) ErF=Er[1];    /* ErF&1: Raw,  ErF&2: relative,  ErF&4: add Sol */
1.60      takayama 13544:                Er=car(Er);
                   13545:        };
                   13546:        if(!isint(Er)||Er<0) Er=0;      /* 基準解を返す */
1.59      takayama 13547:        if(FL>0) N*=FL;
                   13548:        S=vtol(pTaylor(F,Y,M|time=V));
                   13549:        FM=pmaj(F|var=x);
                   13550:        LS=length(S);
                   13551:
                   13552:        if(type(Vw=getopt(view))==4){   /* Dislay on Canvas */
1.61      takayama 13553:                Glib_math_coordinate=1;
1.68      takayama 13554:                glib_window(car(Vw)[0], car(Vw)[2],car(Vw)[1],car(Vw)[3]);
1.67      takayama 13555:                if(length(car(Vw))==6) Vr=[car(Vw)[4],car(Vw)[5]];
                   13556:                else Vr=0;
1.66      takayama 13557:                if(length(Vw)>1){
                   13558:                        if(type(Cl=Vw[1])==4) Cl=map(os_md.trcolor,Cl);
                   13559:                        else Cl=trcolor(Cl);
                   13560:                }else Cl=0;
1.59      takayama 13561:                if(length(Vw)>2){
                   13562:                        Mt=Vw[2];
                   13563:                        if(LS==1){
                   13564:                                if(type(Mt)>1) Mt=0;
                   13565:                        }else{
1.68      takayama 13566:                                if(type(Mt)!=6||((Ms=size(Mt)[0])!=2&&Ms!=3)) Mt=0;
                   13567:                                if(Ms!=3) Vr=0;
1.59      takayama 13568:                        }
1.68      takayama 13569:                        if(Tf&&type(Mt)==6) Mt=newbmat(2,2,[[1,0],[0,Mt]]);
1.59      takayama 13570:                }else Mt=0;
                   13571:                if(!Mt){
1.68      takayama 13572:                        if(LS>1+Tf){
1.67      takayama 13573:                                if(Vr){
1.68      takayama 13574:                                        Mt=newmat(3,LS);Mt[2+Tf][2+Tf]=1;
1.67      takayama 13575:                                }
                   13576:                                else Mt=newmat(2,LS);
1.68      takayama 13577:                                Mt[Tf][Tf]=Mt[Tf+1][Tf+1]=1;
1.59      takayama 13578:                        }else Mt=1;
1.68      takayama 13579:                        if(LS==1+Tf||Sf) glib_putpixel(Lx[0],Mt*Ly[Tf]|color=mcolor(Cl,0));
1.59      takayama 13580:                        else{
1.67      takayama 13581:                                YT=Mt*ltov(Ly);
1.66      takayama 13582:                                glib_putpixel(YT[0],YT[1]|color=mcolor(Cl,0));
1.59      takayama 13583:                        }
                   13584:                }
                   13585:        }else Vw=0;
                   13586:
1.68      takayama 13587:        T=Lx[0];
                   13588:        RE=R=(Tf)?[Ly]:[cons(T,Ly)];
1.59      takayama 13589:        H=(Lx[1]-Lx[0])/N*One;
1.65      takayama 13590:
                   13591:        Ck=N+1;CB=10;Ckm=2;MM=2;C1=1;
                   13592:        if(Ck<5) Ck=100;
                   13593:        if(type(Inf=getopt(Inf))==4&&length(Inf)>1&&Inf[0]>4){  /* explosion */
1.59      takayama 13594:                Ck=Inf[0];Ckm=Inf[1];
                   13595:                if(length(Inf)>2) MM=Inf[2];
1.67      takayama 13596:                if(!isint(MM)||MM<1) MM=2;
1.59      takayama 13597:                if(length(Inf)>3) C1=Inf[3];
1.60      takayama 13598:                if(type(C1)!=1||C1<0) C1=1;
1.65      takayama 13599:                if(length(Inf)>4) CB=Inf[4];
                   13600:        }else if(isint(Inf)&&Inf>0&&Inf<100){
                   13601:                MM=Inf+1;Ck=100;
1.59      takayama 13602:        }else Inf=0;
1.60      takayama 13603:        Ckm*=Ck;
1.65      takayama 13604:
1.66      takayama 13605:        SS=subst(S,V,H);N0=N;
1.59      takayama 13606:        if(Er>0){
1.61      takayama 13607:                HE=H/(Er+1);SSE=subst(S,V,HE);LyE=Ly;
1.59      takayama 13608:        }
1.65      takayama 13609:        for(C=CC=CF=0;C<N;C++,CC++){
1.59      takayama 13610:                if(CC>=Ck){                                     /* check explosion */
                   13611:                        CC=0;
                   13612:                        D0=dnorm(Ly|max=1);
1.65      takayama 13613:                        if(Er&&CF){
                   13614:                                DE=dnorm(ladd(LyE,Ly,-1)|max=1);
                   13615:                                if(CB*DE>D0) break;
                   13616:                        }
1.59      takayama 13617:                        for(Dy=F,TY=Y,TL=Ly;TY!=[];TY=cdr(TY),TL=cdr(TL))
                   13618:                                Dy=subst(Dy,car(TY),One*car(TL));
                   13619:                        D1=dnorm(Dy|max=1);D2=subst(FM,x,2*D0+C1);D3=D1+D2;
1.60      takayama 13620:                        HH=2*(D0+C1)/Ckm;
1.59      takayama 13621:                        if(HH<H*D3){
1.60      takayama 13622:                                HH/=D3;
                   13623:                                while(H>HH) H/=2;
                   13624:                                if(H*7/5<HH) H*=7/5;
                   13625:                                if(H*6/5<HH) H*=6/5;
1.59      takayama 13626:                                SS=subst(S,V,H);
                   13627:                                if(Er){
1.65      takayama 13628:                                        CF++;
1.59      takayama 13629:                                        HE=H/(Er+1);
                   13630:                                        SSE=subst(S,V,HE);
                   13631:                                }
                   13632:                                if(MM>1) N*=MM;
                   13633:                                MM=0;
                   13634:                        }
                   13635:                        CC=0;
                   13636:                }
                   13637:
                   13638:                T+=H;
                   13639:                for(Dy=SS,TY=Y,TL=Ly;TY!=[];TY=cdr(TY),TL=cdr(TL))
                   13640:                        Dy=subst(Dy,car(TY),One*car(TL));
                   13641:                Ly=Dy;
                   13642:
                   13643:                if(Er>0){               /* estimate error */
1.60      takayama 13644:                        for(CE=0;CE<=Er;CE++){
1.59      takayama 13645:                                for(Dy=SSE,TY=Y,TL=LyE;TY!=[];TY=cdr(TY),TL=cdr(TL))
                   13646:                                        Dy=subst(Dy,car(TY),One*car(TL));
                   13647:                                LyE=Dy;
                   13648:                        }
                   13649:                }
                   13650:                if(FL<0||(C+1)%FL) continue;
                   13651:                if(Vw){
1.68      takayama 13652:                        if(LS==1+Tf||Sf) CR=CC/N0;
1.59      takayama 13653:                        else{
1.67      takayama 13654:                                YT=Mt*ltov(Ly);
                   13655:                                CR=(!Vr)?CC/N0:(YT[2]-Vr[0])/(Vr[1]-Vr[0]);
1.59      takayama 13656:                        }
1.68      takayama 13657:                        if(LS==1+Tf||Sf) glib_putpixel(deval(T),Mt*Ly[Tf]|color=mcolor(Cl,CR));
1.67      takayama 13658:                        else glib_putpixel(YT[0],YT[1]|color=mcolor(Cl,CR));
1.59      takayama 13659:                        continue;
                   13660:                }
1.68      takayama 13661:                TR=(V1)?[car(Ly)]:Ly;
                   13662:                if(!Tf) TR=cons((Inf)?eval(T):deval(T),TR);
1.59      takayama 13663:                R=cons(TR,R);
                   13664:                if(Er){
1.68      takayama 13665:                        TRE=(V1)?[car(LyE)]:LyE;
                   13666:                        if(!Tf) TRE=cons((Inf)?eval(T):deval(T),TRE);
1.59      takayama 13667:                        RE=cons(TRE,RE);
                   13668:                }
                   13669:        }
                   13670:        if(Vw) return 1;
                   13671:        L=(FL<0)?((V1)?car(Ly):Ly):reverse(R);
                   13672:        if(Er){                                                                 /* Estimate error */
                   13673:                LE=(FL<0)?((V1)?car(LyE):LyE):reverse(RE);
                   13674:                if(FL>0){
                   13675:                        for(S=L,T=LE,D=[];S!=[];S=cdr(S),T=cdr(T)) D=cons(os_md.ladd(car(S),car(T),-1),D);
                   13676:                        F=map(os_md.dnorm,reverse(D));
1.60      takayama 13677:                        if(iand(ErF,2)){                        /* relative error */
1.61      takayama 13678:                                G=llget(LE,-1,[0]);
                   13679:                                G=map(os_md.dnorm,G);
1.60      takayama 13680:                                for(R=[];G!=[];G=cdr(G),F=cdr(F)){
                   13681:                                        if(car(G)) R=cons(car(F)/car(G),R);
                   13682:                                        else R=cons(0,R);
                   13683:                                }
                   13684:                                F=reverse(R);
                   13685:                        }
                   13686:                        if(!iand(ErF,1)) F=map(os_md.nlog,F);
                   13687:                        if(!iand(ErF,8)) F=map(deval,F);
1.59      takayama 13688:                }else if(V1){
                   13689:                        D=ladd(L,LE,-1);F=dnorm(D);
1.60      takayama 13690:                        if(iand(ErF,2)){
                   13691:                                G=dnorm(cdr(L));
                   13692:                                if(!G) D/=G;
                   13693:                                else D=1;
                   13694:                        }
                   13695:                        F=(!iand(ErF,1))?nlog(D):D;
                   13696:                        if(!iand(ErF,8)) F=deval(F);
1.59      takayama 13697:                }else{
1.60      takayama 13698:                        D=abs(L-LE);
                   13699:                        if(iand(ErF,2)){
                   13700:                                G=abs(L);
                   13701:                                if(!G) D/=G;
                   13702:                                else D=1;
1.58      takayama 13703:                        }
1.60      takayama 13704:                        F=(!iand(ErF,1))?nlog(D):D;
                   13705:                        if(!iand(ErF,8)) F=deval(F);
1.58      takayama 13706:                }
1.61      takayama 13707:                return iand(ErF,4)?[L,F,LE]:[L,F];
1.57      takayama 13708:        }
1.58      takayama 13709:        return L;
1.18      takayama 13710: }
                   13711:
1.6       takayama 13712: def xy2graph(F0,N,Lx,Ly,Lz,A,B)
                   13713: {
1.18      takayama 13714:        /* (x,y,z) -> (z sin B + x cos A cos B + y sin A cos B,
                   13715:            -x sin A + y cos A, z cos B - x cos A sin B - y sin A sin B) */
1.6       takayama 13716:        if((Proc=getopt(proc))==1||Proc==2){
                   13717:                OPT0=[["proc",3]];
                   13718:        }else{
                   13719:                Proc=0;OPT0=[];
                   13720:        }
                   13721:        if(type(DV=getopt(dviout))==4){
                   13722:                S=["ext","shift","cl","dviout"];
                   13723:                OL=delopt(getopt(),S);
                   13724:                OL=cons(["proc",1],OL);
                   13725:                R=xy2graph(F0,N,Lx,Ly,Lz,A,B|option_list=OL);
                   13726:                OL=delopt(getopt(),S|inv=1);
                   13727:                return execdraw(R,DV|optilon_list=OL);
                   13728:        }
                   13729:        if(N==0 || N>100 || N<-100) N=-16;
                   13730:        if(N<0){
                   13731:                N=-N;N1=-1;N2=NN+1;
                   13732:        }else{
                   13733:                N1=0;N2=NN=N;
                   13734:        }
                   13735:
                   13736:        Ratio=Ratio2=1;
                   13737:        if(type(Sc=Sc0=getopt(scale))!=1 && type(Sc)!=4) Sc=1;
                   13738:        if(type(Sc)==4){
                   13739:                Ratio=Sc[1]/Sc[0];
                   13740:                if(length(Sc)>2) Ratio2=Sc[2]/Sc[0];
                   13741:                Sc=Sc[0];
                   13742:        }
                   13743:        if(type(Vw=getopt(view))!=1) Vw=0;
                   13744:        if(type(Raw=getopt(raw))!=1) Raw=0;
                   13745:        if(type(M1=getopt(dev))==1) M2=M1;
                   13746:        else if(type(M1)==4){
                   13747:                M2=M1[1];M1=M1[0];
                   13748:        }else M1=0;
                   13749:        if(type(M3=getopt(acc))!=1 || (M3<0.5 && M3>100)) M3=1;
                   13750:        if(M1<=0) M1=16;
                   13751:        if(M2<=0) M2=16;
                   13752:        OL=[["para",1],["scale",Sc]];
                   13753:        if(Raw==1) OL=cons(["raw",1],OL);
                   13754:        if(type(Prec=getopt(prec))>=0) OL=cons(["prec",Prec],OL);
                   13755:        L=newvect(4,[[Lx[1],Ly[0]],[Lx[1],Ly[1]],[Lx[0],Ly[1]],[Lx[0],Ly[0]]]);
                   13756:        Lx=[deval(Lx[0]),deval(Lx[1])];
                   13757:        Ly=[deval(Ly[0]),deval(Ly[1])];
                   13758:        Lz=[deval(Lz[0]),deval(Lz[1])];
                   13759:        A=(A0=A)%360;
                   13760:        F00=F0;
                   13761:        if(type(F0)<4){
                   13762:                FC=f2df(F0);
                   13763:                if(findin(z,Vars=vars(FC))>=0 && findin(x,Vars)<0 && findin(y,Vars)<0)
                   13764:                        F0=[w,[z,0,x+y*@i],[w,os_md.abs,FC]];
                   13765:        }
                   13766:        if(type(Org=getopt(org))==4){   /* shift origin */
                   13767:                Lx=[Lx[0]-Org[0],Lx[1]-Org[0]];
                   13768:                Ly=[Ly[0]-Org[1],Ly[1]-Org[1]];
                   13769:                Lz=[Lz[0]-Org[2],Lz[1]-Org[2]];
                   13770:                F0=mysubst(F0,[[x,x+Org[0]],[y,y+Org[1]]]);
                   13771:                if(type(F0)==4){
                   13772:                        F0=cons(F0[0]-Org[2],cdr(F0));
                   13773:                }
                   13774:                else F0-=Org[2];
                   13775:        }else Org=[0,0,0];
                   13776:        Cpx=getopt(cpx);
                   13777:        if(type(Cpx)<0){
                   13778:                if(str_str(rtostr(F0),"@i")>=0) Cpx=1;
                   13779:                else Cpx=0;
                   13780:        }
                   13781:        if(A<0) A+=360;
                   13782:        if(A<90){
                   13783:                Sh=1;F1=F0;Cx=x-Org[0];Cy=y-Org[1];
                   13784:        }else if(A<180){        /* x -> y, y -> -x */
                   13785:                Sh=2;A-=90; F1=mulsubst(F0,[[x,-y],[y,x]]);
                   13786:                LL=Ly;Ly=[-Lx[1],-Lx[0]];Lx=LL;Cx=y-Org[1];Cy=-x+Org[0];
                   13787:        }else if(A<270){
                   13788:                Sh=3;A-=180; F1=subst(F0,[[x,-x],[y,-y]]);
                   13789:                Lx=[-Lx[1],-Lx[0]];Ly=[-Ly[1],-Ly[0]];Cx=-x+Org[0];Cy=-y+Org[1];
                   13790:        }else{
                   13791:                Sh=4;A-=270;F1=mulsubst(F0,[[x,y],[y,-x]]);
                   13792:                LL=Lx;Lx=[-Ly[1],-Ly[0]];Ly=LL;Cx=-y+Org[1];Cy=x-Org[0];
                   13793:        }
                   13794:        A=@pi*A/180; B=@pi*B/180;
                   13795:        if(A==0) A=@pi/3;
                   13796:        if(B==0) B=@pi/12;
                   13797:        NN=N*M2;
                   13798:        Ac=dcos(deval(A)); As=dsin(deval(A));
                   13799:        if(Ac<=0.087 || As<=0.087){
                   13800:                mycat(["Unsuitable angle",A0,"(6-th argument)!"]);
                   13801:                return -1;
                   13802:        }
                   13803:        Bc=Ratio*dcos(deval(B)); Bs=dsin(deval(B));
                   13804:        if(Bc<0){
                   13805:                mycat("Unsuitable angle (7-th argument)!");
                   13806:                return -1;
                   13807:        }
                   13808:        /*
                   13809:                z = f(x,y)  => X=-As*x+Ac*y, Y= Bc*f(x,y)-Bsc*x-Bss*y
                   13810:                Out X-coord is in [X0,X1], dvided by Dev segments
                   13811:                J-th segment of Y-coord : ZF[J]==1 =>  [Z0[0],Z1[J]]
                   13812:        */
                   13813:        Bsc=Bs*Ac;Bss=Bs*As;
                   13814:        if(Ratio2!=1){
                   13815:                if(Sh%2==1){
                   13816:                        Ac*=Ratio2;Bss*=Ratio2;
                   13817:                }else{
                   13818:                        As*=Ratio2;Bsc*=Ratio2;
                   13819:                }
                   13820:        }
                   13821:        CX=-As*Cx+Ac*Cy;CY=Bc*(z-Org[2])-Bsc*Cx-Bss*Cy;
                   13822:        if(type(Dvi=getopt(dviout))!=1 && getopt(trans)==1) return [CX*Sc,CY*Sc];
                   13823:        if(type(N1=getopt(inf))==1){
                   13824:                if(Proc) Dvi=N1;
                   13825:                else if(Dvi<=0) Dvi=-N1;
                   13826:        }
                   13827:        X0=-As*Lx[1]+Ac*Ly[0];X1=-As*Lx[0]+Ac*Ly[1];
                   13828:        F1=mysubst(F1,[@pi,deval(@pi)]);
                   13829:        Tf=type(F1=f2df(F1|opt=0));
                   13830:        if(Tf!=4)       F=Bc*F1-Bsc*x-Bss*y;
                   13831:        else    F=append([Bc*F1[0]-Bsc*x-Bss*y],cdr(F1));
                   13832:        Dx=(Lx[1]-Lx[0])/NN; Dy=(Ly[1]-Ly[0])/NN;
                   13833:        if(type(Err=getopt(err))==1)
                   13834:                F=mysubst(F,[[x,x+Err*Dx/1011.23],[y,y+Err*Dy/1101.34]]);
                   13835:        Out=(Proc)?[]:str_tb(0,0);
                   13836:        Dev=N*M1;
                   13837:        XD=(X1-X0)/Dev;
                   13838:        OLV=newvect(2,[OL,OL]);
                   13839:        if(type(Ura=getopt(opt))==4 || type(Ura)==7){
                   13840:                if(type(Ura)==7) Ura=[Ura,Ura];
                   13841:                else{
                   13842:                        OLV[0]=cons(["opt",Ura[0]],OL);
                   13843:                        OLV[1]=cons(["opt",Ura[1]],OL);
                   13844:                }
                   13845:        }
                   13846:        for(KC=0; KC<=1; KC++){         /* draw curves */
                   13847:                Z0=newvect(Dev+1); Z1=newvect(Dev+1); ZF=newvect(Dev+1);
                   13848:        for(I=0; I<=NN; I++){
                   13849:                        FV=I%M2;
                   13850:                        if(KC==0){
                   13851:                                X=x; Y=Ly[1]-I*Dy; LX=Lx; DD=Dx; G=mysubst(F,[y,Y]);
                   13852:                                if(!FV){
                   13853:                                        if(!Proc) str_tb(["%y=",rtostr(Y),"\n"],Out);
                   13854:                                        else Out=cons([-2,"y="+rtostr(Y)],Out);
                   13855:                                }
                   13856:                        }else{
                   13857:                                X=Lx[1]-I*Dx; Y=x; LX=Ly; DD=Dy; G=mysubst(F,[[x,X],[y,Y]]);
                   13858:                                if(!FV){
                   13859:                                        if(!Proc) str_tb(["%x=",rtostr(X),"\n"],Out);
                   13860:                                        else Out=cons([-2,"x="+rtostr(X)],Out);
                   13861:                                }
                   13862:                        }
                   13863:                        XX=-As*X+Ac*Y; A1=coef(XX,1,x); A0=coef(XX,0,x); /* XX = A1*x + A0, x = (XX-A0)/A1 */
                   13864:                        if(!FV && Vw==1){
                   13865:                                if(Proc) Out=cons(xygraph([XX,G],N,LX,[X0,X1],Lz|scale=Sc,para=1,proc=3),Out);
                   13866:                                else str_tb(xygraph([XX,G],N,LX,[X0,X1],Lz|scale=Sc,para=1),Out);
                   13867:                                continue;
                   13868:                        }
                   13869:                        V=VT=LX[1];
                   13870:                        J0=(subst(XX,x,LX[0])-X0)/XD; J1=(subst(XX,x,LX[1])-X0)/XD;
                   13871:                        if(J0<J1){
                   13872:                                J0=ceil(J0); J1=floor(J1); JD=1;        /* fixed x:  y: dec => (x,z):(dec,inc) */
                   13873:                        }else{
                   13874:                                J0=floor(J0); J1=ceil(J1); JD=-1;       /* fixed y:  x: dec => (x,z):(inc,inc) */
                   13875:                        }
                   13876:                        for(FF=1,J=J1;;J-=JD){
                   13877:                                V1=VT;
                   13878:                                VT=(X0+J*XD-A0)/A1;GG=mysubst(G,[x,VT]);
                   13879:                                if(Cpx>=1) VV=myeval(GG);
                   13880:                                else VV=(Tf==4)? mydeval(GG):deval(GG);         /* J -> V */
                   13881:                                if(ZF[J]==0 || VV<=Z0[J] || VV>=Z1[J]){                  /* visible */
                   13882:                                        if(FF==0){
                   13883:                                                V0=(VT+V1)/2;
                   13884:                                                if(!FV && Vw==-1 && Raw!=1){    /* draw doted line */
                   13885:                                                        K=ceil(M3*(V-V0)/(M2*DD));
                   13886:                                                        if(N1<0) K=-K;
                   13887:                                                        OPT=append(OPT0,[["opt",(TikZ)?"dotted":"~*=<3pt>{.}"],["scale",Sc],["para",1]]);
                   13888:                                                        Out=saveproc(xygraph([XX,G],K,[V0,V],[X0-1,X1+1],Lz|
                   13889:                                                                option_list=OPT),Out);
                   13890:                                                }
                   13891:                                                V=V0;
                   13892:                                        }
                   13893:                                        if(ZF[J]==0){
                   13894:                                                ZF[J]=1; Z0[J]=Z1[J]=VV;
                   13895:                                        }else if(VV<=Z0[J]) Z0[J]=VV;
                   13896:                                        else Z1[J]=VV;
                   13897:
                   13898:                                        if(VV>=Z1[J]) FF=1;
                   13899:                                        else if(VV<=Z0[J]) FF=-1;
                   13900:                                }else{
                   13901:                                        if(FF!=0){
                   13902:                                                V0=(VT+V1)/2;
                   13903:                                                K=ceil(M3*(V-V0)/(M2*DD));
                   13904:                                                if(N1<0) K=-K;
                   13905:                                                if(!FV){
                   13906:                                                        OPT=append(OPT0,OLV[(1-FF)/2]);
                   13907:                                                        Out=saveproc(xygraph([XX,G],K,[V0,V],[X0-1,X1+1],Lz|option_list=OPT),Out);
                   13908:                                                }
                   13909:                                                V=V0;
                   13910:                                        }
                   13911:                                        FF=0;
                   13912:                                }
                   13913:                                if(J==J0) break;
                   13914:                        }
                   13915:                        if(FV) continue;
                   13916:                        V0=LX[0];K=ceil(M3*(V-V0)/(M2*DD));
                   13917:                        if(N1<0) K=-K;
                   13918:                        if(FF!=0){
                   13919:                                if(Raw!=1){
                   13920:                                        OPT=append(OPT0,OLV[(1-FF)/2]);
                   13921:                                        Out=saveproc(xygraph([XX,G],K,[V0,V],[X0-1,X1+1],Lz|option_list=OPT),Out);
                   13922:                        }else if(Vw==-1 && Raw!=1){
                   13923:                                OPT=append(OPT0,[["opt",(TikZ)?"dotted":"~*=<3pt>{.}"]]);
                   13924:                                Out=saveproc(xygraph([XX,G],K,[V0,V],[X0-1,X1+1],Lz|option_list=OPT),Out);
                   13925:                                }
                   13926:                        }
                   13927:                }
                   13928:        }
                   13929:        OptSc=(Sc==1)?[]:[["scale",Sc]];
                   13930:        if(type(LZ=getopt(ax))==4){             /* draw box */
                   13931:                FC=0;
                   13932:                if(length(LZ)==3) FC=LZ[2];
                   13933:                P0=newvect(2,[-As*Lx[1]+Ac*Ly[1],Bc*(LZ[0]-Org[0])-Bsc*Lx[1]-Bss*Ly[1]]);
                   13934:                Vx=newvect(2,[As*(Lx[1]-Lx[0]),Bsc*(Lx[1]-Lx[0])]);
                   13935:                Vy=newvect(2,[Ac*(Ly[0]-Ly[1]),Bss*(Ly[1]-Ly[0])]);
                   13936:                Vz=newvect(2,[0,Bc*(LZ[1]-LZ[0])]);
                   13937:                OL=OL0=append(OPT0,OL);
                   13938:                if(TikZ && type(Ura)==4 && length(Ura)>2) OL0=cons(["opt",Ura[2]],OL);
                   13939:                LL=[[P0+Vz,P0+Vx+Vz],[P0,P0+Vx]];
                   13940:                if(Bs>0){
                   13941:                        LL=cons([P0+Vy+Vz,Pz=P0+Vx+Vy+Vz],LL);
                   13942:                        LL=cons([P0+Vx+Vz,Pz],LL);
                   13943:                        PP=Pz-Vz;
                   13944:                }
                   13945:                else{
                   13946:                        LL=cons([P0+Vy,Pz=P0+Vx+Vy+Vz],LL);
                   13947:                        LL=cons([P0+Vx,Pz],LL);
                   13948:                        PP=Pz+Vz;
                   13949:                }
                   13950:                J=ceil((PP[0]-X0)/XD+0.5);
                   13951:                LL=append([[P0+Vy,P0+Vy+Vz],[P0+Vy,P0+Vy+Vz],[P0+Vx,P0+Vx+Vz],[P0,P0+Vz],
                   13952:                        [P0+Vz,P0+Vy+Vz],[P0,P0+Vy]],LL);
                   13953:                for(LL=reverse(LL);LL!=[];LL=cdr(LL)) Out=saveproc(xylines(car(LL)|option_list=OL0),Out);
                   13954:                if(Dev>4) Dev2=ceil(Dev/2);
                   13955:                if(FC<0 && Raw!=1){
                   13956:                        if(TikZ){
                   13957:                                if(type(Ura)==4 && length(Ura)>2)
                   13958:                                        OL1=cons(["opt",Ura[2]+",dotted"],OL);
                   13959:                                else OL1=cons(["opt","dotted"],OL);
                   13960:                        }else OL1=cons(["opt","@{.}"],OL);
                   13961:                        if(FC==-8) FC=0;
                   13962:                }
                   13963:                for(I=0;I<3;I++){               /* box with hidden part */
                   13964:                        if(I==1) Pz=PP-Vx;
                   13965:                        else if(I==2) Pz=PP-Vy;
                   13966:                        LP=Pz-PP;
                   13967:                        for(FV=-1,K=0;K<=Dev2; K++){
                   13968:                                PPx=PP[0]+(K/Dev2)*LP[0]; PPy=PP[1]+(K/Dev2)*LP[1];
                   13969:                                J=ceil((PPx-X0)/XD);
                   13970:                                if(K!=Dev2 && (J<0||J>Dev)) continue;
                   13971:                                if(K!=Dev2 && (ZF[J]==0 || PPy<Z0[J] || PPy>Z1[J])){    /* visible */
                   13972:                                        if(FV!=1){
                   13973:                                                FV=1;
                   13974:                                                PPP=[PPx,PPy];
                   13975:                                        }
                   13976:                                }else{
                   13977:                                        if(FV!=0){
                   13978:                                                if(FV==1) Out=saveproc(xylines([PPP,[PPx,PPy]]|option_list=OL1),Out);
                   13979:                                                FV=0;
                   13980:                                        }
                   13981:                                }
                   13982:                        }
                   13983:                }
                   13984:                if(FC!=0 && Raw!=1){    /* show coordinate*/
                   13985:                        if(iand(FC,4)){
                   13986:                                Sub=1;
                   13987:                                if(TikZ){
                   13988:                                         S0="\\scriptsize";S1="";
                   13989:                                }else{
                   13990:                                         S0="{}_{"; S1="}";
                   13991:                                }
                   13992:                        }else Sub=0;
                   13993:                        if(iand(FC,2))
                   13994:                                LLL=[[1,0,P0+Vx,(TikZ)?"right":"+!L"],[3,0,P0+Vy,(TikZ)?"left":"+!R"]];
                   13995:                        else LL=[];
                   13996:                        if(Bs>0){
                   13997:                                LLL=cons([0,0,P0,(TikZ)?"below":"+!U"],LLL);
                   13998:                                LLL=cons([2,1,P0+Vx+Vy+Vz,(TikZ)?"above":"+!D"],LLL);
                   13999:                        }else{
                   14000:                                LLL=cons([2,0,P0+Vx+Vy,(TikZ)?"below":"+!U"],LLL);
                   14001:                                LLL=cons([0,1,P0+Vz,(TikZ)?"above":"+!D"],LLL);
                   14002:                        }
                   14003:                        for(TLL=LLL;TLL!=[];TLL=cdr(TLL)){
                   14004:                                TL=car(TLL);LL=L[(Sh+TL[0])%4];
                   14005:                                if(Cpx==0 || Cpx==3){
                   14006:                                        S=ltotex([LL[0],LL[1],LZ[TL[1]]]|opt="coord");
                   14007:                                        SS="("+rtostr(LL[0]) +","+rtostr(LL[1])+","+rtostr(LZ[TL[1]])+")";
                   14008:                                }else{
                   14009:                                        S=ltotex([LL[0]+LL[1]*@i,LZ[TL[1]]]|opt="coord",cpx=Cpx);
                   14010:                                        SS="("+rtostr(LL[0])+"+"+rtostr(LL[1])+"i,"+ rtostr(LZ[TL[1]])+")";
                   14011:                                }
                   14012:                                if(TikZ) S="$"+S+"$";
                   14013:                                if(Sub) S=S0+S+S1;
                   14014:                                if(!TikZ) S="$"+S+"$";
                   14015:                                if(Proc) Out=cons([2,OptSc,[TL[2][0],TL[2][1]],[[TL[3],S]],SS],Out);
                   14016:                                else str_tb(xyput([TL[2][0],TL[2][1],[TL[3],S]]|option_list=OptSc),Out);
                   14017:                        }
                   14018:                }
                   14019:        }
                   14020:        if(type(Pt=getopt(pt))==4){             /* option pt=[] */
                   14021:                if(type(Pt[0])<4) Pt=[[Pt]];
                   14022:                if(length(Pt)>1&&type(Pt[1])!=4) Pt=[Pt];
                   14023:                for(PT=Pt;PT!=[];PT=cdr(PT)){
                   14024:                        PP=car(PT);
                   14025:                        if(type(PP)==4 && length(PP)==3 && type(PP[0])<2 && type(PP[2])<2) PP=[PP];
                   14026:                        P=car(PP);
                   14027:                        if(type(P)==7) Q=[P,0];
                   14028:                        else if(P==1) Q=["_",0];
                   14029:                        else Q=mysubst([CX,CY],[[x,deval(P[0])],[y,deval(P[1])],[z,deval(P[2])]]);
                   14030:                        if(length(PP)>1 && type(PP[1])==4 && length(PP[1])==3){         /* draw line */
                   14031:                                PP=cdr(PP);P=car(PP);
                   14032:                                if(type(P)==7) Q1=P;
                   14033:                                else if(P==1) Q="_";
                   14034:                                else Q1=mysubst([CX,CY],[[x,deval(P[0])],[y,deval(P[1])],[z,deval(P[2])]]);
                   14035:                                if(length(PP)<2 || PP[1]==0 || iand(PP[1],1)) OL2="";
                   14036:                                else OL2=(TikZ)?"dotted":"@{.}";
                   14037:                                if(length(PP)>2 && type(PP[2])==7){
                   14038:                                        if(OL2=="") OL2=PP[2];
                   14039:                                        else{
                   14040:                                                if(TikZ)  OL2=OL2+",";
                   14041:                                                OL2=OL2+PP[2];
                   14042:                                        }
                   14043:                                }
                   14044:                                OL1=OL;
                   14045:                                if(OL2!="") OL1=cons(["opt",OL2],OL1);
                   14046:                                if(length(PP)<2 || PP[1]>=0)
                   14047:                                        Out=saveproc(xylines([Q,Q1]|option_list=OL1),Out);
                   14048:                                else{
                   14049:                                        LP0=Q1[0]-Q[0];LP1=Q1[1]-Q[1];
                   14050:                                        for(FV=-1,K=0;K<=Dev2; K++){
                   14051:                                                PPx=Q[0]+(K/Dev2)*LP0; PPy=Q[1]+(K/Dev2)*LP1;
                   14052:                                                J=ceil((PPx-X0)/XD);
                   14053:                                                if(K!=Dev2 && (J<0 || J>Dev || ZF[J]==0 || PPy<Z0[J] || PPy>Z1[J])){
                   14054:                                                        /* visible */
                   14055:                                                        if(FV!=1){
                   14056:                                                                FV=1;
                   14057:                                                                PPP=[PPx,PPy];
                   14058:                                                        }
                   14059:                                                }else{
                   14060:                                                        if(FV!=0){
                   14061:                                                                if(FV==1) Out=saveproc(xylines([PPP,[PPx,PPy]]|option_list=OL1),Out);
                   14062:                                                                FV=0;
                   14063:                                                        }
                   14064:                                                }
                   14065:                                        }
                   14066:                                }
                   14067:                                continue;
                   14068:                        }
                   14069:                        if(length(PP)==1) S="$\\bullet$";
                   14070:                        else if(type(PP[1])==7) S=PP[1];
                   14071:                        else if(type(PP[1])==4){
                   14072:                                if(length(PP[1])>1 && type(PP[1][1])!=7)
                   14073:                                         S=cons(car(PP),cons("$\\bullet$",cdr(cdr(PP))));
                   14074:                                else S=PP[1];
                   14075:                        }else S="$\\bullet$";
                   14076:                        if(length(PP)<=2){
                   14077:                                if(Proc) Out=cons([2,OptSc,[Q[0],Q[1]],[S]],Out);
                   14078:                                else str_tb(xyput([Q[0],Q[1],S]|option_list=OptSc),Out);
                   14079:                        }else if(!TikZ){
                   14080:                                if(Proc) Out=cons([2,OptSc,[Q[0],Q[1]],[S,"",PP[2]]],Out);
                   14081:                                else str_tb(xyput([Q[0],Q[1],S,"",PP[2]]|option_list=OptSc),Out);
                   14082:                        }else{
                   14083:                                if(Proc) Out=cons([2,OptSc,[Q[0],Q[1]],cons(S,cdr(cdr(PP)))],Out);
                   14084:                                else str_tb(xyput(append([Q[0],Q[1],S],cdr(cdr(PP)))|option_list=OptSc),Out);
                   14085:                        }
                   14086:                }
                   14087:        }
                   14088:        if(Proc){
                   14089:                S=reverse(Out);
                   14090:                if(Proc==1||Proc==3){
                   14091:                        for(W=[],I=0;I<2;I++) for(J=0;J<2;J++) for(K=0;K<2;K++)
                   14092:                                W=cons(mysubst([CX*Sc,CY*Sc],[[x,Lx[I]],[y,Ly[J]],[z,Lz[K]]]),W);
                   14093:                        W=ptbbox(W);
                   14094:                        S=cons([0,W[0],W[1],(TikZ)?1:1/10],S);
                   14095:                }
                   14096:        }else S=str_tb(0,Out);
                   14097:        if(type(Dvi)!=1||(Proc&&abs(Dvi)<2)) return S;
                   14098:        Lout=[];
                   14099:        if(abs(Dvi)>=2){
                   14100:                /* show title */
                   14101:                L0=[];
                   14102:                Title=getopt(title);
                   14103:                if(type(Title)!=7)
                   14104:                                 Title=(type(F00)==4)?("\\texttt{"+verb_tex_form(F00)+"}"):my_tex_form(F00);
                   14105:                if(type(Title)==7){
                   14106:                        T=my_tex_form(L[3][0])+"\\le x\\le "+my_tex_form(L[1][0])+",\\,"+
                   14107:                                my_tex_form(L[3][1])+"\\le y\\le "+my_tex_form(L[1][1])+")";
                   14108:                        if(Proc){
                   14109:                                if(Cpx>=1) L0=[[5,[["eq",1]],"|"+Title+"|\\quad(z=x+yi,\\ "+T]];
                   14110:                                else L0=[[5,[["eq",1]],"z="+Title+"\\ \\ ("+T]];
                   14111:                        }else{
                   14112:                                if(Cpx>=1) dviout("|"+Title+"|\\quad(z=x+yi,\\ "+T|eq=1,keep=1);
                   14113:                                else dviout("z="+Title+"\\ \\ ("+T|eq=1,keep=1);
                   14114:                        }
                   14115:                }
                   14116:                A=rint(deval(180*A/@pi))+90*(Sh-1);
                   14117:                if(A>=180) A-=180;
                   14118:                B=rint(deval(180*B/@pi));
                   14119:                if(abs(Dvi)>=3){
                   14120:                        T="\\text{angle } ("+my_tex_form(A)+"^\\circ,"+my_tex_form(B)+"^\\circ)";
                   14121:                        if(Ratio!=1 || Ratio2!=1) T=T+"\\quad\\text{ratio }1:"
                   14122:                                +my_tex_form(sint(Ratio2,2))+":"+my_tex_form(sint(Ratio,2));
                   14123:                        if(Proc) L0=cons([5,[["eq",1]],T],L0);
                   14124:                        else  dviout(T|eq=1,keep=1);
                   14125:                }
                   14126:                SS="% range "+rtostr([L[3][0],L[1][0]])+"x"+rtostr([L[3][1],L[1][1]])+
                   14127:                        "  angle ("+ rtostr(A) +","+ rtostr(B)+")  dev=";
                   14128:                if(M1==M2) SS=SS+rtostr(M1);
                   14129:                else SS=SS+rtostr([M1,M2]);
                   14130:                if(M3!=1) SS=SS+"  acc="+rtostr(M3);
                   14131:                if(type(Sc0)>=0) SS=SS+"  scale="+rtostr(Sc0);
                   14132:                if(Proc){
                   14133:                        S=cons([5,[],SS],S);
                   14134:                        for(;L0!=[];L0=cdr(L0)) S=cons(car(L0),S);
                   14135:                        return S;
                   14136:                }
                   14137:                if(Dvi>0){
                   14138:                        dviout(SS|keep=1);
                   14139:                        dviout(xyproc(S)|eq=8);
                   14140:                }else Lout=[SS,S];
                   14141:        }else{
                   14142:                if(Dvi>0) dviout(xyproc(S));
                   14143:                else Lout=[S];
                   14144:        }
                   14145:        if(getopt(trans)==1) return cons([CX*Sc,CY*Sc],Lout);
                   14146:        if(Dvi<0) return Lout;
                   14147: }
                   14148:
1.20      takayama 14149: def orthpoly(N)
                   14150: {
                   14151:        F=0;
                   14152:        if(type(P=getopt(pol))==7){
                   14153:                for(L=["Le","Ge","Tc","2T","Ja","He","La","Se"];L!=[];L=cdr(L),F++)
                   14154:                        if(str_str(P,car(L)|end=2)==0) break;
                   14155:        }else P=0;
                   14156:        if(type(D=N)==4) D=N[0];
                   14157:        if(!isint(D)||D<0) return 0;
                   14158:        if(F==0) return seriesHG([-D,D+1],[1],(1-x)/2,D);
                   14159:        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));
                   14160:        if(F==2) return seriesHG([-D,D],[1/2],(1-x)/2,D);
                   14161:        if(F==3){
                   14162:                if(D==0) return 0;
                   14163:                return orthpoly([D-1,1]|pol="Ge");
                   14164:        }
                   14165:        if(F==4) return red(seriesHG([-D,D+N[1]],[N[2]],x,D));
                   14166:        if(F==5){
                   14167:                for(S=I=1;I<=D;I+=2) S*=I;
                   14168:                if(iand(D,1)) return seriesHG([-(D-1)/2],[3/2],x^2/2,D-1)*x*S*(-1)^((D-1)/2);
                   14169:                else return seriesHG([-D/2],[1/2],x^2/2,D)*S*(-1)^(D/2);
                   14170:        }
                   14171:        if(F==6){
                   14172:                NN=(type(N)==4)?N[1]:0;
                   14173:                return red(seriesHG([-D],[NN+1],x,D)*binom(D+NN,D));
                   14174:        }
                   14175:        if(F==7){
                   14176:                NN=N[1];
                   14177:                for(S=1,I=1;I<=D;I++) S+=(-1)^I*binom(D,I)*binom(D+I,I)*sftpow(x,I)/sftpow(NN,I);
                   14178:                return S;
                   14179:        }
                   14180:        return 0;
                   14181: }
                   14182:
                   14183: def schurpoly(L)
                   14184: {
                   14185:        N=length(L);
                   14186:        for(R=[],I=1;L!=[];L=cdr(L),I++) R=cons(car(L)+N-I,R);
                   14187:        L=reverse(R);
                   14188:        if(type(X=getopt(var))!=4){
                   14189:                V=(type(X)>1)?X:"x";
                   14190:                for(X=[],I=0;I<N;I++) X=cons(makev([V,N-I]),X);
                   14191:        }
                   14192:        M=newmat(N,N);
                   14193:        for(I=0;I<N;I++)
                   14194:                for(J=0;J<N;J++) M[I][J]=X[I]^L[J];
                   14195:        P=det(M);
                   14196:        for(I=0;I<N;I++)
                   14197:                for(J=I+1;J<N;J++) P=sdiv(P,X[I]-X[J]);
                   14198:        return P;
                   14199: }
                   14200:
1.6       takayama 14201: def fouriers(A,B,X)
                   14202: {
1.20      takayama 14203:        if((Y=getopt(y))==0||type(Y)>0) Y=deval(Y);
                   14204:        else Y=0;
                   14205:        if((V=getopt(const))==0||type(V)>0){
                   14206:                V=myfeval(V,Y);
                   14207:                K=1;
                   14208:        }else K=0;
1.6       takayama 14209:        if(A!=[]&&type(car(A))>1){
1.20      takayama 14210:                for(C=[],I=A[1];I>=K;I--) C=cons(myf2eval(car(A),I,Y),C);
                   14211:                if(K) C=cons(0,C);
1.6       takayama 14212:                A=C;
                   14213:        }
1.20      takayama 14214:        if(K){
                   14215:                if(A!=[]) A=cdr(A);
                   14216:                A=cons(V,A);
                   14217:        }
1.6       takayama 14218:        if(B!=[]&&type(car(B))>1){
1.20      takayama 14219:                for(C=[],I=B[1];I>0;I--) C=cons(myf2eval(car(B),I,Y),C);
1.6       takayama 14220:                B=C;
                   14221:        }
1.20      takayama 14222:        L=length(B)+1;
                   14223:        if(length(A)>=L) L=length(A)+1;
                   14224:        if(type(Sum=getopt(sum))>0){
                   14225:                if(Sum==1) Sum=1-x;
                   14226:                else if(Sum==2) Sum=[(z__)/(3.1416*x),[z__,os_md.mysin,3.1416*x]];
                   14227:                else Sum=f2df(Sum);
                   14228:                C=[];
                   14229:                if(A!=[]){
                   14230:                        C=cons(car(A),C);
                   14231:                        A=cdr(A);
                   14232:                }
                   14233:                for(I=1;A!=[];A=cdr(A),I++) C=cons(car(A)*myf2eval(Sum,I/L,L),C);
                   14234:                A=reverse(C);
                   14235:                for(C=[],I=1;B!=[];B=cdr(B),I++) C=cons(car(B)*myf2eval(Sum,I/L,L),C);
                   14236:                B=reverse(C);
                   14237:        }
1.6       takayama 14238:        if(getopt(cpx)==1){
1.20      takayama 14239:                if(type(X=eval(X))>1) return todf([os_md.fouriers,[["cpx",1]]],[[A],[B],[X]]);
1.6       takayama 14240:                V=dexp(@i*X);
                   14241:                for(C=A,P=1,I=0;C!=[];C=cdr(C),I++){
1.20      takayama 14242:                        R+=S*car(C)*P;
1.6       takayama 14243:                        P*=V;
                   14244:                }
                   14245:                V=dexp(-@i*X);
                   14246:                for(C=B,P=1,I=0;C!=[];C=cdr(C),I++){
                   14247:                        P*=V;
                   14248:                        R+=car(C)*P;
                   14249:                }
                   14250:                return R;
                   14251:        }
                   14252:        if(type(X=eval(X))>1) return todf(os_md.fouriers,[[A],[B],[X]]);
                   14253:        for(C=A,I=0;C!=[];C=cdr(C),I++)
                   14254:                R+=car(C)*mycos(I*X);
                   14255:        for(C=B,I=1;C!=[];C=cdr(C),I++)
                   14256:                R+=car(C)*mysin(I*X);
                   14257:        return R;
                   14258: }
                   14259:
                   14260:
                   14261: def myexp(Z)
                   14262: {
                   14263:        if(type(Z=eval(Z))>1) return todf(os_md.myexp,[Z]);
                   14264:        if((Im=imag(Z))==0) return dexp(Z);
                   14265:        return dexp(real(Z))*(dcos(Im)+@i*dsin(Im));
                   14266: }
                   14267:
                   14268: def mycos(Z)
                   14269: {
                   14270:        if(type(Z=eval(Z))>1) return todf(os_md.mycos,[Z]);
                   14271:        if((Im=imag(Z))==0) return dcos(Z);
                   14272:        V=myexp(Z*@i);
                   14273:        return (V+1/V)/2;
                   14274: }
                   14275:
                   14276: def mysin(Z)
                   14277: {
                   14278:        if(type(Z=eval(Z))>1) return todf(os_md.mysin,[Z]);
                   14279:        if((Im=imag(Z))==0) return dsin(Z);
                   14280:        V=myexp(Z*@i);
                   14281:        return (1/V-V)*@i/2;
                   14282: }
                   14283:
                   14284: def mytan(Z)
                   14285: {
                   14286:        if(type(Z=eval(Z))>1) return todf(os_md.mytan,[Z]);
1.17      takayama 14287:        if((Im=imag(Z))==0) return dtan(Z);
1.6       takayama 14288:        V=myexp(2*Z*@i);
                   14289:        return @i*(1-V)/(1+V);
                   14290: }
                   14291:
                   14292: def mylog(Z)
                   14293: {
                   14294:        if(type(Z=eval(Z))>1) return todf(os_md.mylog,[Z]);
1.58      takayama 14295:        if(imag(Z)==0&&Z>=0) return dlog(Z);
1.6       takayama 14296:        return dlog(dabs(Z))+@i*myarg(Z);
                   14297: }
                   14298:
1.57      takayama 14299: def nlog(X)
                   14300: {
                   14301:        return mylog(X)/dlog(10);
                   14302: }
                   14303:
1.6       takayama 14304: def mypow(Z,R)
                   14305: {
                   14306:        if(type(Z=eval(Z))>1||type(R=eval(R))>1) return todf(os_md.mypow,[Z,R]);
                   14307:        if(Z==0) return 0;
                   14308:        if(isint(2*R)){
                   14309:                if(R==0) return 1;
                   14310:                if(isint(R)) return Z^R;
                   14311:                V=dsqrt(Z);
                   14312:                if(R==1/2) return V;
                   14313:                return Z^(R-1/2)*V;
                   14314:        }
                   14315:        return myexp(R*mylog(Z));
                   14316: }
                   14317:
                   14318: def myarg(Z)
                   14319: {
                   14320:        if(type(Z=map(eval,Z))==4){
                   14321:                if(length(Z)!=2) return todf(os_md.myarg,[Z]);
                   14322:                Re=Z[0];Im=Z[1];
                   14323:        }else if(type(Z)>1){
                   14324:                return todf(os_md.myarg,[Z]);
                   14325:        }else {
                   14326:                Im=imag(Z);Re=real(Z);
                   14327:        }
                   14328:        if(Re==0) return (Im<0)?-deval(@pi)/2:deval(@pi)/2;
                   14329:        V=datan(Im/Re);
                   14330:        if(Re>0) return V;
                   14331:        return (V>0)?(V-deval(@pi)):(V+deval(@pi));
                   14332: }
                   14333:
                   14334: def myatan(Z)
                   14335: {
                   14336:        if(type(Z=eval(Z))>1) return todf(os_md.myatan,[Z]);
                   14337:        if((Im=imag(Z))==0) return datan(Z);
                   14338:        mylog((1-Z*@i)/(1+Z*@i))*@i/2;
                   14339: }
                   14340:
                   14341: def myasin(Z)
                   14342: {
                   14343:        if(type(Z=eval(Z))>1) return todf(os_md.myasin,[Z]);
                   14344:        return deval(@pi/2)-myacos(Z);
                   14345: }
                   14346:
                   14347: def frac(X)
                   14348: {
                   14349:        if(type(X=eval(X))>1) return todf(os_md.frac,[X]);
                   14350:        return (ntype(X)==3)? pari(frac,X):(X-floor(X));
                   14351: }
                   14352:
                   14353: def myacos(Z)
                   14354: {
                   14355:        if(type(Z=eval(Z))>1) return todf(os_md.myacos,[Z]);
                   14356:        if(imag(Z)==0 && Z<=1 && Z>=-1) return dacos(Z);
                   14357:        return mylog(Z-dsqrt(Z^2-1))*@i;
                   14358: }
                   14359:
                   14360: def arg(Z)
                   14361: {
                   14362:        if(vars(Z=map(eval,Z))!=[]) return todf(os_md.arg,[Z]);
                   14363:     return (type(Z)==4)?pari(arg,Z[0],Z[1]):arg(sqrt,Z);
                   14364: }
                   14365:
                   14366: def sqrt(Z){
                   14367:        if(vars(Z=map(eval,Z))!=[]) return todf(os_md.sqrt,[Z]);
                   14368:        R=(type(Z)==4)?Z[1]:Z;
                   14369:        if(ntype(R)==0){
                   14370:                if(R==0) return 0;
                   14371:                if(R>0){
                   14372:                        if(pari(issquare,R)) return pari(isqrt,nm(R))/pari(isqrt,dn(R));
                   14373:                }else{
                   14374:                        R=-R;
                   14375:                        if(pari(issquare,R)) return pari(isqrt,nm(R))/pari(isqrt,dn(R))*@i;
                   14376:                }
                   14377:     }
                   14378:        return (type(Z)==4)?pari(sqrt,Z[0],Z[1]):pari(sqrt,Z);
                   14379: }
                   14380:
                   14381: def gamma(Z)
                   14382: {
                   14383:        if(vars(Z=map(eval,Z))!=[]) return todf(os_md.gamma,[Z]);
                   14384:     return (type(Z)==4)?pari(gamma,Z[0],Z[1]):pari(gamma,Z);
                   14385: }
                   14386:
                   14387: def lngamma(Z)
                   14388: {
                   14389:        if(vars(Z=map(eval,Z))!=[]) return todf(os_md.lngamma,[Z]);
                   14390:     return (type(Z)==4)?pari(lngamma,Z[0],Z[1]):pari(lngamma,Z);
                   14391: }
                   14392:
                   14393: def digamma(Z)
                   14394: {
                   14395:        if(vars(Z=map(eval,Z))!=[]) return todf(os_md.digamma,[Z]);
                   14396:     return (type(Z)==4)?pari(digamma,Z[0],Z[1]):pari(digamma,Z);
                   14397: }
                   14398:
                   14399: def dilog(Z)
                   14400: {
                   14401:        if(vars(Z=map(eval,Z))!=[]) return todf(os_md.dilog,[Z]);
                   14402:     return (type(Z)==4)?pari(dilog,Z[0],Z[1]):pari(dilog,Z);
                   14403: }
                   14404:
                   14405: def erfc(Z)
                   14406: {
                   14407:        if(vars(Z=map(eval,Z))!=[]) return todf(os_md.erfc,[Z]);
                   14408:        return (type(Z)==4)?pari(erfc,Z[0],Z[1]):pari(erfc,Z);
                   14409: }
                   14410:
                   14411: def zeta(Z)
                   14412: {
                   14413:        if(vars(Z=map(eval,Z))!=[]) return todf(os_md.zeta,[Z]);
                   14414:     return (type(Z)==4)?pari(zeta,Z[0],Z[1]):pari(zeta,Z);
                   14415: }
                   14416:
                   14417: def eta(Z)
                   14418: {
                   14419:        if(vars(Z=map(eval,Z))!=[]) return todf(os_md.eta,[Z]);
                   14420:     return (type(Z)==4)?pari(eta,Z[0],Z[1]):pari(eta,Z);
                   14421: }
                   14422:
                   14423: def jell(Z)
                   14424: {
                   14425:        if(vars(Z=map(eval,V))>1) return todf(os_md.jell,[Z]);
                   14426:     return (type(Z)==4)?pari(jell,Z[0],Z[1]):jell(jell,Z);
                   14427: }
                   14428:
                   14429: def evals(F)
                   14430: {
                   14431:        if(type(F)==7){
                   14432:                if(type(Del=getopt(del))!= 7) return eval_str(F);
                   14433:                S=strtoascii(Del);K=length(S);
                   14434:                if(K==0) return [eval_str(F)];
                   14435:                Raw=getopt(raw);
                   14436:                F=strtoascii(F);L=[];T1=0;
                   14437:                do{
                   14438:                        T2=str_str(F,S|top=T1);
                   14439:                        if(T2<0) T2=10000;
                   14440:                        FT=str_cut(F,T1,T2-1);
                   14441:                        L=cons((Raw==1)?FT:evals(FT),L);
                   14442:                        T1=T2+K;
                   14443:                }while(T2!=10000);
                   14444:                return reverse(L);
                   14445:        }
                   14446:        if(type(F)==4){
                   14447:                if(type(S=car(F))==7){
                   14448:                        S+="(";
                   14449:                        for(I=0,FT=cdr(F); FT!=[]; I++,FT=cdr(FT)){
                   14450:                                if(type(ST=car(FT))!=7) ST=rtostr(ST);
                   14451:                                if(I>0) S=S+","+ST;
                   14452:                                else S=S+ST;
                   14453:                        }
                   14454:                        S=S+")";
                   14455:                        return eval_str(S);
                   14456:                }else return call(S,cdr(F));
                   14457:        }
                   14458:        return F;
                   14459: }
                   14460:
                   14461: def myval(F)
                   14462: {
                   14463:        if(type(F)!=4){
                   14464:                F=f2df(sqrt2rat(F));
                   14465:                if(type(F)!=4) return F;
                   14466:        };
                   14467:        if(length(F)==1) V=car(F);
                   14468:        else for(V=car(F),F=cdr(F); F!=[];){
                   14469:                FT=car(F);
                   14470:                if(type(G=FT[1])==2){
                   14471:                        if(length(FT)>2){
                   14472:                                FT2=myval(FT[2]);
                   14473:                                if(length(FT)>3) FT3=myval(FT[3]);
                   14474:                        };
                   14475:                        X=red(FT2/@pi);Vi=-red(FT2*@i/@pi);W=red(FT2/@e);
                   14476:                        if(G==os_md.mypow && FT3==1/2){
                   14477:                                G=os_md.sqrt;
                   14478:                                FT=[FT[0],G,FT[2]];
                   14479:                        }
                   14480:                        if((T=findin(G,
                   14481:                                  [sin,os_md.mysin,cos,os_md.mycos,tan,os_md.mytan]))>=0
                   14482:                                  &&(isint(6*X)||isint(4*X))){
                   14483:                                if(T==2||T==3){
                   14484:                                        T=0;X=1/2-X;
                   14485:                                }
                   14486:                                X=X-floor(X/2)*2;
                   14487:                                if(T==0||T==1){
                   14488:                                        if(X>1){
                   14489:                                                S=-1;X-=1;
                   14490:                                        }else S=1;
                   14491:                                        if(X>1/2) X=1-X;
                   14492:                                        if(X==0) R=0;
                   14493:                                        else if(X==1/6) R=1/2;
                   14494:                                        else if(X==1/4) R=2^(1/2)/2;
                   14495:                                        else if(X==1/3) R=3^(1/2)/2;
                   14496:                                        else R=1;
                   14497:                                        R*=S;
                   14498:                                }else{
                   14499:                                        if(X>1) X-=1;
                   14500:                                        if(X>1/2){
                   14501:                                                S=-1;V=1-X;
                   14502:                                        }else S=1;
                   14503:                                        if(X==0) R=0;
                   14504:                                        else if(X==1/6) R=3^(1/2)/3;
                   14505:                                        else if(X==1/4) R=1;
                   14506:                                        else if(X==1/3) R=3^(1/2);
                   14507:                                        else R=2^512;
                   14508:                                        R*=S;
                   14509:                                }
                   14510:                        }else if((G==exp||G==os_md.myexp)&&(isint(FT2)||isint(6*Vi)||isint(4*Vi))){
                   14511:                                if(isint(FT2)) R=@e^FT2;
                   14512:                                else R=myval([z+w*@i,[z,cos,Vi*@pi],[w,sin,Vi*@pi]]);
                   14513:                        }else if((G==pow||G==os_md.mypow) && (isint(FT3)||FT2==1||FT2==0)){
                   14514:                                if(FT2==0) R=0;
                   14515:                                else if(FT2==1) R=1;
                   14516:                                else R=FT2^FT3;
                   14517:                        }else if(G==os_md.abs&&ntype(P=eval(FT2))<4){
                   14518:                                R=FT2;
                   14519:                                if(P<0) R=-R;
                   14520:                        }else if((G==os_md.sqrt||G==dsqrt)&&type(FT2)<2&&ntype(FT2)==0)
                   14521:                                R=sqrtrat(FT2);
                   14522:                        else if((G==os_md.mylog||G==dlog)&&(FT2==@e||FT2==1))
                   14523:                                R=(FT2==1)?0:1;
                   14524:                        else if(length(FT)==3) R=eval((*G)(myeval(FT2)));
                   14525: #ifdef USEMODULE
                   14526:                        else R=call(G,map(os_md.myeval,cdr(cdr(FT))));
                   14527: #else
                   14528:                        else R=call(G,map(myeval,cdr(cdr(FT))));
                   14529: #endif
                   14530:                }
                   14531:                else if(G==0) R=FT[2];
                   14532: #ifdef USEMODULE
                   14533:                        else R=eval(call(G[0],map(os_md.myeval,cdr(cdr(FT)))|option_list=G[1]));
                   14534: #else
                   14535:                        else R=eval(call(G[0],map(myeval,cdr(cdr(FT)))|option_list=G[1]));
                   14536: #endif
                   14537:                V=mysubst(V,[FT[0],R]);
                   14538:                F=mysubst(cdr(F),[FT[0],R]);
                   14539:        }
                   14540:        if(type(V)<4 && !iscoef(V,os_md.iscrat)) V=eval(V);
                   14541: #if 0
                   14542:        return (type(V)<4)?myeval(V):mtransbys(os_md.myeval,V,[]);
                   14543: #else
                   14544:        return V;
                   14545: #endif
                   14546: }
                   14547:
                   14548: /* -1:空  0:整数 1:有理数 2:Gauss整数 3:Gauss有理数 4:それ以外の複素数 */
                   14549: /* def vntype(F)
                   14550: {
                   14551:        if((T=type(F))<2){
                   14552:                if(T<0) return -1;
                   14553:                if((Tn=ntype(F))==0){
                   14554:                        return (isint(F))?0:1;
                   14555:                }
                   14556:                if(Tn==4){
                   14557:                        if(ntype(real(F))==0&&ntype(real(F))==0)
                   14558:                                return (isint(F)&&isint(F))?2:3;
                   14559:                        return 4;
                   14560:                }
                   14561:        }
                   14562:        if(T==2){
                   14563:                V=vars(F);
                   14564:                if((VV=lsort(V,[@e,@pi],1))==[]){
                   14565:                        FT=mycoef(
                   14566:                }else{
                   14567:                        if(length(VV)==1){
                   14568:                        }else
                   14569:                }
                   14570:        }else if(T==3){
                   14571:
                   14572:        }
                   14573: }
                   14574: */
                   14575:
                   14576:
                   14577: def myeval(F)
                   14578: {
                   14579:        if(type(F)!=4)  V=F;
                   14580:        else if(length(F)==1) V=car(F);
                   14581:        else for(V=car(F),F=cdr(F); F!=[];){
                   14582:                FT=car(F);
                   14583:                if(type(G=FT[1])==2){
                   14584:                        if(length(FT)==3) R=(*G)(myeval(FT[2]));
                   14585: #ifdef USEMODULE
                   14586:                        else R=call(G,map(os_md.myeval,cdr(cdr(FT))));
                   14587: #else
                   14588:                        else R=call(G,map(myeval,cdr(cdr(FT))));
                   14589: #endif
                   14590:                }
                   14591:                else if(G==0) R=myeval(FT[2]);
                   14592: #ifdef USEMODULE
                   14593:                        else R=call(G[0],map(os_md.myeval,cdr(cdr(FT)))|option_list=G[1]);
                   14594: #else
                   14595:                        else R=call(G[0],map(myeval,cdr(cdr(FT)))|option_list=G[1]);
                   14596: #endif
                   14597:                V=mysubst(V,[FT[0],R]);
                   14598:                F=mysubst(cdr(F),[FT[0],R]);
                   14599:        }
                   14600:        return (type(V)<4)?eval(V):mtransbys(eval,V,[]);
                   14601: }
                   14602:
                   14603: def mydeval(F)
                   14604: {
                   14605:        if(type(F)!=4) V=F;
                   14606:        else if(length(F)==1) V=car(F);
                   14607:        else for(V=car(F),F=cdr(F); F!=[]; ){
                   14608:                FT=car(F);
                   14609:                if(type(G=FT[1])==2){
                   14610:                        if(length(FT)==3) R=(*G)(myeval(FT[2]));
                   14611: #ifdef USEMODULE
                   14612:                        else R=call(G,map(os_md.mydeval,cdr(cdr(FT))));
                   14613: #else
                   14614:                        else R=call(G,map(mydeval,cdr(cdr(FT))));
                   14615: #endif
                   14616:                }
                   14617:                else if(G==0) R=mydeval(FT[2]);
                   14618: #ifdef USEMODULE
                   14619:                        else R=call(G[0],map(os_md.mydeval,cdr(cdr(FT)))|option_list=G[1]);
                   14620: #else
                   14621:                        else R=call(G[0],map(mydeval,cdr(cdr(FT)))|option_list=G[1]);
                   14622: #endif
                   14623:                V=mysubst(V,[FT[0],R]);
                   14624:                F=mysubst(cdr(F),[FT[0],R]);
                   14625:        }
                   14626:        return (type(V)<4)?deval(V):mtransbys(deval,V,[]);
                   14627: }
                   14628:
                   14629: def myfeval(F,X)
                   14630: {
                   14631:        if(type(X)==4){
                   14632:                if(isvar(X[0])&&length(X)==2)
                   14633:                        return mydeval(mysubst(F,[X[0],X[1]]));
                   14634:                if(type(X[0])==4&&isvar(X[0][0])&&length(X[0])==2){
                   14635:                        for(Y=X;Y!=[];Y=cdr(Y))
                   14636:                                F=mysubst(F,[car(Y)[0],car(Y)[1]]);
                   14637:                        return myeval(F);
                   14638:                }
                   14639:        }
                   14640:        return myeval(mysubst(F,[x,X]));
                   14641: }
                   14642:
                   14643: def myf2eval(F,X,Y)
                   14644: {
                   14645:        return myeval(mysubst(F,[[x,X],[y,Y]]));
                   14646: }
                   14647:
                   14648: def myf3eval(F,X,Y,Z)
                   14649: {
                   14650:        return myeval(mysubst(F,[[x,X],[y,Y],[z,Z]]));
                   14651: }
                   14652:
                   14653: def myfdeval(F,X)
                   14654: {
                   14655:        if(type(X)==4){
                   14656:                if(isvar(X[0])&&length(X)==2)
                   14657:                        return mydeval(mysubst(F,[X[0],X[1]]));
                   14658:                if(type(X[0])==4&&isvar(X[0][0])&&length(X[0])==2){
                   14659:                        for(Y=X;Y!=[];Y=cdr(Y))
                   14660:                                F=mysubst(F,[car(Y)[0],car(Y)[1]]);
                   14661:                        return mydeval(F);
                   14662:                }
                   14663:        }
                   14664:        return mydeval(mysubst(F,[x,X]));
                   14665: }
                   14666:
                   14667: def myf2deval(F,X,Y)
                   14668: {
                   14669:        return mydeval(mysubst(F,[[x,X],[y,Y]]));
                   14670: }
                   14671:
                   14672: def myf3deval(F,X,Y,Z)
                   14673: {
                   14674:        return mydeval(mysubst(F,[[x,X],[y,Y],[z,Z]]));
                   14675: }
                   14676:
                   14677: def df2big(F)
                   14678: {
                   14679:        AG=[[os_md.mysin,sin],[os_md.mycos,cos],[os_md.mytan,tan],[os_md.myasin,asin],
                   14680:                [os_md.acos,acos],[os_md,atan,atan],[os_md.myexp,exp],[os_md.mylog,log],[os_md.mypow,pow]];
                   14681:        if(getopt(inv)!=1) return mysubst(F,AG);
                   14682:        else return mysubst(F,AG|inv=1);
                   14683:
                   14684: }
                   14685:
                   14686: def f2df(F)
                   14687: {
                   14688:        if(type(Opt=getopt(opt))!=1) Opt=0;
                   14689:        if(iand(Opt,1)){
                   14690:                if(Opt>0) F=map(eval,F);
                   14691:                else F=map(deval,F);
                   14692:        }
                   14693:        Cpx=getopt(cpx);
                   14694:        if(type(F)==4 && iand(Opt,2)==0) return F;
                   14695:        K=getopt(level);
                   14696:        if(type(K)!=1) K=0;
                   14697:        AG=[sin,cos,tan,asin,acos,atan,exp,sinh,cosh,tanh,log,pow];
                   14698:        AGd=[os_md.mysin,os_md.mycos,os_md.mytan,os_md.myasin,os_md.myacos,
                   14699:                os_md.myatan,os_md.myexp,os_md.myexp,os_md.myexp,os_md.myexp,
                   14700:                os_md.mylog,os_md.sqrt,os_md.myexp];
                   14701:        for(R=[],I=0,Arg=vars(F);Arg!=[];Arg=cdr(Arg)){
                   14702:                Fn=functor(car(Arg));
                   14703:                if(vtype(Fn)!=3) continue;
                   14704:                V=args(car(Arg));
                   14705:                for(PAG=AG,PAGd=AGd;PAG!=[];PAG=cdr(PAG),PAGd=cdr(PAGd)){
                   14706:                        if(Fn==car(PAG)){
                   14707:                                if(K==0) L="z__";
                   14708:                                else L="z"+rtostr(K)+"__";
                   14709:                                if(I==0) VC=makev([L]);
                   14710:                                else VC=makev([L,I]);
                   14711:                                I++;
                   14712:                                VC0=VC;
                   14713:                                if(Fn==sinh || Fn==cosh || Fn==tanh){
                   14714:                                        VC=makev([L,I++]);
                   14715:                                        if(Fn==sinh)
                   14716:                                                R=cons([VC0,0,(VC^2-1)/(2*VC)],R);
                   14717:                                        else if(Fn==cosh)
                   14718:                                                R=cons([VC0,0,(VC^2+1)/(2*VC)],R);
                   14719:                                        else
                   14720:                                                R=cons([VC0,0,(VC^2-1)/(VC^2+1)],R);
                   14721:                                }
                   14722:                                if(Fn==pow && (V[1]!=1/2||Cpx==1)){
                   14723: #if 0
                   14724:                                        R0=f2df(V[1]*((type(V[0])==1)?dlog(V[0]):log(V[0]))|level=K+1);
                   14725:                                        PAGd=cdr(PAGd);
                   14726: #else
                   14727:                                        R=cons([VC,os_md.mypow,V[0],V[1]],R);
                   14728:                                        F=mysubst(F,[car(Arg),VC0]);
                   14729:                                        Arg=cons(0,vars(F));
                   14730:                                        break;
                   14731: #endif
                   14732:                                }else R0=f2df(V[0]|level=K+1);
                   14733:                                R=cons([VC,car(PAGd),R0],R);
                   14734:                                F=mysubst(F,[car(Arg),VC0]);
                   14735:                                Arg=cons(0,vars(F));
                   14736:                                break;
                   14737:                        }
                   14738:                }
                   14739:        }
                   14740:        if(R==[])       return F;
                   14741:        if(Cpx==1){
                   14742:                for(PAG=P,PAGd=AGd;PAG!=[];PAG=cdr(PAG),PAGd=cdr(PAGd))
                   14743:                        R=mysubst(R,[car(PADd),car(PAG)]);
                   14744:        }
                   14745:        return cons(F,reverse(R));
                   14746: }
                   14747:
                   14748: def todf(F,V)
                   14749: {
                   14750:        if(type(V)!=4) V=[V];
                   14751:        for(R=[];V!=[];V=cdr(V)){
                   14752:                R=cons(f2df(car(V)),R);
                   14753:        }
                   14754:        V=reverse(R);
                   14755:        Z=makenewv([F,V]);
                   14756:        return [Z,cons(Z,cons(F,V))];
                   14757: }
                   14758:
                   14759: def compdf(F,V,G)
                   14760: {
                   14761:        FL=["abs","floor","rint","zeta","gamma","arg","real","imag","conj"];
                   14762:        FS=[os_md.abs,floor,rint,os_md.zeta,os_md.gamma,os_md.myarg,real,imag,conj];
                   14763:        if(type(F)==7){
                   14764:                if(str_str(F,"|")==0){
                   14765:                        F="abs("+str_cut(F,1,str_len(F)-2)+")";
                   14766:                }else if(str_str(F,"[")==0){
                   14767:                        F="floor("+str_cut(F,1,str_len(F)-2)+")";
                   14768:                }
                   14769:                I=str_str(F,"(");
                   14770:                Var=x;
                   14771:                if(I>0){
                   14772:                        J=str_pair(F,I+1,"(",")");
                   14773:                        if(J<0) return 0;
                   14774:                        Var=eval_str(str_cut(F,I+1,J-1));
                   14775:                        Var=f2df(Var);
                   14776:                        F0=str_cut(F,0,I-1);
                   14777:                }
                   14778:                if((I=findin(F0,FL))<0&&(I=findin(F,FL))<0) F=f2df(eval_str(F));
                   14779:                else F=[z__,[z__,FS[I],Var]];
                   14780:        }
                   14781:        if(type(F)!=4) F=f2df(F);
                   14782:        if(type(G)!=4) G=f2df(G);
1.20      takayama 14783:        if(V==G) return F;      /* subst(F(V),V,G) */
1.6       takayama 14784:        VF=vars(F);VG=vars(G);
1.20      takayama 14785:        if(type(V)==4){
                   14786:                for(VT=[],VV=V;VV!=[];VV=cdr(VV)){
                   14787:                        if(findin(car(VV),VF)>=0){
                   14788:                                X=makenewv(append(VF,VG));
                   14789:                                VF=cons(X,VF);
                   14790:                                F=mysubst(F,[car(VV),X]);
                   14791:                                VT=cons(X,VT);
                   14792:                        }else VT=cons(car(VV),VT);
                   14793:                }
                   14794:                for(V=reverse(VT);V!=[];V=cdr(V),G=cdr(G)) F=compdf(F,car(V),car(G));
                   14795:                return F;
                   14796:        }
1.6       takayama 14797:        for(E=I=0;I<30;I++){
                   14798:                for(J=0;J<30;J++){
                   14799:                        X=makev(["z__",I,J]);
                   14800:                        if(findin(X,VF)<0 && findin(X,VG)<0){
                   14801:                                E=1;break;
                   14802:                        }
                   14803:                }
                   14804:                if(E) break;
                   14805:        }
                   14806:        if(!E) return 0;
                   14807:        if(type(G)<4) return mysubst(F,[V,G]);
                   14808:        if(type(F)<4) F=[F]; /* return compdf([X,[X,0,F]],V,G); */
                   14809:        F=mysubst(F,[V,X]);
                   14810:        if(isvar(G[0])){
                   14811:                G=mysubst(G,[G[0],X]);
                   14812:                if(length(G)==2&&type(G[1])==4&&G[1][0]==X) G=G[1];
                   14813:                G=cons(G,cdr(F));
                   14814:        }
                   14815:        else G=cons([X,0,G],cdr(F));
                   14816:        return cons(car(F),G);
                   14817: }
                   14818:
                   14819: def fzero(F,LX)
                   14820: {
                   14821:        if(length(LX)==3){
                   14822:                V=LX[0];LX=cdr(LX);
                   14823:        }else V=x;
                   14824:        LX1=eval(LX[0]);LX2=eval(LX[1]);
                   14825:        if(getopt(zero)==1){
                   14826:                if(getopt(cont)==1) CT=1;
                   14827:                else CT=0;
                   14828:                if(getopt(trans)!=1 && type(F)<4) F=f2df(F);
                   14829:                F=mysubst(F,[[@pi,deval(@pi)],[@e,deval(@e)]]);
                   14830:                if(type(Dev=getopt(dev))!=1 || Dev<2) Dev=16;
                   14831:                V1=myeval(mysubst(F,[V,X1=LX1]));
                   14832:                V2=myeval(mysubst(F,[V,X2=LX2]));
                   14833:                if(V1>0){
                   14834:                        V0=V1;V1=V2;V2=V0;
                   14835:                        X0=X1;X1=X2;X2=X0;
                   14836:                }
                   14837:                if(V1<0 && V2>0){
                   14838:                        D=(V2-V1)*1024;
                   14839:                        for(I=0; I<Dev; I++){
                   14840: /*     mycat([D,X1,V1,X2,V2]) ; */
                   14841:                                if(iand(I,1)) X0=(X1+X2)/2;
                   14842:                                else X0=(V2*X1-V1*X2)/(V2-V1);
                   14843:                                V0=myeval(mysubst(F,[V,X0]));
                   14844:                                if(V0==0||V0==V1||V0==V2) return [X0,V0];
                   14845:                                if(V0<0){
                   14846:                                        if(!CT && V0+D<0) return [];
                   14847:                                        V1=V0;X1=X0;
                   14848:                                }else{
                   14849:                                        if(!CT && V0>D) return [];
                   14850:                                        V2=V0;X2=X0;
                   14851:                                }
                   14852:                        }
                   14853:                        X0=(V2*X1-V1*X2)/(V2-V1);
                   14854:                        return [X0,myeval(mysubst(F,[V,X0]))];
                   14855:                }
                   14856:                if(V0==0) return [X0,V0];
                   14857:                if(V1==0) return [X1,V1];
                   14858:                return [];
                   14859:        }
                   14860:        if(type(F)<4) F=f2df(F);
                   14861:        F=mysubst(F,[[@pi,deval(@pi)],[@e,deval(@e)]]);
                   14862:        L=[];
                   14863:        if(type(F)<4){
                   14864:                if(type(F)==3) F=nm(red(F));
                   14865:                if((Deg=deg(F,V))<=2){
                   14866:                        if(Deg==2){
                   14867:                                D=(C1=coef(F,1,V))^2-4*(C2=coef(F,2,V))*coef(F,0,V);
                   14868:                                if(D>=0){
                   14869:                                        R=dsqrt(D);
                   14870:                                        if((S=(-C1+R)/(2*C2))>=LX1&&S<=LX2) L=[[S,mysubst(F,[V,S])]];
                   14871:                                        if(D!=0 && (S=(-C1-R)/(2*C2))>=LX1&&S<=LX2) L=cons([S,mysubst(F,[V,S])],L);
                   14872:                                }
                   14873:                                L=qsort(L);
                   14874:                        }else if(Deg==1&&(S=-coef(F,0,V)/coef(F,1,V))>=LX1&&S<=LX2)
                   14875:                                L=[[S,mysubst(F,[V,S])]];
                   14876:                        return L;
                   14877:                }
                   14878:                for(L=[];S!=[];S=cdr(S))
                   14879:                        if(car(S)>=LX1&&car(S)<=LX2) L=cons([car(S),mysubst(F,[V,car(S)])],L);
                   14880:                return qsort(L);
                   14881:        }
                   14882:        if(type(Div=getopt(mesh))!=1 || Div<=0)
                   14883:                Div = 2^(10);
                   14884:        W=(LX2-LX1)/Div;
                   14885:        for(I=V2=0;I<=Div;I++){
                   14886:                X1=X2;X2=LX1+I*W;V1=V2;
                   14887:                if((V2=myeval(mysubst(F,[V,X2])))==0)
                   14888:                        L=cons([X2,V2],L);
                   14889:                if(V1*V2<0){
                   14890:                        L0=fzero(F,[V,X1,X2]|zero=1,trans=1);
                   14891:                        if(L0!=[]) L=cons(L0,L);
                   14892:                }
                   14893:        }
                   14894:        return reverse(L);
                   14895: }
                   14896:
                   14897: def fmmx(F,LX)
                   14898: {
                   14899:        if(length(LX)==3){
                   14900:                V=LX[0];LX=cdr(LX);
                   14901:        }else V=x;
                   14902:        LX1=eval(LX[0]);LX2=eval(LX[1]);
                   14903:        FT=F;
                   14904:        if(getopt(trans)!=1 && type(F)<4) FT=f2df(FT);
                   14905:        FT=mysubst(FT,[[@pi,eval(@pi)],[@e,eval(@e)]]);
                   14906:        if(type(G=getopt(dif))>=1){
                   14907:                if(G==1) G=os_md.mydiff(F,V);
                   14908:                L=fzero(G,[V,LX1,LX2]|option_list=getopt());
                   14909:                R=[[LX1,myeval(mysubst(FT,[V,LX1]))]];
                   14910:                for(I=0;L!=[];L=cdr(L),I++){
                   14911:                        X=car(L)[0];
                   14912:                        if(X==LX1) continue;
                   14913:                        R=cons([X,myeval(mysubst(FT,[V,X]))],R);
                   14914:                }
                   14915:                if(X!=LX2)      R=cons([LX2,myeval(mysubst(FT,[V,LX2]))],R);
                   14916:                if(getopt(mmx)!=1) return reverse(R);
                   14917:                for(Mi=Ma=car(R);R!=[];R=cdr(R)){
                   14918:                        if(car(R)[1]>Ma[1]) Ma=car(R);
                   14919:                        else if(car(R)[1]<Mi[1]) Mi=car(R);
                   14920:                }
                   14921:                return [Mi,Ma];
                   14922:        }
                   14923:        if(type(Div=getopt(mesh))!=1 || Div<=0)
                   14924:                Div = 2^(10);
                   14925:        if(type(Dev=getopt(dev))!=1 || Dev<2) Dev=16;
                   14926:        W=(LX2-LX1)/Div;
                   14927:        for(I=V2=V3=0;I<=Div;I++){
                   14928:                X1=X2;X2=X3;X3=LX1+I*W;V1=V2;V2=V3;
                   14929:                V3=myeval(mysubst(FT,[V,X3]));
                   14930:                if(I==0) L=[[X3,V3]];
                   14931:                if(I<2) continue;
                   14932:                if((V1-V2)*(V2-V3)<0){
                   14933:                        X02=X2;V02=V2;X03=X3;V03=V3;
                   14934:                        for(J=0; J<Dev && X1!=X3; J++){
                   14935:                                X12=(X1+X2)/2;V12=myeval(mysubst(FT,[V,X12]));
                   14936:                                if((V1-V12)*(V12-V2)<=0){
                   14937:                                        X3=X2;V3=V2;X2=X12;V2=V12;continue;
                   14938:                                }
                   14939:                                X23=(X2+X3)/2;V23=myeval(mysubst(FT,[V,X23]));
                   14940:                                if((V12-V2)*(V2-V23)<=0){
                   14941:                                        X1=X12;V1=V12;X3=X23;V3=V23;continue;
                   14942:                                }
                   14943:                                if((V2-V23)*(V23-V3)<=0){
                   14944:                                        X1=X2;V1=V2;X2=X23;V2=V23;continue;
                   14945:                                }
                   14946:                        }
                   14947:                        L=cons([X2,V2],L);
                   14948:                        X2=X02;V2=V02;X3=X03;V3=V03;
                   14949:                }
                   14950:        }
                   14951:        L=cons([LX2,myeval(mysubst(FT,[V,LX2]))],L);
                   14952:        if(getopt(mmx)!=1) return L;
                   14953:        for(Mi=Ma=car(L);L!=[];L=cdr(L)){
                   14954:                if(car(L)[1]>Ma[1]) Ma=car(L);
                   14955:                else if(car(L)[1]<Mi[1]) Mi=car(L);
                   14956:        }
                   14957:        return [Mi,Ma];
                   14958: }
                   14959:
                   14960: def flim(F,L)
                   14961: {
                   14962:        FD=f2df(F);
                   14963:        Lim0=4;Lim=12;FS=1;
                   14964:        if(type(Pc=getopt(prec))==1){
                   14965:                if((Pc>1&&Pc<31)||Pc>-5) Lim+=Pc;
                   14966:        }
                   14967:        if(type(Pc=getopt(init))==1 && Pc>0) FS*=Pc;
                   14968:        if(type(L)==7) L=[L];
                   14969:        else if(type(L)<2){
                   14970:                K=flim(F,["+",L]|option_list=getopt());
                   14971:                if(K=="") return K;
                   14972:                K1=flim(F,["-",L]|option_list=getopt());
                   14973:                if(K1=="") return K1;
                   14974:                if(type(K)==7||type(K1)==7){
                   14975:                        if(K!=K1) return "";
                   14976:                        return K;
                   14977:                }
                   14978:                if(abs(K)<10^(-5)){
                   14979:                        if(abs(K1)<10^(-5)) return (K1+K)/2;
                   14980:                        else return "";
                   14981:                }
                   14982:                if(abs((K1-K)/K)<10^(-4)) return (K1+K)/2;
                   14983:                return "";
                   14984:        }
                   14985:        if(type(L)!=4||type(L[0])!=7) return "";
                   14986:        if(L[0]=="-"||L[0]=="-infty"){
                   14987:                FS=-FS;
                   14988:        }else if(L[0]!="+"&&L[0]!="infty") return "";
                   14989:        FI=(length(L)==1)?1:0;
                   14990:        for(Inf=0,I=Lim0;I<Lim;I++){
                   14991:                D1=FS*8^I;D2=8*D1;
                   14992:                if(FI==0){
                   14993:                        D1=1/D1;D2=1/D2;
                   14994:                }
                   14995:                if(D1>D2){
                   14996:                        D=D1;D1=D2;D1=D;
                   14997:                        X1=D1;X2=D2;
                   14998:                }
                   14999:                if(FI==0){
                   15000:                        D1+=L[1];D2+=L[1];
                   15001:                }
                   15002:                K=fmmx(FD,[D1,D2]|mmx=1,mesh=16,dev=4);
                   15003:                if(I>Lim0){
                   15004:                        if(DF<K[1][1]-K[0][1]&&DF>10^(-8)&&DF<10^7){
                   15005:                                if(I>Lim0+1){
                   15006:                                        if(Inf==0) return "";
                   15007:                                }else Inf=1;
                   15008:                        }else if(Inf==1) return "";
                   15009:                }
                   15010:                DF=K[1][1]-K[0][1];
                   15011:        }
                   15012:        if(Inf==1){
                   15013:                if(K[0][1]>10^8) return "+";
                   15014:                else if(K[1][1]<-10^8) return "-";
                   15015:                return "";
                   15016:        }
                   15017:        V=(myfeval(FD,D1)+1.0)-1.0;
                   15018:        if(V!=0 && abs(V)<10^(-9)) return 0;
                   15019:        return V;
                   15020: }
                   15021:
                   15022: def fcont(F,LX)
                   15023: {
                   15024:        if(length(LX)==3){
                   15025:                V=LX[0];LX=cdr(LX);
                   15026:        }else V=x;
                   15027:        LX1=eval(LX[0]);LX2=eval(LX[1]);
                   15028:        if(getopt(trans)!=1 && type(F)<4) FT=f2df(F);
                   15029:        if(type(Div=getopt(mesh))!=1 || Div<=0)
                   15030:                Div = 2^(10);
                   15031:        if(type(Dev=getopt(dev))!=1 || Dev<2) Dev=16;
                   15032:        W=(LX2-LX1)/Div;
                   15033:        if((Df=getopt(dif))!=1){
                   15034:                Df=0;
                   15035:        }else{
                   15036:                if(Dev==16) Dev=6;
                   15037:                WD=W/2^(Dev+1);
                   15038:        }
                   15039:        F=FT;
                   15040:        C=2;
                   15041:        for(I=V2=V3=0;I<=Div;I++){
                   15042:                X1=X2;X2=X3;X3=LX1+I*W;V1=V2;V2=V3;
                   15043:                V3=myeval(mysubst(F,[V,X3]));
                   15044:                if(Df){
                   15045:                        if(I==Div) break;
                   15046:                        V3=(myeval(mysubst(F,[V,X3+WD]))-V3)/WD;
                   15047:                }
                   15048:                if(I==0) L=[[X3,V3]];
                   15049:                if(I<2) continue;
                   15050:                if(C*dabs(2*V2-V1-V3) > dabs(V1-V3)){
                   15051:                        X01=X1;V01=V1;X02=X2;V02=V2;X03=X3;V03=V3;
                   15052:                        for(J=0; X01!=X03; J++){
                   15053:                                if(dabs(V01-V02)>dabs(V02-V03)){
                   15054:                                        X03=X02;V03=V02;
                   15055:                                }else{
                   15056:                                        X01=X02;V01=V02;
                   15057:                                }
                   15058:                                if(J==Dev) break;
                   15059:                                X02=(X01+X02)/2;
                   15060:                                V02=myeval(mysubst(F,[V,X02]));
                   15061:                                if(Df) V02=(myeval(mysubst(F,[V,WD]))-V02)/WD;
                   15062:                                if(C*dabs(2*V02-V01-V03) < dabs(V01-V03)) break;
                   15063:                        }
                   15064:                        if(J==Dev||X01==X03) L=cons([X01,X03,V03-V01],L);
                   15065:                }
                   15066:        }
                   15067:        return reverse(L);
                   15068: }
                   15069:
1.57      takayama 15070: def xyplot(L,LX,LY)
                   15071: {
1.63      takayama 15072:        Vw=getopt(view);
                   15073:        if(type(Vw)!=1 && type(Vw)!=7 && Vw!=0) Vw=-1;
                   15074:        if(!LX){
                   15075:                L0=llget(L,1,[0]|flat=1);
1.71      takayama 15076:                LX=[lmin(L0),LXm=lmax(L0)];
                   15077:                S=SX=LX[1]-LX[0];
1.63      takayama 15078:                if(S>0){
                   15079:                        if(Vw) LX=[LX[0]-S/32,LX[1]+S/32];
                   15080:                }else LX=[LX[0]-1,LX[0]+1];
1.64      takayama 15081:        }
                   15082:        LX=map(deval,LX);
1.63      takayama 15083:        if(!LY){
                   15084:                L0=llget(L,1,[1]|flat=1);
1.71      takayama 15085:                LY=[lmin(L0),LYm=lmax(L0)];
                   15086:                S=SY=LY[1]-LY[0];
1.63      takayama 15087:                if(S>0){
                   15088:                        if(Vw) LY=[LY[0]-S/32,LY[1]+S/32];
                   15089:                }else LY=[LY[0]-1,LY[0]+1];
1.64      takayama 15090:        }
                   15091:        LY=map(deval,LY);
1.63      takayama 15092:        if(getopt(raw)==1) mycat([LX,LY]);
                   15093:        if(Vw!=-1){
                   15094:                if(Vw!=1){
                   15095:                        if(type(Vw)==7) Vw=trcolor(Vw);
                   15096:                        Opt=[["color",Vw]];
                   15097:                }else Opt=[];
                   15098:                Glib_math_coordinate=1;
                   15099:                glib_window(LX[0],LY[0],LX[1],LY[1]);
                   15100:                for(; L!=[];L=cdr(L))
                   15101:                        glib_putpixel(car(L)[0],car(L)[1]|option_list=Opt);
1.71      takayama 15102:                if((AX=getopt(ax))==1||AX==2){
                   15103:                        if(LY[0]<0&&LY[1]>0){
                   15104:                                glib_line(LX[0],0,LX[1],0);
                   15105:                                if(AX==2&&LXm>0){
                   15106:                                        E=floor(dlog(LXm)/dlog(10));
                   15107:                                        V=floor(LXm*10^(-E)+1/128)*10^E;
                   15108:                                        glib_line(V,0,V,SY/64);
                   15109:                                        glib_print(V,-SY/128,rtostr(V));
                   15110:                                }
                   15111:                        }
                   15112:                        if(LX[0]<0&&LX[1]>0){
                   15113:                                glib_line(0,LY[0],0,LY[1]);
                   15114:                                        if(AX==2&&LYm>0){
                   15115:                                                E=floor(dlog(LYm)/dlog(10)+1/64);
                   15116:                                                V=floor(LYm*10^(-E)+1/128)*10^E;
                   15117:                                                glib_line(0,V,SX/64,V);
                   15118:                                        glib_print(SX/96,V,rtostr(V));
                   15119:                                }
                   15120:
                   15121:                        }
                   15122:                }
1.63      takayama 15123:                return [LX,LY];
                   15124:        }
1.57      takayama 15125:        Opt=getopt();Opt0=delopt(Opt,["dviout","proc"]);
1.64      takayama 15126:        if(type(R=getopt(to))!=4) To=[12,8];
                   15127:        R=[To[0]/(LX[1]-LX[0]),RY=To[1]/(LY[1]-LY[0])];
                   15128:        R=[sint(R[0],4|str=0),sint(R[1],4|str=0)];
                   15129:        S="% ";
                   15130:        if(type(C=getopt(scale))!=1&&type(C)!=4){
                   15131:                Opt0=cons(["scale",R],Opt0);
                   15132:                S+="scale="+rtostr(R)+", ";
                   15133:        }
1.65      takayama 15134:        S+=rtostr(LX)+", "+rtostr(LY)+"\n";
1.64      takayama 15135:        for(L0=[],TL=L;TL!=[];TL=cdr(TL)){
1.57      takayama 15136:                TTL=map(deval,car(TL));
                   15137:                if(TTL[0]<LX[0]||TTL[0]>LX[1]||TTL[1]<LY[0]||TTL[1]>LY[1]){
                   15138:                        S+=xylines(reverse(L0)|option_list=Opt0);
                   15139:                        L0=[];
                   15140:                }else{
                   15141:                        L0=cons(TTL,L0);
                   15142:                }
                   15143:        }
                   15144:        if(length(L0)>1) S+=xylines(reverse(L0)|option_list=Opt0);
1.64      takayama 15145:        AX=getopt(ax);Opt=delopt(Opt0,"opt");
1.65      takayama 15146:        if(type(AX)==4) S+="% axis\n"+xygraph([0,0],0,LX,LX,LY|option_list=Opt);
1.64      takayama 15147:        else if((LX[0]<=0&&LX[1]>=0)||(LY[0]<=0&&LY[1]>=0))
1.65      takayama 15148:                S+="% axis\n"+xygraph([0,0],0,LX,LX,LY|option_list=cons(["ax",[0,0]],Opt));
1.57      takayama 15149:        if(getopt(dviout)!=1) return S;
                   15150:        xyproc(S|dviout=1);
1.64      takayama 15151:        return [LX,LY];
1.57      takayama 15152: }
                   15153:
1.63      takayama 15154: def xyaxis(A,X,Y)
                   15155: {
                   15156:        if(isint(Vw=getopt(view))&&Vw!=0){
                   15157:                CL=getopt(opt);
                   15158:                if(type(CL)==7) CL=trcolor(CL);
                   15159:                if(type(CL)!=0) CL=0;
                   15160:                if(CL) Opt=[[color,CL]];
                   15161:                else Opt=[];
                   15162:                Glib_math_coordinate=1;
                   15163:                UX=(X[1]-X[0])/50;UY=(Y[1]-Y[0])/50;
                   15164:                glib_window(X[0],Y[0],X[1],Y[1]);
                   15165:                glib_line(A[0],Y[0],A[0],Y[1]|option_list=Opt);
                   15166:                glib_line(X[0],A[1],X[1],A[1]|otpion_list=Opt);
                   15167:                if(length(A)>2&&A[2]){
                   15168:                        I0=-floor((A[0]-X[0])/A[2]);I1=floor((X[1]-A[0])/A[2]);
                   15169:                        for(I=I0;I<=I1;I++){
                   15170:                                IX=A[0]+A[2]*I;
                   15171:                                if(iand(Vw,2)) glib_print(IX-UX,A[1]-UY/2,rtostr(IX));
                   15172:                                glib_line(IX,A[1],IX,A[1]+UY);
                   15173:                        }
                   15174:                }
                   15175:                if(length(A)>3&&A[3]){
                   15176:                        I0=-floor((A[1]-Y[0])/A[3]);I1=floor((Y[1]-A[1])/A[3]);
                   15177:                        for(I=I0;I<=I1;I++){
                   15178:                                IY=A[1]+A[3]*I;
                   15179:                                if(iand(Vw,4)) glib_print(A[0]-UX*2,IY+UY,rtostr(IY));
                   15180:                                glib_line(A[0],IY,A[0]+UX,IY);
                   15181:                        }
                   15182:                }
                   15183:                return;
                   15184:        }
                   15185:        Opt=getopt();
                   15186:        Opt=cons(["ax",A],Opt);
                   15187:        return xygraph([0,0],0,[0,1],X,Y|option_list=Opt);
                   15188: }
                   15189:
1.6       takayama 15190: def xygraph(F,N,LT,LX,LY)
                   15191: {
                   15192:        if((Proc=getopt(proc))!=1&&Proc!=2&&Proc!=3) Proc=0;
                   15193:        if(type(DV=getopt(dviout))==4){
                   15194:                OL=delopt(getopt(),["dviout","shift","ext","cl"]);
                   15195:                OL=cons(["proc",1],OL);
                   15196:                R=xygraph(F,N,LT,LX,LY|option_list=OL);
                   15197:                OL=delopt(getopt(),["shift","ext","cl"]|inv=1);
                   15198:                return execdraw(R,DV|optilon_list=OL);
                   15199:        }
                   15200:        if(N==0) N=32;
                   15201:        if(N<0){
                   15202:                N=-N;
                   15203:                N1=-1; N2=N+1;
                   15204:        }else{
                   15205:                N1=0; N2=N;
                   15206:        }
                   15207:        if(length(LT)==3 && isvar(LT[0])==1){
                   15208:                TT=LT[0]; LT=cdr(LT);
                   15209:                F=mysubst(F,[TT,x]);
                   15210:        }
                   15211:        if(LX==0) LX=LT;
                   15212:        if((Acc=getopt(Acc))!=1) Acc=0;
                   15213:        if(Acc){
                   15214:                LX=[eval(LX[0]),eval(LX[1])];
                   15215:                LY=[eval(LY[0]),eval(LY[1])];
                   15216:                LT=[eval(LT[0]),eval(LT[1])];
                   15217:        }else{
                   15218:                LX=[deval(LX[0]),deval(LX[1])];
                   15219:                LY=[deval(LY[0]),deval(LY[1])];
                   15220:                LT=[deval(LT[0]),deval(LT[1])];
                   15221:        }
                   15222:        TD=(LT[1]-LT[0])/N;
                   15223:        if(type(Mul=getopt(scale))!=1){
                   15224:                if(type(Mul)==4){
                   15225:                        MulX=Mul[0]; MulY=Mul[1];
                   15226:                }else MulX=MulY=1;
                   15227:        }else MulX=MulY=Mul;
                   15228:        if(type(Org=getopt(org))==4){
                   15229:                Orgx=Org[0];Orgy=Org[1];
                   15230:        }else Orgx=Orgy=0;
                   15231:        if(type(F)!=4 || (getopt(para)!=1 && length(F)>1 && type(F[0])<4 && type(F[1])==4)) {
                   15232:                if(getopt(rev)!=1){
                   15233:                        F1=x; /* LX[0]+(LX[1]-LX[0])*(x-LT[0])/(TD*N); */
                   15234:                        F2=F;
                   15235:                }else{
                   15236:                        F1=F;
                   15237:                        F2=x; /* LY[0]+(LY[1]-LY[0])*(x-LT[0])/(TD*N); */
                   15238:                }
                   15239:        }else{
                   15240:                F1=F[0]; F2=F[1];
                   15241:        }
                   15242:        if(F1==0 || F2==0) LT=[];
                   15243:        if(length(LT)==2){
                   15244:                if(Acc){
                   15245:                        for(LTT=[],I=N2;I>=N1;I--)
                   15246:                                LTT=cons(eval(LT[0]+I*(LT[1]-LT[0])/N),LTT);
                   15247:                }else{
                   15248:                        for(LTT=[],I=N2;I>=N1;I--)
                   15249:                                LTT=cons(deval(LT[0]+I*(LT[1]-LT[0])/N),LTT);
                   15250:                }
                   15251:                LT=LTT;
                   15252:        }
                   15253:        Cpx=getopt(cpx);
                   15254:        if(Cpx!=1 && (str_str(rtostr(F1),"@i")>=0 || str_str(rtostr(F2),"@i")>=0))
                   15255:                Cpx=1;
                   15256:        if(type(Cpx)<0) Cpx=0;
                   15257:        if(!Acc){
                   15258:                if(type(F1)<4) F1=f2df(F1);
                   15259:                if(type(F2)<4) F2=f2df(F2);
                   15260:        }
                   15261:        if(type(Err=getopt(err))==1){
                   15262:                F1=mysubst(F1,[x,x+Err*TD/1001.23]);
                   15263:                F2=mysubst(F2,[x,x+Err*TD/1001.23]);
                   15264:        }
                   15265:        if(type(F1)==4 || type(F2)==4){
                   15266:                Dn=1;
                   15267:        }else Dn=dn(F1)*dn(F2);
                   15268:        for(V=[],PT=LT;PT!=[]; PT=cdr(PT)){
                   15269:                T=car(PT);
                   15270:                if(myfeval(Dn,T)==0){
                   15271:                        V=cons(0,V); continue;
                   15272:                }
                   15273:                if(Cpx>0||Acc){
                   15274:                        X=myfeval(F1,T);Y=myfeval(F2,T);
                   15275:                }else{
                   15276:                        X=myfdeval(F1,T);Y=myfdeval(F2,T);
                   15277:                }
                   15278:                if((N1==0||(PT!=LT&&length(PT)!=1)) && (X<LX[0]||X>LX[1]||Y<LY[0]||Y>LY[1]))
                   15279:                        V=cons(0,V);
                   15280:                else
                   15281:                        V=cons([MulX*(X-Orgx),MulY*(Y-Orgy)],V);
                   15282:        }
                   15283:        V=reverse(V);
                   15284:        Gap0=Gap=Arg=0;
                   15285:        if(type(Prec=getopt(prec))<0)
                   15286:                Level=0;
                   15287:        else if(Prec==0) Level=4;
                   15288:        else if(type(Prec)==1){
                   15289:                Level=Prec;
                   15290:                if(Level<0){
                   15291:                        Level=-Level;
                   15292:                        Gap0=1;
                   15293:                }
                   15294:        }else if(type(Prec)==4){
                   15295:                Level=Prec[0];
                   15296:                if(length(Prec)>1) Arg=Prec[1];
                   15297:                if(length(Prec)>2) Gap0=Prec[2];
                   15298:        }
                   15299:        if(Level>0){
                   15300:                if(Level>16) Level=16;
                   15301:                if(Arg<=0) Arg=30;
                   15302:                else if(Arg>120) Arg=120;
                   15303:                Arg=Acc?eval(@pi*Arg/180):deval(@pi*Arg/180);
                   15304:                SL=dcos(Arg);
                   15305:        }
                   15306:        if(Gap0>0){
                   15307:                if(Gap0<2) Gap0=16;
                   15308:                else if(Gap0>512) Gap0=512;
                   15309:                Gap=((MulX*(LX[1]-LX[0]))^2+(MulY*(LY[1]-LY[0]))^2)/(Gap0^2);
                   15310:        }
                   15311:        for(I=0;I<Level;I++){
                   15312:                for(F=K=G=0,NV=NLT=[],PLT=LT,PV=V;PLT!=[];K++,PLT=cdr(PLT),PV=cdr(PV)){
                   15313:                        TG=0;D0=D1;CLT0=CLT;CV0=CV;CV=car(PV);CLT=car(PLT);
                   15314:                        if(length(PV)>1){
                   15315:                                if((CV1=car(cdr(PV)))!=0 && CV!=0)
                   15316:                                        D1=[CV[0]-CV1[0],CV[1]-CV1[1]];
                   15317:                                else D1=0;
                   15318:                        }else K=-1; /* ? */
                   15319:                        if(K>0 &&(((D1==0||D0==0)&&(CV0!=0||CV!=0||CV1!=0)) || dvangle(D0,D1)<SL ||
                   15320:                          (Gap>0 && type(D0)==4 && (TG=(D0[0]^2+D0[1]^2-Gap)>0)))){
                   15321:                                G++;T1=(CLT0+CLT)/2;
                   15322:                                if(F==0 && (CV0!=0 || CV!=0)){
                   15323:                                        if(myfdeval(Dn,T1)==0){
                   15324:                                                NV=cons(0,NV); NLT=cons(T1,NLT);
                   15325:                                        }
                   15326:                                        if(Cpx>0||Acc){
                   15327:                                                X=myfeval(F1,T1);Y=myfeval(F2,T1);
                   15328:                                        }else{
                   15329:                                                X=myfdeval(F1,T1);Y=myfdeval(F2,T1);
                   15330:                                        }
                   15331:                                        if(K==1 && N1<0){
                   15332:                                                NV=[];NLT=[];
                   15333:                                        }
                   15334:                                        if((K>1||N1==0)&&(X<LX[0]||X>LX[1]||Y<LY[0]||Y>LY[1])){
                   15335:                                                NV=cons(0,NV);NLT=cons(T1,NLT);F=0;
                   15336:                                        }else{
                   15337:                                                NV=cons([MulX*(X-Orgx),MulY*(Y-Orgy)],NV);NLT=cons(T1,NLT);
                   15338:                                        }
                   15339:                                }
                   15340:                                NV=cons(CV,NV);NLT=cons(CLT,NLT);
                   15341:                                if(!TG&&(CV0!=0||CV1!=0)){
                   15342:                                        T2=(car(cdr(PLT))+CLT)/2;
                   15343:                                        if(myfdeval(Dn,T2)==0){
                   15344:                                                NV=cons(0,NV); NLT=cons(CLT,NLT);
                   15345:                                        }
                   15346:                                        if(Cpx>0||Acc){
                   15347:                                                X=myfeval(F1,T2);Y=myfeval(F2,T2);
                   15348:                                        }else{
                   15349:                                                X=myfdeval(F1,T2);Y=myfdeval(F2,T2);
                   15350:                                        }
                   15351:                                        if((N1==0||length(PV)!=2)&&(X<LX[0]||X>LX[1]||Y<LY[0]||Y>LY[1])){
                   15352:                                                NV=cons(0,NV);NLT=cons(T1,NLT);
                   15353:                                        }else{
                   15354:                                                NV=cons([MulX*(X-Orgx),MulY*(Y-Orgy)],NV);NLT=cons(T2,NLT);
                   15355:                                        }
                   15356:                                }
                   15357:                                if(length(PV)==2 && N1==-1)     break;
                   15358:                                F=1;
                   15359:                        }else{
                   15360:                                F=0;NV=cons(CV,NV);NLT=cons(CLT,NLT);
                   15361:                        }
                   15362:                }
                   15363:                V=reverse(NV);LT=reverse(NLT);
                   15364:                if(G==0) break;
                   15365:        }
                   15366:        if(Gap>0){
                   15367:                for(NV=[],PV=V;PV!=[];PV=cdr(PV)){
                   15368:                        NV=cons(P0=car(PV),NV);
                   15369:                        if(length(PV)>1 && P0!=0 && PV[1]!=0
                   15370:                          && (P0[0]-PV[1][0])^2+(P0[1]-PV[1][1])^2>Gap) NV=cons(0,NV);
                   15371:                }
                   15372:                V=reverse(NV);
                   15373:        }
1.18      takayama 15374:        if((Raw=getopt(raw))==1) return V;
                   15375:        if(Raw==2) return [V,LT];
1.6       takayama 15376:        OL=[["curve",1]];OLP=[];
                   15377:        if(type(C=getopt(ratio))==1){
                   15378:                OL=cons(["ratio",C],OL);OLP=cons(["ratio",C],OLP);
                   15379:        }
                   15380:        if(Acc==1) OL=cons(["Acc",1],OL);
                   15381:        if(N1<0) OL=cons(["close",-1],OL);
                   15382:        if(type(Opt=getopt(opt))!=7 && type(Opt)!=4){
                   15383:                if(Opt==0) return xylines(V|option_list=cons(["opt",0],OL));
                   15384:        }
                   15385:        OL=cons(["opt",(Proc)?0:Opt],OL);
                   15386:        if(type(Opt)>=0) OLP=cons(["opt",Opt],OLP);
                   15387:        if(type(Vb=getopt(verb))==1||type(Vb)==4){
                   15388:                OL=cons(["verb",Vb],OL);OLP=cons(["verb",Vb],OL);
                   15389:        }
                   15390:        if(Proc){
                   15391:                S=(Proc==1)?
                   15392:                        [[0,[MulX*(LX[0]-Orgx),MulX*(LX[1]-Orgx)],[MulY*(LY[0]-Orgy),MulY*(LY[1]-Orgy)],
                   15393:                        (TikZ)?1:1/10]]:[];
                   15394:                S=cons([1,OLP,xylines(V|option_list=OL)],S);
                   15395:                if(Proc==3) return car(S);
                   15396:        }else S=xylines(V|option_list=OL);
                   15397:        if(type(Pt=getopt(pt))==4){
                   15398:                if(type(Pt[0])!=4) Pt=[Pt];
                   15399:                if(length(Pt)>1 && type(Pt[1])!=4) Pt=[Pt];
                   15400:                for(PT=Pt;PT!=[];PT=cdr(PT)){
                   15401:                        PP=car(PT);
                   15402:                        if(type(PP[0])!=4) PP=[PP];
                   15403:                        P=car(PP);PP=cdr(PP);
                   15404:                        Qx=MulX*(P[0]-Orgx);Qy=MulY*(P[1]-Orgy);
                   15405:                        if(length(PP)>0 && type(PP[0])==4){             /* draw line */
                   15406:                                P=car(PP);
                   15407:                                Q1x=MulX*(P[0]-Orgx);Q1y=MulY*(P[1]-Orgy);
                   15408:                                if(length(PP)<1 || car(PP)==0 || iand(car(PP),1))
                   15409:                                         OL=["opt",(TikZ)?"-":"@{-}"];
                   15410:                                else OL=["opt",(TikZ)?".":"@{.}"];
                   15411:                                if(Proc) S=cons([1,OL,[[Qx,Qy],[Q1x,Q1y]]],S);
                   15412:                                else S=S+xylines([[Qx,Qy],[Q1x,Q1y]]|optilon_list=OL);
                   15413:                                continue;
                   15414:                        }
                   15415:                        if(length(PP)==0 || type(car(PP))!=7)  SS="$\\bullet$";
                   15416:                        else SS=car(PP);
                   15417:                        if(length(PP)<=1){
                   15418:                                if(Proc) S=cons([2,[],[Qx,Qy],[SS]],S);
                   15419:                                else S=S+xyput([Qx,Qy,SS]);
                   15420:                        }else{
                   15421:                                if(Proc) S=cons([2,[],[Qx,Qy],[[SS],"",PP[1]]],S);
                   15422:                                S=S+xyput([Qx,Qy,SS,"",PP[1]]);
                   15423:                        }
                   15424:                }
                   15425:        }
                   15426:        if(type(Ax=getopt(ax))==4){  /* draw axis */
                   15427:                Adx0=Ady0=0; Adx1=Ady1=0.1;
                   15428:                if(!TikZ){
                   15429:                        if(!XYcm) Adx1=Ady1=1;
                   15430:                        LOp="@{-}"; LxOp="+!U"; LyOp="+!R";
                   15431:                }else{
                   15432:                        LOp="-"; LxOp="below"; LyOp="left";
                   15433:                }
                   15434:                LOp0=LOp1=LOp;
                   15435:                LxOO=(Ax[1]==LY[0])?LxOp:(TikZ)?"below left":"+!UR";
                   15436:                if(type(AxOp=getopt(axopt))>0){
                   15437:                        if(type(AxOp)==1){
                   15438:                                if(AxOp>0)      Adx1=Ady1=AxOp;
                   15439:                                else if(AxOp<0){
                   15440:                                        Adx1=Ady1=0; Adx0=Ady0=AxOp;
                   15441:                                }
                   15442:                        }else if(type(AxOp)==4){
                   15443:                                if(type(T=car(AxOp))==4 && length(AxOp)>1){
                   15444:                                        if(type(T)==7){
                   15445:                                                LxOp=T; LyOp=AxOp[1];
                   15446:                                        }else if(type(T)==4){
                   15447:                                                Ay0=T[0]; Ay1=T[1]; Ax0=AxOp[1][0]; Ax1=AxOp[1][1];
                   15448:                                                if(length(T)>2) LxOp=T[2];
                   15449:                                                if(length(AxOp[1])>2) LyOp=AxOp[1][2];
                   15450:                                        }
                   15451:                                }
                   15452:                                if(length(AxOp)>2 && type(AxOp[2])==7) LxOO=AxOp[2];
                   15453:                                if(length(AxOp)>3 && type(AxOp[3])==7) LOp0=AxOp[3];
                   15454:                                if(length(AxOp)>4 && type(AxOp[4])==7) LOp1=AxOp[4];
                   15455:                        }
                   15456:                        if(type(AxOp)==7) LOp0=AxOp;
                   15457:                }
                   15458:                if(Ax[0]>=LX[0] && Ax[0]<=LX[1]){       /* draw marks on x-axis */
                   15459:                        if(Proc) S=cons([3,(type(LOp0)>=0)?[["opt",LOp0]]:[],
                   15460:                                [MulX*(Ax[0]-Orgx),MulY*(LY[0]-Orgy)],[MulX*(Ax[0]-Orgx),MulY*(LY[1]-Orgy)]],S);
                   15461:                        else S=S+xyarrow([MulX*(Ax[0]-Orgx),MulY*(LY[0]-Orgy)],
                   15462:                                [MulX*(Ax[0]-Orgx),MulY*(LY[1]-Orgy)]|opt=LOp0);
                   15463:                        if(length(Ax)>2){
                   15464:                                D=Ax[2];
                   15465:                                if(type(D)==1 && D>0){
                   15466:                                        I0=ceil((LX[0]-Ax[0])/D); I1=floor((LX[1]-Ax[0])/D);
                   15467:                                        for(DD=[],I=I0; I<=I1; I++){
                   15468:                                                if(length(Ax)<5) DD=cons(I*D,DD);
                   15469:                                                else if(Ax[4]==0) DD=cons([I*D,I*D+Ax[0]],DD);
                   15470:                                                else if(Ax[4]==1) DD=cons([I*D,I*D],DD);
                   15471:                                                else if(Ax[4]==2) DD=cons([I*D,I],DD);
                   15472:                                        }
                   15473:                                        D=DD;
                   15474:                                }
                   15475:                                if(type(D)==4){
                   15476:                                        for(;D!=[]; D=cdr(D)){
                   15477:                                                T=car(D);
                   15478:                                                if(type(T)==4) T=car(T);
                   15479:                                                X=MulX*(T+Ax[0]-Orgx); Y=MulY*(Ax[1]-Orgy);
                   15480:                                                if(T!=0){
                   15481:                                                        if(Proc) S=cons([3,(type(LOp1)>=0)?[["opt",LOp1]]:[],[X,Y+Ady0],[X,Y+Ady1]],S);
                   15482:                                                        else S=S+xyarrow([X,Y+Ady0],[X,Y+Ady1]|opt=LOp1);
                   15483:                                                }
                   15484:                                                if(type(car(D))==4){
                   15485:                                                        Arg=[(T==0)?LxOO:LxOp,D[0][1]];
                   15486:                                                        if(Proc) S=cons([2,[],[X,Y+Ady0],[Arg]],S);
                   15487:                                                        else S=S+xyput([X,Y+Ady0,Arg]);
                   15488:                                                }
                   15489:                                        }
                   15490:                                }
                   15491:                        }
                   15492:                }
                   15493:                if(Ax[1]>=LY[0] && Ax[1]<=LY[1]){       /* draw marks on y-axis */
                   15494:                        if(Proc) S=cons([3,[["opt",LOp0]],
                   15495:                                        [MulX*(LX[0]-Orgx),MulY*(Ax[1]-Orgy)],
                   15496:                                        [MulX*(LX[1]-Orgx),MulY*(Ax[1]-Orgy)]],S);
                   15497:                        else S=S+xyarrow([MulX*(LX[0]-Orgx),MulY*(Ax[1]-Orgy)],
                   15498:                                [MulX*(LX[1]-Orgx),MulY*(Ax[1]-Orgy)]|opt=LOp0);
                   15499:                        if(length(Ax)>3){
                   15500:                                D=Ax[3];
                   15501:                                if(type(D)==1 && D>0){
1.57      takayama 15502:                                        I0=ceil((LY[0]-Ax[1])/D); I1=floor((LY[1]-Ax[1])/D);
1.6       takayama 15503:                                        for(DD=[],I=I0; I<=I1; I++){
                   15504:                                                if(length(Ax)<5) DD=cons(I*D,DD);
                   15505:                                                else if(I!=0){
                   15506:                                                        if(Ax[4]==0) DD=cons([I*D,I*D+Ax[1]],DD);
                   15507:                                                        if(Ax[4]==1) DD=cons([I*D,I*D],DD);
                   15508:                                                        if(Ax[4]==2) DD=cons([I*D,I],DD);
                   15509:                                                }
                   15510:                                        }
                   15511:                                        D=DD;
                   15512:                                }
                   15513:                                if(type(D)==4){
                   15514:                                        for(;type(D)==4&&D!=[]; D=cdr(D)){
                   15515:                                                T=car(D);
                   15516:                                                if(type(T)==4) T=car(T);
                   15517:                                                X=MulX*(Ax[0]-Orgx); Y=MulY*(T+Ax[1]-Orgy);
                   15518:                                                if(T!=0){
                   15519:                                                        if(Proc) S=cons([3,(type(LOp0)>=0)?[["opt",LOp1]]:[],
                   15520:                                                                [X+Adx0,Y],[X+Adx1,Y]],S);
                   15521:                                                        else S=S+xyarrow([X+Adx0,Y],[X+Adx1,Y]|opt=LOp1);
                   15522:                                                }
                   15523:                                                if(type(car(D))==4){
                   15524:                                                        if(Proc) S=cons([2,[],[X,Y+Ady0],[[LyOp,D[0][1]]]],S);
                   15525:                                                        else S=S+xyput([X,Y+Ady0,[LyOp,D[0][1]]]);
                   15526:                                                }
                   15527:                                        }
                   15528:                                }
                   15529:                        }
                   15530:                }
                   15531:        }
                   15532:        if(Proc) return reverse(S);
                   15533:        if(getopt(dviout)!=1) return S;
                   15534:        xyproc(S|dviout=1);
                   15535: }
                   15536:
                   15537: def xyarrow(P,Q)
                   15538: {
                   15539:        Cmd = ["fill","filldaw","shade","shadedraw","clip ","pattern","path ","node","coordinate"];
                   15540:        if(type(P)<4) return "%\n";
                   15541:        SS=getopt(opt);
                   15542:        if(!TikZ){
                   15543:                if(type(Q)<4) return "";
                   15544:                S="{"+xypos(P)+" \\ar";
                   15545:                if(type(SS)==7) S=S+SS;
                   15546:                return S+" "+xypos(Q)+"};\n";
                   15547:        }
                   15548:        if(type(SS)==4 && length(SS)>1){
                   15549:                if(length(SS)>2) SU=SS[2];
                   15550:                ST=SS[1];
                   15551:                SS=SS[0];
                   15552:        }
                   15553:        if(type(SS)!=7) SS="->";
                   15554:        if(type(ST)!=7) ST=" -- ";
                   15555:        if(type(SU)!=7) SU="";
                   15556:        if(type(S=getopt(cmd))==7) S="\\"+S;
                   15557:        else S="\\draw";
                   15558:        if(type(Q)!=4){
                   15559:                if(Q>0 && Q<=length(Cmd)) S="\\"+Cmd[Q-1]+"";
                   15560:                if(SS!="-") S=S+"["+SS+"]";
                   15561:                if(SU!="") SU="["+SU+"]";
                   15562:                return S+xypos(P)+ST+SU+";\n";
                   15563:        }
1.8       takayama 15564:        if(SS!="-"&&SS!="") S=S+"["+SS+"]";
1.6       takayama 15565:        if(length(P)<3 && length(Q)<3)
                   15566:                return S+xypos(P)+ST+xypos(Q)+SU+";\n";
                   15567:        if(length(P)==2) P=[P[0],P[1],"","_0"];
                   15568:        else if(length(P)==3 || (length(P)==4 && P[3]==""))
                   15569:                P=[P[0],P[1],P[2],"_0"];
                   15570:        else if(P[3]=="")
                   15571:                P=[P[0],P[1],P[2],"_0",P[4]];
                   15572:        if(length(Q)==2) Q=[Q[0],Q[1],"","_1"];
                   15573:        else if(length(Q)==3 || (length(Q)==4 && Q[3]==""))
                   15574:                Q=[Q[0],Q[1],Q[2],"_1"];
                   15575:        else if(Q[3]=="")
                   15576:                Q=[Q[0],Q[1],Q[2],"_1",Q[4]];
                   15577:        return S+xypos(P)+" "+xypos(Q)+"("+P[3]+")"+ST+"("+Q[3]+")"+SU+";\n";
                   15578: }
                   15579:
                   15580: def xyarrows(P,Q,R)
                   15581: {
                   15582:        PQ=newvect(4);
                   15583:        PQ[0]=(type(P[0])!=4)?f2df(P[0]):P[0];
                   15584:        PQ[1]=(type(P[1])!=4)?f2df(P[1]):P[1];
                   15585:        PQ[2]=(type(Q[0])!=4)?f2df(Q[0]):Q[0];
                   15586:        PQ[3]=(type(Q[1])!=4)?f2df(Q[1]):Q[1];
                   15587:        if(type(R[0])!=4) R=[R];
                   15588:        TR=R[0];NX=TR[2];X=X0=TR[0];DX=(TR[1]-TR[0])/NX;
                   15589:        if(length(R)==2){
                   15590:                TR=R[1];NY=TR[2];Y=TR[0];DY=(TR[1]-TR[0])/NY;
                   15591:        }else{
                   15592:                NY=1;Y=DY=0;
                   15593:        }
                   15594:        if(type(L=getopt(abs))!=1) L=0;
                   15595:        if(type(Sc=getopt(scale))!=1) Sc=0;
                   15596:        OL=[];
                   15597:        if(type(Opt=getopt(opt))==7) OL=cons(["opt",Opt],OL);
                   15598:        Tb=str_tb(0,0);
                   15599:        for(J=0;J<NY;Y+=DY,J++){
                   15600:                for(I=0,X=X0;I<NX;I++,X+=DX){
                   15601:                        PX=myf2eval(PQ[0],X,Y);PY=myf2eval(PQ[1],X,Y);
                   15602:                        VX=myf2eval(PQ[2],X,Y);VY=myf2eval(PQ[3],X,Y);
                   15603:                        if(L>0){
                   15604:                                C=dnorm([VX,VY]);
                   15605:                                if(C!=0){
                   15606:                                        VX*=L/C;VY*=L/C;
                   15607:                                }
                   15608:                        }
                   15609:                        if(Sc){
                   15610:                                VX*=Sc;VY*=Sc;
                   15611:                        }
                   15612:                        if(VX||VY) str_tb(xyarrow([PX,PY],[PX+VX,PY+VY]|optilon_list=OL),Tb);
                   15613:                }
                   15614:        }
                   15615:        return str_tb(0,Tb);
                   15616: }
                   15617:
                   15618: def polroots(L,V)
                   15619: {
                   15620:        INIT=1;
                   15621:        if(type(CF=getopt(comp))!=1) CF=0;
                   15622:        OL=getopt();
                   15623:        if(CF>32){
                   15624:                CF-=64;
                   15625:                INIT=0;
                   15626:        }else OL=cons(["comp",CF+64],delopt(OL,"comp"));
                   15627:        if(type(V)==4&&length(V)==1){
                   15628:                L=L[0];V=V[0];
                   15629:        }
                   15630:        Lim=Lim2=[];
                   15631:        if(type(L)<4){
                   15632:                if(type(Lim=getopt(lim))==4){
1.17      takayama 15633:                        if(type(Lim[0])!=4){
                   15634:                                if(!isvar(Lim[0])) Lim=cons(V,[Lim]);
                   15635:                                Lim=[Lim];
                   15636:                        }
                   15637:                        if(!isvar(Lim[0][0])) Lim=[cons(V,Lim)];
1.6       takayama 15638:                        Lim=delopt(Lim,V|inv=1);
                   15639:                        if(Lim!=[]){
                   15640:                                Lim=Lim[0];
                   15641:                                if(length(Lim)==3) Lim2=Lim[2];
                   15642:                                Lim=Lim[1];
                   15643:                        }
                   15644:                }else{
                   15645:                        Lim=Lim2=[];
                   15646:                }
                   15647:                if((CF==-2||CF==-1||CF==2)&&iscoef(L,os_md.israt)){     /* Rat+Comp, Rat+Real or Rat */
                   15648:                        S=(CF==-1)?getroot(L,V|cpx=1):getroot(L,V);
                   15649:                        for(RR=[],F=x;S!=[];S=cdr(S)){
                   15650:                                if(findin(V,vars(C=car(S)))<0){         /* Rational solution */
                   15651:                                        if(type(C)<2){
                   15652:                                                if(Lim!=[]&&(real(C)<Lim[0]||real(C)>Lim[1])) continue;
                   15653:                                                if(Lim2!=[]&&(imag(C)<Lim2[0]||imag(C)>Lim2[1])) continue;
                   15654:                                        }
                   15655:                                        if(F!=C) RR=cons(F=C,RR);
                   15656:                                }else if(CF<0){                                         /* Irrational solution */
                   15657:                                        if((R=pari(roots,mysubst(C,[V,x])))!=0){
                   15658:                                                for(R=vtol(R);R!=[];R=cdr(R))
                   15659:                                                        if((C=car(R))!=F && ntype(C)<CF+6){
                   15660:                                                                if(Lim!=[]&&(real(C)<Lim[0]||real(C)>Lim[1])) continue;
                   15661:                                                                if(Lim2!=[]&&(imag(C)<Lim2[0]||imag(C)>Lim2[1])) continue;
                   15662:                                                                RR=cons(F=C,RR);
                   15663:                                                        }
                   15664:                                        }
                   15665:                                }
                   15666:                        }
                   15667:                        return qsort(RR);
                   15668:                }
                   15669:                R=pari(roots,subst(L,V,x));
                   15670:                if(R==0){
                   15671:                        R=[0];
                   15672:                        if(CF==1){
                   15673:                                for(R=[0],I=mydeg(L,V);I>1; I--)
                   15674:                                        R=cons(0,R);
                   15675:                        }
                   15676:                        return R;
                   15677:                }
                   15678:                if(CF==1){              /* Complex */
                   15679:                        if(Lim==[]&&Lim2==[]) return vtol(R);
                   15680:                        for(L=[],I=length(R)-1;I>=0;I--){
                   15681:                                C=R[I];
                   15682:                                if(Lim!=[]&&(real(C)<Lim[0]||real(C)>Lim[1])) continue;
                   15683:                                if(Lim2!=[]&&(imag(C)<Lim2[0]||imag(C)>Lim2[1])) continue;
                   15684:                                L=cons(C,L);
                   15685:                        }
                   15686:                        return L;
                   15687:                }
                   15688:                for(L=[],F=x,I=length(R)-1;I>=0;I--){   /* Real */
                   15689:                        if(ntype(R[I])<4 && F!=R[I]){
                   15690:                                if(Lim!=[] && (R[I]<Lim[0]||R[I]>Lim[1])) continue;
                   15691:                                L=cons(F=R[I],L);
                   15692:                        }
                   15693:                }
                   15694:                return qsort(L);
                   15695:        }
                   15696:        if(SS==0&&INIT==1){
                   15697:                SS=polroots(L,V|option_list=OL);
                   15698:                if(SS!=0) return SS;
1.18      takayama 15699:                for(C=0;SS==0&&C<5;C++){
1.6       takayama 15700:                        I=(C==0)?1:(iand(random(),0xff)-0x80);
                   15701:                        for(LL=[],K=length(L)-1;K>=0;K--){
                   15702:                                for(Q=0,J=length(L)-1;J>=0;J--)
                   15703:                                        Q+=L[J]*(I+K)^J;
                   15704:                                LL=cons(Q,LL);
                   15705:                        }
                   15706:                        SS=polroots(LL,V|option_list=OL);
                   15707:                        if(SS!=0) return SS;
                   15708:                }
                   15709:                return SS;
                   15710:        }
                   15711:        C=2^(-32);
                   15712:        if(type(getopt(err))==1) C=err;
                   15713:        if((N=length(V))!=length(L)) return [];
                   15714:        if(N==1) return polroots(L[0],V[0]|option_list=OL);
                   15715:        for(L1=[],I=1;I<N;I++){
                   15716:                Res=res(V[0],L[I-1],L[I]);
                   15717:                if(type(Res)<2) return Res;
                   15718:                L1=cons(res(V[0],L[I-1],L[I]),L1);
                   15719:        }
                   15720:        R=polroots(L1,V1=cdr(V)|option_list=OL);
                   15721:        if(type(R)<2) return R;
                   15722:        for(SS=[];R!=[];R=cdr(R)){
                   15723:                RS=(N==2)?[car(R)]:car(R);
                   15724:                for(I=0,L0=L[0];I<N-1;I++) L0=mysubst(L0,[V1[I],RS[I]]);
1.17      takayama 15725:                if(L0==0) return 0;
1.6       takayama 15726:                S0=polroots(L0,V[0]|option_list=OL);
                   15727:                if(type(S0)<2) return S0;
                   15728:                for(S=S0;S!=[];S=cdr(S)){
                   15729:                        S0=cons(car(S),RS);
                   15730:                        for(LT=cdr(L);LT!=[];LT=cdr(LT)){
                   15731:                                for(I=0,TV=car(LT);I<N;I++) TV=mysubst(TV,[V[I],S0[I]]);
                   15732:                                if(abs(TV)>C) break;
                   15733:                        }
                   15734:                        if(LT==[]) SS=cons(S0,SS);
                   15735:                }
                   15736:        }
                   15737:        return reverse(SS);
                   15738: }
                   15739:
1.71      takayama 15740: def lsub(P)
                   15741: {
                   15742:        if((T=type(P[0]))==4){
                   15743:                Q=reverse(P[1]);P=reverse(P[0]);
                   15744:                for(R=[];P!=[];P=cdr(P),Q=cdr(Q)) R=cons(car(Q)-car(P),R);
                   15745:                return R;
                   15746:        }else if(T==5){
                   15747:                L=length(P[0]);Q=P[1];P=P[0];
                   15748:                R=newvect(L);
                   15749:                for(V=[],L--;L>=0;L--) R[L]=Q[L]-P[L];
                   15750:                return R;
                   15751:        }
                   15752:        return P;
                   15753: }
                   15754:
                   15755: def dext(P,Q)
                   15756: {
                   15757:        P=lsub(P);Q=lsub(Q);
                   15758:        return P[0]*Q[1]-P[1]*Q[0];
                   15759: }
                   15760:
1.6       takayama 15761: def ptcommon(X,Y)
                   15762: {
                   15763:        if(length(X)!=2 || length(Y)!=2) return 0;
                   15764:        if(type(X[1])==4){ /* X is a line */
                   15765:                if((In=getopt(in))==-1||In==-2||In==-3){
                   15766:                        X0=(X[0][0]+X[1][0])/2;X1=(X[0][1]+X[1][1])/2;
                   15767:                        X=[[X0,X1],[X0+X[1][1]-X[0][1],X1-X[1][0]+X[0][0]]];
                   15768:                        if(In==-1&&type(Y[1])==4) return ptcommon(Y,X|in=-2);
                   15769:                        /* for the second line */
                   15770:                        if(In==-3) In=1;
                   15771:                        else In=0;
                   15772:                }else if(In==2||In==3){
                   15773:                        X=(X[1][0]-X[0][0])+(X[1][1]-X[0][1])*@i;
                   15774:                        if(X==0) return 0;
                   15775:                        Y=(Y[1][0]-Y[0][0])+(Y[1][1]-Y[0][1])*@i;
                   15776:                        X=myarg(Y/X);
                   15777:                        return (In==2)?X:(X*180/deval(@pi));
                   15778:                }else if(In!=1) In=0;
                   15779:                if(type(Y[0])<=3){
                   15780:                        if(In==1){
                   15781:                                return [(Y[1]*X[0][0]+Y[0]*X[1][0])/(Y[0]+Y[1]),
                   15782:                                (Y[1]*X[0][1]+Y[0]*X[1][1])/(Y[0]+Y[1])];
                   15783:                        }
                   15784:                        XX=X[1][0]-X[0][0];YY=X[1][1]-X[0][1];
                   15785:                        Arg=(length(Y)<2)?0:Y[1];
                   15786:                        Arg=deval(Arg);
                   15787:                        if(Arg!=0){
                   15788:                                S=dcos(Arg)*XX-dsin(Arg)*YY;
                   15789:                                YY=dsin(Arg)*XX+dcos(Arg)*YY;
                   15790:                                XX=S;
                   15791:                        }
                   15792:                        S=dnorm([XX,YY]);
                   15793:                        if(S!=0){
                   15794:                                XX*=Y[0]/S;YY*=Y[0]/S;
                   15795:                        }
                   15796:                        return [X[1][0]+XX,X[1][1]+YY];
                   15797:                }
                   15798:                S=[X[0][0]+(X[1][0]-X[0][0])*x_,X[0][1]+(X[1][1]-X[0][1])*x_];
                   15799:                if(type(Y[1])==4){ /* Y is a line */
                   15800:                        T=[Y[0][0]+(Y[1][0]-Y[0][0])*y_-S[0],
                   15801:                                Y[0][1]+(Y[1][1]-Y[0][1])*y_-S[1]];
                   15802:                        R=lsol(T,[x_,y_]);
1.71      takayama 15803:                        if(type(R[0])==4&&type(R[1])==4&&R[0][0]==x_&&R[1][0]==y_){
                   15804:                                        /* unique sol of parameters */
                   15805:                                if(In && (R[0][1]<0||R[0][1]>1||R[1][1]<0||R[1][1]>1) ) return 0;
                   15806:                                return subst(S,x_,R[0][1],y_,R[1][1]);
1.6       takayama 15807:                        }
1.71      takayama 15808:                        if((type(R[0])>0&&type(R[0])<4)||(type(R[1])>0&&type(R[1])<4)) return 0;  /* no solution */
                   15809:                        F=0;
                   15810:                        if(X[0]==X[1]) F=1;
                   15811:                        else if(Y[0]==Y[1]) F=2;
                   15812:                        if(!In){
                   15813:                                if(!F) return 1;
                   15814:                                else if(F==1) return X[0];
                   15815:                                else if(F==2) return Y[0];
                   15816:                        }
                   15817:                        X0=X[0];X1=X[1];
                   15818:                        if(X0>X1){R=X0;X0=X1;X1=R;}
                   15819:                        Y0=Y[0];Y1=Y[1];
                   15820:                        if(Y0>Y1){R=Y0;Y0=Y1;Y1=R;}
                   15821:                        if(X0<Y0) X0=Y0;
                   15822:                        if(Y0>Y1) X1=Y1;
                   15823:                        if(X0>X1) return 0;
                   15824:                        if(X0<X1) return [X0,X1];
                   15825:                        return X0;
1.6       takayama 15826:                }else if(Y[1]==0){ /* orth */
                   15827:                        T=[Y[0][0]+(X[1][1]-X[0][1])*y_-S[0],
                   15828:                                Y[0][1]-(X[1][0]-X[0][0])*y_-S[1]];
                   15829:                        R=lsol(T,[x_,y_]);
                   15830:                        if(type(R[0])==4&&type(R[1])==4&&R[0][0]==x_&&R[1][0]==y_){
                   15831:                                if(!In||(R[0][1]>=0&&R[0][1]<=1))
                   15832:                                        return subst(S,x_,R[0][1],y_,R[1][1]);
                   15833:                        }
                   15834:                        return (X[0]==X[1])?0:1;
                   15835:                }else if(type(Y[1])==1 && Y[1]>0){ /* circle */
                   15836:                        T=(S[0]-Y[0][0])^2+(S[1]-Y[0][1])^2-Y[1]^2;
                   15837:                        D=mycoef(T,1,x_)^2-4*mycoef(T,0,x_)*mycoef(T,2,x_);
                   15838:                        if(D==0){
                   15839:                                V=mycoef(T,1,x_)/(2*mycoef(T,2,x_));
                   15840:                                if(!in||(V>=0&&V<=1)) return [subst(S,x_,V)];
                   15841:                        }
                   15842:                        else if((type(D)==1&&D>0)){
                   15843:                                D=dsqrt(D);
                   15844:                                V=-(mycoef(T,1,x_)+D)/(2*mycoef(T,2,x_));
                   15845:                                if(!In||(V>=0&&V<=1)) L=[subst(S,x_,V)];
                   15846:                                else L=[];
                   15847:                                V=(D-mycoef(T,1,x_))/(2*mycoef(T,2,x_));
                   15848:                                if(!In||(V>=0&&V<=1)) L=cons(subst(S,x_,V),L);
                   15849:                                if(length(L)>0) return L;
                   15850:                        }
                   15851:                }
                   15852:                return 0;
                   15853:        }
                   15854:        if(type(Y[1])==4 || X[1]==0) return ptcommon(Y,X);
                   15855:        /* X is a circle */
                   15856:        if(Y[1]==0){    /* tangent line */
                   15857:                if(Y[0][0]==X[0][0]+X[1] || Y[0][0]==X[0][0]-X[1]) L=[[Y[0][0],X[0][1]]];
                   15858:                else L=[];
                   15859:                P=(Y[0][0]+x_-X[0][0])^2+(Y[0][1]+x_*y_-X[0][1])^2-X[1]^2;
                   15860:                Q=mycoef(P,1,x_)^2-4*mycoef(P,2,x_)*mycoef(P,0,x_);
                   15861:                for(R=polroots(Q,y_);R!=[];R=cdr(R)){
                   15862:                        X0=-subst(mycoef(P,1,x_)/(2*mycoef(P,2,x_)),y_,car(R));
                   15863:                        L=cons([Y[0][0]+X0,Y[0][1]+car(R)*X0],L);
                   15864:                }
                   15865:        }else{ /* Y is a circle */
                   15866:                P=(x_-X[0][0])^2+(y_-X[0][1])^2-X[1]^2;
                   15867:                Q=(x_-Y[0][0])^2+(y_-Y[0][1])^2-Y[1]^2;
                   15868:                V=(X[0][0]!=Y[0][0])?[x_,y_]:[y_,x_];
                   15869:                R=subst(P,V[0],T=lsol(P-Q,V[0]));
                   15870:                if(type(T[0])<4) return (T[0]==0)?1:0;
                   15871:                S=polroots(R,V[1]);
                   15872:                for(L=[];S!=[];S=cdr(S)){
                   15873:                        R=subst(T,V[1],car(S));
                   15874:                        if(V[0]==x_) L=cons([R,car(S)],L);
                   15875:                        else L=cons([S,R],L);
                   15876:                }
                   15877:        }
                   15878:        if(length(L)!=0) return L;
                   15879:        return 0;
                   15880: }
                   15881:
1.71      takayama 15882:
                   15883: def ptcontain(P,L)
                   15884: {
                   15885:        if(type(car(P))==4){
                   15886:                if((C=getopt(common))!=1) C=0;
                   15887:                if((F0=ptcontain(P[0])&&!C)) return F0;
                   15888:                if((F1=ptcontain(P[1])&&!C)) return F1;
                   15889:                if(F0&&F1) return P;    /* include */
                   15890:                L=cons(L[2],L);         /* outside part exists */
                   15891:                for(I=1,R=[];I<4;I++,L=cdr(L)){
                   15892:                        if(!(F[I]=ptcotain(P,[L[0],L[1]]))){
                   15893:                                if(C) continue;
                   15894:                                return -1;
                   15895:                        }
                   15896:                        if(type(F[I])==4&&length(F[I])==2)      /* infinite points */
                   15897:                                return F[I];
                   15898:                        else R=cons(F[I],R);
                   15899:                }
                   15900:                if(R==[]) return 0;             /* no intersection */
                   15901:                if(F1==1) return [P[0],car(R)];
                   15902:                if(F2==1) return [P[1],car(R)];
                   15903:                if(length(R)>1 && R[0]==R[1]) R=cdr(R);
                   15904:                return R;
                   15905:        }
                   15906:        if(dext([L[0],L[1]],[L[0],L[2]])<0) L=[L[0],L[2],L[1]];
                   15907:        L=cons(L[2],L);
                   15908:        for(I=F=1;I<4;I++,L=cdr(L)){
                   15909:                if((V=dext([L[0],L[1]],[L[0],P])) < 0) return 0;
                   15910:                if(!V) F++;
                   15911:        }
                   15912:        return F;
                   15913: }
                   15914:
1.6       takayama 15915: def tobezier(L)
                   15916: {
                   15917:        if((Div=getopt(div))==1||Div==2){
                   15918:                if(length(L)!=4) return [tobezier(L|inv=[0,1/2]),tobezier(L|inv=[1/2,1])];
                   15919:                if(type(L)==4) L=ltov(L);
                   15920:                if(type(L[0])==4)
                   15921:                        L=[ltov(L[0]),ltov(L[1]),ltov(L[2]),ltov(L[3])];
                   15922:                S=[(L[0]+3*L[1]+3*L[2]+L[3])/8];
                   15923:                T=[L[3]];
                   15924:                S=cons((L[0]+2*L[1]+L[2])/4,S);
                   15925:                T=cons((L[2]+L[3])/2,T);
                   15926:                S=cons((L[0]+L[1])/2,S);
                   15927:                T=cons((L[1]+2*L[2]+L[3])/4,T);
                   15928:                S=cons(L[0],S);
                   15929:                T=cons((L[0]+3*L[1]+3*L[2]+L[3])/8,T);
                   15930:                return [S,T];
                   15931:        }
                   15932:        if(Div>2&&Div<257){
                   15933:                L=tobezier(L);
                   15934:                for(R=[],I=Div-1;I>=0;I--)
                   15935:                        R=cons(tobezier(L|inv=[I/Div,(I+1)/Div]),R);
                   15936:                return R;
                   15937:        }
                   15938:        if((V=getopt(inv))==1 || type(V)>3){
                   15939:                if(type(L[0])>3 && type(V)>3) L=tobezier(L);
                   15940:                if(type(V)>3 && length(V)>2) V2=V[2];
                   15941:                if(type(V2)!=2) V2=t;
                   15942:                if(type(V)>3) L=subst(L,V2,(V[1]-V[0])*V2+V[0]);
                   15943:                N=mydeg(L,V2);
                   15944:                for(R=[],I=0;I<=N;I++){
                   15945:                        RT=mycoef(L,I,V2);
                   15946:                        R=cons(RT/binom(N,I),R);
                   15947:                        L-=RT*V2^I*(1-V2)^(N-I);
                   15948:                }
                   15949:                return reverse(R);
                   15950:        };
                   15951:        N=length(L)-1;
                   15952:        V=newvect(2);
                   15953:        for(I=0;I<=N;I++,L=cdr(L)){
                   15954:                if(type(X=car(L))==4) X=ltov(X);
                   15955:                V+=X*binom(N,I)*t^I*(1-t)^(N-I);
                   15956:        }
                   15957:        return V;
                   15958: }
                   15959:
                   15960: def cutf(F,X,VV)
                   15961: {
                   15962:        if(type(car(V=VV))==2){
                   15963:                Y=[car(V),X];
                   15964:                V=cdr(V);
                   15965:        }else Y=X;
                   15966:        if(type(X)>1){
                   15967:                Y=(type(Y)==4)?Y[0]:x;
                   15968:                V1=makenewv(F);
                   15969:                if(X==Y||Y==x){
                   15970:                        V2=makenewv([F,V1]);
                   15971:                        F=mysubst(F,[Y,V2]);
                   15972:                        V=cons(V2,V);
                   15973:                }
                   15974:                return [V1,[V1,os_md.cutf,[F],X,[V]]];
                   15975:        }
                   15976:        if(car(V)!=[] && X<car(V)[0]) return myfeval(car(V)[1],Y);
                   15977:        for(V=cdr(V); ;V=R){
                   15978:                if((R=cdr(V))==[]){
                   15979:                        if(car(V)!=[] && car(V)[0]<X) return myfeval(car(V)[1],Y);
                   15980:                        return myfeval(F,Y);
                   15981:                }
1.20      takayama 15982:                if(car(V)==[]||X>car(V)[0]) continue;
1.6       takayama 15983:                if(X==car(V)[0]) return car(V)[1];
                   15984:                return myfeval(F,Y);
                   15985:        }
                   15986: }
                   15987:
1.12      takayama 15988: def fsum(F,L)
1.6       takayama 15989: {
1.12      takayama 15990:        if(getopt(df)==1){
                   15991:                F=f2df(F);
                   15992:        }else Sub=getopt(subst);
1.6       takayama 15993:        if(type(L[0])==2){
                   15994:                X=L[0];
                   15995:                L=cdr(L);
                   15996:        }else X=0;
                   15997:        V=(length(L)>2)?L[2]:1;
                   15998:        for(R=0,I=L[0];;I+=V){
                   15999:                if(V==0||(I-L[1])*V>0) return R;
1.12      takayama 16000:                R+=(Sub==1)?subst(F,X?X:x,I):os_md.myfeval(F,X?[X,I]:I);
1.6       takayama 16001:        }
                   16002: }
                   16003:
                   16004: def periodicf(F,L,X)
                   16005: {
                   16006:        if(type(L)==4) L=[eval(L[0]),eval(L[1])];
                   16007:        else L=eval(L);
                   16008:        if(isvar(X)){
1.20      takayama 16009:                Y=makenewv([X,F]);
                   16010:                Z=makenewv([X,Y,F]);
1.16      takayama 16011:                return [Z,[Z,os_md.periodicf,[mysubst(F,[x,Y])],(type(L)==4)?[L]:L,[[Y,X]]]];
                   16012:        }
                   16013:        if(type(X)==4){
                   16014:                V=X[0];
                   16015:                X=X[1];
                   16016:        }else V=x;
                   16017:        if(type(F)==5){
                   16018:                X=eval(X);
                   16019:                return myfeval(F[floor(X/L)%length(F)],[V,X-floor(X/L)*L]);
1.6       takayama 16020:        }
                   16021:        if(type(L)==4){
                   16022:                X-=floor((X-L[0])/(L[1]-L[0]))*(L[1]-L[0]);
                   16023:                return myfeval(F,[V,X]);
                   16024:        }
                   16025: }
                   16026:
                   16027: def cmpf(X)
                   16028: {
                   16029:        if(type(X)>3){
                   16030:                if(type(L)==7) return [S_Fc,Dx,S_Ic,S_Ec,S_EC,S_Lc];
                   16031:                S_Lc=0;
                   16032:                if(type(S_Fc=X[0])!=4) S_Fc=f2df(S_Fc);
                   16033:                S_Ic=X[1];
                   16034:                if(length(S_Ic)>2){
                   16035:                        S_Fc=mysubst(S_Fc,[S_Ic[0],x]);
                   16036:                        S_Ic=cdr(S_Ic);
                   16037:                }
                   16038:                S_Dc=(type(S_Ic[0])==7)?1:0;
                   16039:                if(type(S_Ic[1])==7) S_Dc=ior(S_Dc,2);
                   16040:                if(type(S_Ec=getopt(exp))!=1) S_Ec=0;
                   16041:                if(S_Ec<=0){
                   16042:                        S_EC=-S_Ec;
                   16043:                        if(S_EC==0) S_EC=1;
                   16044:                        if(S_Dc==3) S_EC*=2;
                   16045:                        else S_EC/=4;
                   16046:                        if(type(F=X[0])==3&&vars(F)==[x]&&(D=deg(nm(F),x))==deg(dn(F),x)-2){
                   16047:                                S_Lc=S_EC*coef(nm(F),D,x)/coef(dn(F),D+2,x);
                   16048:                        }
                   16049:                }else{
                   16050:                        S_EC=S_Ec;
                   16051:                        if(S_Dc==3) S_EC*=12;
                   16052:                        else S_EC/=6;
                   16053:                }
                   16054:                if(type(S_Fc)==3) S_Fc=red(S_Fc);
                   16055:                S_EC=1/S_EC;
                   16056:                return [z_,[z_,os_md.cmpf,x]];
                   16057:        }
                   16058:        if(X<=0 && iand(S_Dc,1)) return S_Lc;
                   16059:        if(X>=1 && iand(S_Dc,2)) return S_Lc;
                   16060:        if(S_Dc==3){
                   16061:                if(S_Ec>0){
                   16062:                        Y0=dexp(1/X)*S_EC;
                   16063:                        Y1=dexp(1/(1-X))*S_EC;
                   16064:                        return myfeval(S_Fc,Y1-Y0)*(Y0/X^2+Y1/(1-X)^2);
                   16065:                }
                   16066:                return myfeval(S_Fc,S_EC/(1-X)-S_EC/X)*(S_EC/(1-X)^2+S_EC/X^2);
                   16067:        }
                   16068:        if(S_Dc==1){
                   16069:                if(S_Ec>0){
                   16070:                        Y=dexp(1-1/X);
                   16071:                        R=myfeval(S_Fc,S_EC*(Y-1)+I[1])*Y;
                   16072:                }
                   16073:                else R=myfeval(S_Fc,I[1]+(1-1/X)*S_EC);
                   16074:                return R*S_EC/X^2;
                   16075:        }
                   16076:        if(S_Dc==2){
                   16077:                if(S_Ec>0){
                   16078:                        Y=dexp(X/(1-X));
                   16079:                        R=myfeval(S_Fc,S_EC*(Y-1)+S_Ic[0])*Y;
                   16080:                }else R=myfeval(S_Fc,S_EC*X/(1-X)+S_Ic[0]);
                   16081:                return R*S_EC/(1-X)^2;
                   16082:        }
                   16083:        X=S_Ic[0]+(S_Ic[1]-S_Ic[0])*X;
                   16084:        return myfeval(S_Fc,X)/(S_Ic[1]-Ic[0]);
                   16085: }
                   16086:
                   16087: def fresidue(P,Q)
                   16088: {
                   16089:        if(iscoef(Q,os_md.israt)) S=fctr(Q);
                   16090:        else S=[[Q,1]];
                   16091:        for(R=[];S!=[];S=cdr(S)){
                   16092:                T=car(S);
                   16093:                if((D=mydeg(T[0],z))==0) continue;
                   16094:                L=[];
                   16095:                if(iscoef(T[0],os_md.iscrat)) L=getroot(T[0],z|cpx=2);
                   16096:                if(findin(z,vars(L))>=0) L=[];
                   16097:                if(L==[]) L=polroots(T[0],z|comp=-1);
                   16098:                for(;L!=[];L=cdr(L)){
                   16099:                        QQ=Q;
                   16100:                        for(I=T[1]; I>1;I--) QQ=mydiff(QQ,z);
                   16101:                        for(U=0,W=I=T[1];I>0;I--,W++){
                   16102:                                QQ=diff(QQ,z);
                   16103:                                U+=subst(QQ,z,L[0])*(z-L[0])^(W-T[1])/fac(W);
                   16104:                        }
                   16105:                        UD=mydiff(U,z);
                   16106:                        for(I=T[1],K=1,PP=P; I>1;I--,K++)
                   16107:                                PP=diff(PP,z)*U-K*PP*UD;
                   16108:                        QQ=subst(PP,z,L[0])/subst(U,z,L[0])^K;
                   16109: /*                     if(D==2) QQ=sqrt2rat(QQ); */
                   16110:                        R=cons([L[0],sqrt2rat(QQ)],R);
                   16111:                }
                   16112:        }
                   16113:        if(type(L=getopt(cond))==4){
                   16114:                for(S=[];R!=[];R=cdr(R)){
                   16115:                        Z=car(R);
                   16116:                        for(LL=L;LL!=[];LL=cdr(LL)){
                   16117:                                X=real(car(Z));Y=imag(car(Z));
                   16118:                                if(myf3eval(car(LL),X,Y,car(Z))<=0) break;
                   16119:                        }
                   16120:                        if(LL==[]) S=cons(Z,S);
                   16121:                }
                   16122:                R=reverse(S);
                   16123:        }
                   16124:        if((Sum=getopt(sum))==1||Sum==2){
                   16125:                for(S=0;R!=[];R=cdr(R)) S+=car(R)[1];
                   16126:                if(Sum==2) S*=2*@pi*@i;
                   16127:                return sqrt2rat(S);
                   16128:        }
                   16129:        return R;
                   16130: }
                   16131:
                   16132: def fint(F,D,V)
                   16133: {
                   16134:        if(((L=length(V))==2 || (L==3&&isvar(V[0])<3))
                   16135:          && (type(V[L-1])==7||(type(V[L-1])<3&&type(eval(V[L-1]))<2)))
                   16136:   /* real integral */
                   16137:                return areabezier([F,D,V]|option_list=getopt());
                   16138:   /* complex integral */
                   16139:        if(L>1&&type(V[1])==4&&type(V[1][1])<4){
                   16140:                if(type(V[0])==4&&type(V[0][0])<2){
                   16141:                        for(R=[],VT=car(V),VV=cdr(V);VV!=[];VV=cdr(VV),VT=VU){
                   16142:                                if((VU=car(VV))==-1) VU=car(V);
                   16143:                                R=cons([ptcommon([VT,VU],[t,1-t]|in=1),[0,1]],R);
                   16144:                        }
                   16145:                        V=reverse(R);
                   16146:                }
                   16147:                else if(L==2) V=[V];
                   16148:        }
                   16149:        Opt=cons(["cpx",1],getopt());
                   16150:        for(R=0;V!=[];V=cdr(V)){
                   16151:                VT=car(V);
                   16152:                X=car(VT)[0];XD=red(diff(X,t));
                   16153:                Y=car(VT)[1];YD=red(diff(Y,t));
                   16154:                F=mysubst(F,[[x,X],[y,Y],[z,X+@i*Y]]);
                   16155:                if(type(F)==4)
                   16156:                        FF=cons(F[0]*(XD+@i*YD),cdr(F));
                   16157:                else FF=red(F*(XD+@i*YD));
                   16158:                R+=areabezier([FF,D,cons(t,VT[1])]|option_list=Opt);
                   16159:        }
                   16160:        return R;
                   16161: }
                   16162:
                   16163: def areabezier(V)
                   16164: {
                   16165:        if(getopt(cpx)==1){
                   16166:                Opt=delopt(getopt(),"cpx");
                   16167:                F=V[0];
                   16168:                if(!isvar(Var=V[2][0])) Var=x;
                   16169:                if(type(F)==3 && vars(F)==[Var] && imag(dn(F))!=0){
                   16170:                        F=(nm(F)*conj(dn(F)))/(dn(F)*conj(dn(F)));
                   16171:                        V0=red(real(nm(F))/dn(F));
                   16172:                        R=areabezier([V0,V[1],V[2]]|option_list=Opt);
                   16173:                        V0=red(imag(nm(F))/dn(F));
                   16174:                        return R+@i*areabezier([V0,V[1],V[2]]|option_list=Opt);
                   16175:                }
                   16176:                if(getopt(Acc)!=1) F=f2df(F);
                   16177:                V0=compdf([o,[o,real,o_]],o_,F);
                   16178:                R=areabezier([V0,V[1],V[2]]|option_list=Opt);
                   16179:                V0=compdf([o,[o,imag,o_]],o_,F);
                   16180:                return R+@i*areabezier([V0,V[1],V[2]]|option_list=Opt);
                   16181:        }
                   16182:        if(type(V[0])!=4 || vars(V[0][0])!=0){
                   16183:                Mx=[-2.0^(512),2.0^(512)];
                   16184:                I=length(V[2]);
                   16185:                if(type(V[2][I-1])==7||type(V[2][I-2])==7){     /* infinite interval */
                   16186:                        if(type(Ec=getopt(exp))==1) R=cmpf([V[0],V[2]]|exp=Ec);
                   16187:                        else R=cmpf([V[0],V[2]]);
                   16188:                        V=[R,V[1],[0,1]];
                   16189:                }
                   16190:                if(type((Int=getopt(int)))==1 && type(V[0])<4 && (V1=V[1])>=0){
                   16191:                        if(Int==2&&iand(V1,1)) V1++;
                   16192:                        if(!V1) V1=32;
                   16193:                        Opt=cons(["raw",1],getopt());
                   16194:                        W=xygraph(V[0],V[1],V[2],Mx,Mx|option_list=Opt);
                   16195:                        SS=W[0][1];
                   16196:                        for(S0=S1=0,I=0,L=W;L!=[] && I<=V1;I++, L=cdr(L)){
                   16197:                                if(iand(I,1)) S1+=car(L)[1];
                   16198:                                else S0+=car(L)[1];
                   16199:                                if (I==V1) SS+=car(L)[1];
                   16200:                        }
                   16201:                        VV=deval(V[2][1]-V[2][0]);
                   16202:                        if(Int==2)
                   16203:                                return (2*S0+4*S1-SS)*VV/(3*V1);
                   16204:                        else
                   16205:                                return (2*S0+2*S1-SS)*VV/(2*V1);
                   16206:                }
                   16207:                Opt=cons(["opt",0],getopt());
                   16208:                V=xygraph(V[0],V[1],V[2],Mx,Mx|option_list=Opt);
                   16209:        }
                   16210:        if(type(V[0][0])!=4) V=os_md.lbezier(V);
                   16211:        for(S=0; V!=[]; V=cdr(V)){
                   16212:                B=tobezier(car(V));
                   16213:                P=intpoly(B[1]*diff(B[0],t),t);
                   16214:                S+=mysubst(P,[t,1]);
                   16215:        }
                   16216:        return S;
                   16217: }
                   16218:
                   16219: def velbezier(V,L)
                   16220: {
                   16221:        if(L==0) L=[t,0,1];
                   16222:        else L=[(length(L)==3)?L[2]:t,L[0],L[1]];
                   16223:        for(R=[],II=length(V)-1;II>=0;II--){
                   16224:                S=fmmx(diff(V[II],L[0]|dif=1),L|dif=1);
                   16225:                for(U=0;S!=[];S=cdr(S)) if((T=abs(car(S)[1]))>U) U=T;
                   16226:                R=cons(U,R);
                   16227:        }
                   16228:        return R;
                   16229: }
                   16230:
                   16231: def ptbezier(V,L)
                   16232: {
                   16233:        if(type(V[0])==4&&type(V[0][0])!=4)  V=lbezier(V);
                   16234:        K=length(V);
                   16235:        if(type(L)<2){
                   16236:                if(L<0) return K;
                   16237:                if(L>=K-1) L=[K-1,1];
                   16238:                else{
                   16239:                        L0=floor(L);
                   16240:                        if(L0>=K-1) L0=K-1;
                   16241:                        L=[L0,L-L0];
                   16242:                }
                   16243:        }
                   16244:        if(L[0]>=0) B=V[L[0]];
                   16245:        else B=V[K+L[0]];
                   16246:        B=tobezier(B);
                   16247:        BB=[diff(B[0],t),diff(B[1],t)];
                   16248:        return [subst(B,t,L[1]),subst(BB,t,L[1])];
                   16249: }
                   16250:
1.70      takayama 16251: /*
                   16252: def isroot(P,Q,I)
                   16253: {
                   16254:        if(subst(P,X,X0=I[0])*subst(P,X,I[1])<=0) return 1;
                   16255:        XM=(I[1]+I[0])/2;W=XM-X0;
                   16256:        if(W<0) W=-W;
                   16257:        X=var(P);
                   16258:        if(!Q) Q=diff(P,X);
                   16259:        Q=subst(Q,X,X+I2);D=deg(Q,X);
                   16260:        for(M=0,P=1,I=deg(Q,X);I<=D;I++){
                   16261:                V=coef(Q,I,X);
                   16262:                M+=(V<0?-V:V)*P;
                   16263:                P*=W;
                   16264:        }
                   16265:        V=subst(P,X,X0);
                   16266:        if(V<0) V=-V;
                   16267:        return (V-M<=0) 2:0;
                   16268: }
                   16269: */
                   16270:
                   16271: def sgnstrum(L,V)
                   16272: {
                   16273:        X=var(car(L));
                   16274:        if(X==0) X=var(L[1]);
                   16275:        for(F=N=0;L!=[];L=cdr(L)){
                   16276:                P=car(L);
                   16277:                if(type(V)==7){
                   16278:                        C=coef(P,D=deg(P,X),X);
                   16279:                        if(V=="-"&&iand(D,1)) C=-C;
                   16280:                }else C=subst(P,X,V);
                   16281:                if(!C) continue;
                   16282:                if(C*F<0) N++;
                   16283:                F=C;
                   16284:        }
                   16285:        return N;
                   16286: }
                   16287:
                   16288: def polstrum(P)
                   16289: {
                   16290:        X=vars(P0=P);
                   16291:        if(!length(X)) return [];
                   16292:        X=car(X);
                   16293:        if(isfctr(P)){
                   16294:                D=gcd(P,Q=diff(P,X));
                   16295:                P=sdiv(P,D);
                   16296:                if(getopt(mul)==1&&type(getopt(num))<0)
                   16297:                        return append(polstrum(D|mul=1),[P]);
                   16298:        }
                   16299:        D=deg(P,X);
                   16300:        P=P/coef(P,deg(P,X),X);
                   16301:        Q=diff(P,X)/D;
                   16302:        for(L=[Q,P];D>0;){
                   16303:                R=urem(P,Q);
                   16304:                if((D=deg(R,X))<0) break;
                   16305:                C=coef(R,D,X);
                   16306:                if(C>0) C=-C;
                   16307:                R/=C;
                   16308:                L=cons(R,L);
                   16309:                P=Q;Q=R;
                   16310:        }
                   16311:        if(type(N=getopt(num))>0){
                   16312:                if(getopt(mul)!=1){
                   16313:                        if(type(N)==1) N=["-","+"];
                   16314:                        return sgnstrum(L,N[0])-sgnstrum(L,N[1]);
                   16315:                }
                   16316:                if(!isfctr(P0)) return -1;
                   16317:                R=polstrum(P0|mul=1);
                   16318:                for(C=0;R!=[];R=cdr(R)) C+=polstrum(car(R)|num=N);
                   16319:                return C;
                   16320:        }
                   16321:        return reverse(L);
                   16322: }
                   16323:
1.71      takayama 16324: def iceil(X)
                   16325: {
                   16326:        S=(X>0)?1:-1;
                   16327:        X*=S;
                   16328:        if(X>1) X=ceil(X);
                   16329:        else if(X>1/2) X=1;
                   16330:        else if(X) X=1/floor(1/X);
                   16331:        return S*X;
                   16332: }
                   16333:
1.70      takayama 16334: def polradiusroot(P)
                   16335: {
                   16336:        X=var(P);D=deg(P,X);
                   16337:        if(D<1) return -1;
                   16338:        C=coef(P,D,X);
                   16339:        P/=-C;
                   16340:        Int=getopt(int);
                   16341:        if(getopt(comp)==1){
                   16342:                for(ND=0,TD=0;TD<D;TD++) if(coef(P,TD,X)!=0) ND++;
                   16343:                for(V=0,TD=0;TD<D;TD++){
                   16344:                        TV=eval((abs(coef(P,TD,X))*ND)^(1/(D-TD)));
                   16345:                        if(V<TV) V=TV;
                   16346:                }
1.71      takayama 16347:                return (Int==1)? iceil(X):X;
1.70      takayama 16348:        }
                   16349:        for(N0=N1=0,TD=0;TD<D;TD++){
                   16350:                if(!(C=coef(P,TD,X))) continue;
                   16351:                if(C>0){
                   16352:                        N2++;
                   16353:                        if(!iand(D-TD,1)) N1++;
                   16354:                }else if(iand(D-TD,1)) N1++;
                   16355:        }
                   16356:        for(V1=V2=0,TD=0;TD<D;TD++){
                   16357:                if(!(C=C1=coef(P,TD,X))) continue;
                   16358:                if(C>0){
                   16359:                        TV=eval((C*N2)^(1/(D-TD)));
                   16360:                        if(V2<TV) V2=TV;
                   16361:                }
                   16362:                if(iand(D-TD,1)) C=-C;
                   16363:                if(C>0){
                   16364:                        TV=eval((C*N1)^(1/(D-TD)));
                   16365:                        if(V1<TV) V1=TV;
                   16366:                }
                   16367:        }
1.71      takayama 16368:        return Int?[-iceil(V1),iceil(V2)]:[-V1,V2];
1.70      takayama 16369: }
                   16370:
1.71      takayama 16371: /* step, num, strum */
1.70      takayama 16372: def polrealroots(P)
                   16373: {
                   16374:        if(type(MC=getopt(step))==4){
                   16375:                MC1=MC[1];MC=car(MC);
                   16376:        }else if(isint(MC)&&MC>1&&MC<10001) MC1=MC;
1.71      takayama 16377:        else MC1=MC=32;
                   16378:        if(type(I=getopt(in))!=4){
                   16379:                I=polradiusroot(P);
1.70      takayama 16380:                W=(I[1]-I[0])/1024;
                   16381:                I=[I[0]-W,I[1]+W];
                   16382:        }
                   16383:        if(type(L=type(getopt(strum)))!=4) L=polstrum(P);
                   16384:        N0=sgnstrum(L,I[0]);N1=sgnstrum(L,I[1]);
                   16385:        P=car(L);X=var(P);
1.71      takayama 16386:        if(N0<=N1) return []; /* [L,I,N0,N1]; */
1.70      takayama 16387:        LT=[[0,I[0],I[1],N0,N1]];R=[];
1.71      takayama 16388:        Z=eval(exp(0));
1.70      takayama 16389:        while(LT!=[]){
                   16390:                T=car(LT);LT=cdr(LT);
                   16391:                C=T[0];X0=T[1];X1=T[2];N0=T[3];N1=T[4];
                   16392:                if(N0<=N1)continue;
                   16393:                if(N0==N1+1){
1.71      takayama 16394:                        V0=subst(P,X,X0);
                   16395:                        V1=subst(P,X,X1);
1.70      takayama 16396:                        while(C++<MC1){
1.71      takayama 16397:                                V2=subst(P,X,X2=(X0+X1)/2*Z);
1.70      takayama 16398:                                if((V0>0&&V2>0)||(V0<0&&V2<0)) X0=X2;
                   16399:                                else X1=X2;
                   16400:                        }
                   16401:                        R=cons([X0,X1,1],R);
                   16402:                        continue;
                   16403:                }
                   16404:                while(++C<MC){
1.71      takayama 16405:                        N2=sgnstrum(L,X2=(X0+X1)/2*Z);
1.70      takayama 16406:                        if(N0>N2){
1.71      takayama 16407:                                if(N2>N1) LT=cons([C,X2,X1,N2,N1],LT);
1.70      takayama 16408:                                X1=X2;
                   16409:                                N1=N2;
                   16410:                                if(N0==N1+1){
                   16411:                                        LT=cons([C,X0,X1,N0,N1],LT);
1.71      takayama 16412:                                        C=MC+1;
1.70      takayama 16413:                                }
                   16414:                        }else{
                   16415:                                X0=X2;
                   16416:                                N0=N2;
                   16417:                        }
                   16418:                }
1.71      takayama 16419:                if(C!=MC+2) R=cons([X0,X1,N0-N1],R);
                   16420:        }
                   16421:        if(isint(Nt=getopt(nt)) && Nt>0){
                   16422:                if(Nt>256) Nt=256;
                   16423:                Q=diff(P,X);
                   16424:                for(S=[],TR=R;TR!=[];TR=cdr(TR)){
                   16425:                        if(car(TR)[2]>1) continue;
                   16426:                        V0=subst(P,X,car(TR)[0]);
                   16427:                        V1=subst(P,X,car(TR)[1]);
                   16428:                        if(abs(V0)<abs(V1))
                   16429:                                X0=car(TR)[0];
                   16430:                        else{
                   16431:                                X0=car(TR)[1];V0=V1;
                   16432:                        }
                   16433:                        for(Tn=Nt;Tn>0;Tn--){
                   16434:                                X1=X0-V0/subst(Q,X,X0);
                   16435:                                V1=subst(P,X,X1);
                   16436:                                if(abs(V1)>=abs(V0)) break;
                   16437:                                X0=X1;V0=V1;
                   16438:                        }
                   16439:                        S=cons(X0,S);
                   16440:                }
                   16441:                for(TR=R;TR!=[];TR=cdr(TR))
                   16442:                        if(car(TR)[2]>1) S=cons(car(TR),S);
                   16443:                return reverse(S);
1.70      takayama 16444:        }
                   16445:        return reverse(cons(P,R));
                   16446: }
                   16447:
                   16448: /*
                   16449: def ptcombezier0(P,Q)
                   16450: {
                   16451:        PB=subst(tobezier(P|div=1),t,s);
                   16452:        QB=tobezier(Q|Div=1);
                   16453:        Z=res(PB[0]-QB[0],PB[1]-QB[1],s);
                   16454:        D=pmaj(diff(Z,t)|val=t);
                   16455: }
                   16456: */
                   16457:
1.6       takayama 16458: def ptcombezier(P,Q,T)
                   16459: {
                   16460:        if(type(T)<2){
                   16461:                if(T<2) T=20;           /*  default */
                   16462:                return ptcombezier(P,Q,[0,0,1,T]);
                   16463:        }
                   16464:        V=T[2]/2;;
                   16465:        PB=tobezier(P|div=1);
                   16466:        PP=[ptbbox(PB[0]),ptbbox(PB[1])];
                   16467:        QB=tobezier(Q|div=1);
                   16468:        QQ=[ptbbox(QB[0]),ptbbox(QB[1])];
                   16469:        for(L=[],I=0;I<2;I++){
                   16470:                for(J=0;J<2;J++){
                   16471:                        if(!iscombox(PP[I],QQ[J])) continue;
                   16472:                        if(T[3]<=1) return
                   16473:                                [[T[0]+(I+0.5)*V,T[1]+(J+0.5)*V,
                   16474:                                        [(PP[I][0][0]+PP[I][0][1])/2,(PP[I][1][0]+PP[I][1][1])/2]]];
                   16475:                        else{
                   16476: #if 0
                   16477:                                U=PB[I][0];V=PB[I][length(PB[I])-1];
                   16478:                                if(abs(A=(U[0]-V[0]))>abs(B=(U[1]-V[I])))
                   16479:                                        M=mat([1,0],[-B/A,1]);
                   16480:                                else if(U!=V)
                   16481:                                        M=mat([1,-A/B],[0,1]);
                   16482:                                else continue;
                   16483:                                if(!iscombox(ptbox(ptaffine(M,PB[I])),ptbox(ptaffine(M,QB[J])))) continue;
                   16484: #endif
                   16485:
                   16486:                                LN=ptcombezier(PB[I],QB[J],[T[0]+I*V,T[1]+J*V,V,T[3]-1]);
                   16487: #if 0
                   16488:                                L=append(LN,L);
                   16489: #else
                   16490:                                if(LN!=[]){
                   16491:                                        if(L==[]) L=LN;
                   16492:                                        else for(VV=3*V/2^T[3];LN!=[];LN=cdr(LN)){
                   16493:                                                for(LT=L;LT!=[];LT=cdr(LT)){
                   16494:                                                        if(abs(car(LN)[0]-car(LT)[0])<VV&&abs(car(LN)[1]-car(LT)[1])<VV) break;
                   16495:                                                }
                   16496:                                        }
                   16497:                                }
                   16498:                                if(length(L)>32){               /* Too many points */
                   16499:                                        I=J=2;
                   16500:                                }
                   16501: #endif
                   16502:                        }
                   16503:                }
                   16504:        }
                   16505:        return L;
                   16506: }
                   16507:
                   16508:
                   16509: def ptcombz(P,Q,T)
                   16510: {
                   16511:        if(P==Q) Q=0;
                   16512:        if(type(P[0][0])!=4) P=P0=lbezier(P);
                   16513:        if(Q==0){
                   16514:                Q=P;F=1;
                   16515:        }
                   16516:        else if(type(Q[0][0])!=4) Q=lbezier(Q);
                   16517:        for(R=[],I=0,Q0=Q;P!=[];P=cdr(P),I++){
                   16518:                for(J=0,Q=Q0;Q!=[];Q=cdr(Q),J++){
                   16519:                        if(F==1&&I<J+2) break;
                   16520:                        if((RT=ptcombezier(car(P),car(Q),T))!=[]){
                   16521:                                RT=cons([I,J],RT);
                   16522:                                R=cons(RT,R);
                   16523:                        }
                   16524:                }
                   16525:        }
                   16526:        if((Red=getopt(red))==1||Red==2){
                   16527:                if(type(M=getopt(prec))!=1) M=12;
                   16528:                for(F=0,T=P0;T!=[];T=cdr(T)){
                   16529:                        for(S=car(T);S!=[];S=cdr(S)){
                   16530:                                if(type(ST=car(S))==4 && type(ST[0])<2){
                   16531:                                        if(F++==0){
                   16532:                                                X0=X1=ST[0];Y0=Y1=ST[1];
                   16533:                                        }else{
                   16534:                                                if(ST[0]<X0) X0=ST[0];
                   16535:                                                if(ST[0]>X1) X1=ST[0];
                   16536:                                                if(ST[1]<Y0) Y0=ST[1];
                   16537:                                                if(ST[1]>Y1) Y1=ST[1];
                   16538:                                        }
                   16539:                                }
                   16540:                        }
                   16541:                }
                   16542:                V0=(X1-X0)/2^M;V1=(Y1-Y2)/2^M;
                   16543:                for(RR=[],RT=R;RT!=[];RT=cdr(RT))
                   16544:                        for(S=cdr(car(RT));S!=[];S=cdr(S)) RR=cons(car(S)[2],RR);
                   16545:                RR=ltov(RR);L=length(RR);
                   16546:                for(I=0;I<L;I++)
                   16547:                        for(K=1,J=I+1;K!=0&&J<L;J++)
                   16548:                                if(abs(RR[I][0]-RR[J][0])<V0 && abs(RR[I][1]-RR[J][1])<V1) RR[I]=K=0;
                   16549:                R0=[];
                   16550:                I=L-1;
                   16551:                if(Red==2){
                   16552:                        for(;I>=0;I--) if(RR[I]!=0) R0=cons(RR[I],R0);
                   16553:                }else{
                   16554:                        for(RT=R;RT!=[];RT=cdr(RT)){
                   16555:                                R00=[car(RT)[0]];
                   16556:                                for(S=cdr(car(RT));S!=[];S=cdr(S),I--)
                   16557:                                        if(RR[L-I-1]!=0) R00=cons(car(S),R00);
                   16558:                                if(length(R00)>1) R0=cons(reverse(R00),R0);
                   16559:                        }
                   16560:                }
                   16561:                return R0;
                   16562:        }
                   16563:        return reverse(R);
                   16564: }
                   16565:
                   16566: def draw_bezier(ID,IDX,B)
                   16567: {
                   16568:        if(getopt(init)==1){
                   16569:                S_FDot=0;
                   16570:                return;
                   16571:        }
                   16572:        if(type(Col=getopt(col))!=1&&Col!=0) Col=0;
                   16573:        Dot=0;
                   16574:        if(type(Opt=getopt(opt))==7){
                   16575:                if(!Col){
                   16576:                        Col=drawopt(Opt,0);
                   16577:                        if(Col==-1) Col=0;
                   16578:                }
                   16579:                T=drawopt(Opt,3);
                   16580:                if(iand(T,2)){
                   16581:                        M=iand(T,1)?1/8:1/4;
                   16582:                        for(C=Col,Col=I=0;I<20;I+=8)
                   16583:                                Col+=ishift(0xff-(floor((0xff-iand(0xff,ishift(C,I)))*M)),-I);
                   16584:                }
                   16585:                if(iand(T,4)) Dot=2;            /* 2 or 3 or 4 or 6 */
                   16586:                else if(iand(T,8)) Dot=4;
                   16587:        }
                   16588:        if(type(B)==4 && (type(B[0])==4||type(B[0])==5) && type(B[0][0])<2) B=lbezier(B);
                   16589:        else if(type(B)==5) B=[vtol(B)];
                   16590:        for(;B!=[];B=cdr(B)){
                   16591:                if(vars(F=car(B))==[]){
                   16592: #if 1
                   16593:                        if(length(F)<3&&!Dot){          /* line or point */
                   16594:                                if(length(F)>0){
                   16595:                                        G=[rint(F[0][0]),rint(F[0][1])];
                   16596:                                        if(length(F)==1) draw_obj(ID,IDX,G,Col);
                   16597:                                        else{
                   16598:                                                G=[G[0],G[1],rint(F[1][0]),rint(F[1][1])];
                   16599:                                                draw_obj(ID,IDX,G,Col);
                   16600:                                        }
                   16601:                                }
                   16602:                                continue;
                   16603:                        }
                   16604: #endif
                   16605:                        if(length(F)<2) continue;
                   16606:                        F=tobezier(F);
                   16607:                }
                   16608:                N=velbezier(F,0);
                   16609:                N=(N[0]>N[1])?N[0]:N[1];
                   16610:                if(!N) N=1;
                   16611:                for(I=0;I<=N;I++,S_FDot++){
                   16612:                        if(Dot!=iand(S_FDot,Dot)) continue;
                   16613:                        G=subst(F,t,I/N);
                   16614:                        G=[rint(G[0]),rint(G[1])];
                   16615:                        if(G!=G0){
                   16616:                                draw_obj(ID,IDX,G,Col);
                   16617:                                G0=G;
                   16618:                        }
                   16619:                }
                   16620:        }
                   16621:        if(S_FDot-->=2^32) S_FDot=0;
                   16622:        return 0;
                   16623: }
                   16624:
1.29      takayama 16625:
                   16626: /*
                   16627: def redbezier(L)
                   16628: {
                   16629:        V=newvect(4);ST=0;
                   16630:        for(R=[],I=0,T=L;T=[];T=cdr(T){
                   16631:                if(type(car(T))<4){
                   16632:                        F=0;
                   16633:                        if(I==3)
                   16634:                        if(car(T)==0){
                   16635:                        }else if(car(T)==1){
                   16636:                        }else if(car(T)==-1){
                   16637:                                if(I<3) V[I++]=ST;
                   16638:                        }
                   16639:                }else if(I==3){
                   16640:                        if(R==[] || car(R)!=1){
                   16641:                                R=cons(V[0],R);
                   16642:                                if(ST==0) ST=V[0];
                   16643:                        }
                   16644:                        for(J=1;J<3;J++) R=cons(V[J],R);
                   16645:                        while((T=cdr(T))!=[]){
                   16646:                                R=cons(car(T),R);
                   16647:                                if(type(car(R))<4)
                   16648:                        }
                   16649:                }else{
                   16650:                        if(ST==0) ST=car(T);
                   16651:                        V[I++]= car(T);
                   16652:                }
                   16653:        }
                   16654: }
                   16655: */
                   16656:
1.6       takayama 16657: def lbezier(L)
                   16658: {
                   16659:        if((In=getopt(inv))==1||In==2||In==3){
                   16660:                for(F=0,R=[];L!=[];L=cdr(L)){
                   16661:                        LT=car(L);
                   16662:                        if(F==car(LT)) R=cons(1,R);
                   16663:                        else{
                   16664:                                if(R!=[]&&F!=0) R=cons(0,R);
                   16665:                                R=cons(G=car(LT),R);
1.72      takayama 16666:                                if(In==3) In=2;
1.6       takayama 16667:                        }
                   16668:                        for(LT=cdr(LT);LT!=[];LT=cdr(LT))
                   16669:                                R=cons(car(LT),R);
                   16670:                        if((F=car(R))==G&&In==1){
                   16671:                                R=cons(-1,cdr(R));
                   16672:                                F=0;
                   16673:                        }
                   16674:                }
                   16675:                if(In==3 && car(R)==G) R=cons(-1,cdr(R));
                   16676:                return reverse(R);
                   16677:        }
                   16678:        for(F=0,RT=R=[];L!=[];L=cdr(L)){
                   16679:                if(type(T=car(L))==4||type(T)==5){
                   16680:                        if(F==0){
                   16681:                                FT=T;F=1;
                   16682:                        }
                   16683:                        RT=cons(T,RT);
                   16684:                }else if(T==0){
1.72      takayama 16685:                        if(RT!=[]) R=cons(reverse(RT),R);
1.6       takayama 16686:                        RT=[];F=0;
                   16687:                }else if(T==1){
                   16688:                        if(RT!=[]){
                   16689:                                R=cons(reverse(RT),R);
                   16690:                                RT=[car(RT)];
                   16691:                        }else{
                   16692:                                RT=[];F=0;
                   16693:                        }
                   16694:                }else if(T==-1){
                   16695:                        RT=cons(FT,RT);
                   16696:                        R=cons(reverse(RT),R);
                   16697:                        RT=[];F=0;
                   16698:                }
                   16699:        }
                   16700:        if(RT!=[]) R=cons(reverse(RT),R);
                   16701:        return reverse(R);
                   16702: }
                   16703:
                   16704:
                   16705: def xybezier(L)
                   16706: {
1.72      takayama 16707:        if(type(L)==4&&type(car(L))==4&&type(car(L)[0])==4) L=lbezier(L|inv=1);
1.6       takayama 16708:        if(L==0 || (LS=length(L))==0) return "";
                   16709:        Out=str_tb(0,0);
                   16710:        if(type(VF=getopt(verb))==4){
                   16711:                if(type(car(VF))>3){
                   16712:                        VFS=VF;VF=1;
                   16713:                }else{
                   16714:                        VFS=cdr(VF);VF=car(VF);
                   16715:                }
                   16716:        }else VFS=["$\\bullet$","$\\times$"];
                   16717:        if(VF!=1 && VF!=2) VF=0;
                   16718:        if(!TikZ){
                   16719:                if(VF) Ob=str_tb(0,0);
                   16720:                T="\n**\\crv{";
                   16721:                if(type(Opt=getopt(opt))==7 && Opt!="") T=T+Opt;
                   16722:                L00=Q=L[I0=0];S=S1="";
                   16723:                for(F=0,I=1;I<=LS;I++){
                   16724:                        P=Q;Q=(I==LS)?0:L[I];
                   16725:                        if(type(Q)==4){
                   16726:                                if(F==0){
                   16727:                                        S1="";L0=P;F=1;
                   16728:                                        continue;
                   16729:                                }else if(F==1)
                   16730:                                        F=2;
                   16731:                                else if(F==2){
                   16732:                                        S1=S1+"&";
                   16733:                                }
                   16734:                                S1=S1+xypos(P);
                   16735:                                if(VF&&length(VFS)>1) str_tb(xyput([P[0],P[1],VFS[1]]),Ob);
                   16736:                        }else{
                   16737:                                if(Q==0){
                   16738:                                        if(F>0){
                   16739:                                                str_tb("{"+xypos(L0)+";"+xypos(P)+T+S1+"}};\n",Out);
                   16740:                                                if(VF){
                   16741:                                                        str_tb(xyput([L[0][0],L[0][1],VFS[0]]),Ob);
                   16742:                                                        if(VF==1) str_tb(xyput([P[0],P[1],VFS[0]]),Ob);
                   16743:                                                }
                   16744:                                                F=0;
                   16745:                                        }
                   16746:                                }else if(Q==1){
                   16747:                                        str_tb("{"+xypos(L0)+";"+xypos(P)+T+S1+"}};\n",Out);
                   16748:                                        if(VF){
                   16749:                                                str_tb(xyput([L[0][0],L[0][1],VFS[0]]),Ob);
                   16750:                                                if(VF==1) str_tb(xyput([P[0],P[1],VFS[0]]),Ob);
                   16751:                                        }
                   16752:                                        F=1;
                   16753:                                }else if(Q==-1){
                   16754:                                        if(F==2)
                   16755:                                                S1=S1+"&";
                   16756:                                        str_tb("{"+xypos(L0)+";"+xypos(L00)+T+S1+xypos(P)+"}};\n",Out);
                   16757:                                        if(VF)  str_tb(xyput([L[0][0],L[0][1],VFS[0]]),Ob);
                   16758:                                        F=0;
                   16759:                                }
                   16760:                                if(F==1){
                   16761:                                        if(I<LS-1 && type(L[I+1])<2){
                   16762:                                                if(L[I+1]==-1){
                   16763:                                                        str_tb("{"+xypos(P)+";"+xypos(L00)+T+"}};\n",Out);
                   16764:                                                }
                   16765:                                                if(VF)  str_tb(xyput([P[0][0],P[0][1],VFS[0]]),Ob);
                   16766:                                                F=0;
                   16767:                                        }
                   16768:                                }
                   16769:                                while(++I<LS && type(L[I])<2);
                   16770:                                if(I>=LS) break;
                   16771:                                if(F==1){
                   16772:                                        Q=P;I--;F=0;
                   16773:                                }else L00=Q=L[I];
                   16774:                        }
                   16775:                }
                   16776:        }else{
                   16777:                if(type(T=getopt(cmd))==7){
                   16778:                        if(T!="") T="\\"+T;
                   16779:                }else T="\\draw";
                   16780:                if((Rel=getopt(relative))==1)   VF=0;
                   16781:                if(VF) Ob=str_tb(0,0);
                   16782:                if(type(Opt=getopt(opt))==7 && Opt!="") T=T+"["+Opt+"]";
                   16783:                Out=str_tb(T,0);
                   16784:                Q=L[0];
                   16785:                for(F=M=0,I=1;I<=LS;I++){
                   16786:                        P=Q; Q=(I==LS)?0:L[I];
                   16787:                        if(++M>XYLim){
                   16788:                                str_tb("\n",Out);M=1;
                   16789:                        }
                   16790:                        if(type(Q)==4 || type(Q)==5 || type(Q)==7){
                   16791:                                if(F==0){
                   16792:                                        str_tb(" ",Out);
                   16793:                                        F=1;
                   16794:                                }else if(F==1){
                   16795:                                        str_tb(" .. controls ",Out);
                   16796:                                        F=2;
                   16797:                                }else if(F==2){
                   16798:                                        str_tb(" and ",Out);
                   16799:                                        F=2;
                   16800:                                }
                   16801:                                PP=xypos(P);
                   16802:                                if(Rel==1 && F==2) PP="+"+PP;
                   16803:                                str_tb(PP,Out);
                   16804:                                if(VF&&((F<2)||length(VFS)>1))
                   16805:                                        str_tb(xyput([P[0],P[1],(F<2)?VFS[0]:VFS[1]]),Ob);
                   16806:                        }else{
                   16807: /*                             if(I<LS-1) VF=0; */
                   16808:                                if(Q==0||Q==1){
                   16809:                                        PP=xypos(P);
                   16810:                                        if(Rel==1) PP="+"+PP;
                   16811:                                        str_tb(((F==0)?" ":((F==1)?" -- ":" .. "))+PP,Out);
                   16812:                                        if(VF) str_tb(xyput([P[0],P[1],VFS[0]]),Ob);
                   16813:                                        F=Q;
                   16814:                                }else if(Q==-1){
                   16815:                                        PP=xypos(P);
                   16816:                                        if(Rel==1) PP="+"+PP;
                   16817:                                        if(F==1)
                   16818:                                                str_tb("..controls "+PP+" .. cycle",Out);
                   16819:                                        else if(F==2)
                   16820:                                                str_tb(" and "+PP+" .. cycle",Out);
                   16821:                                        if(VF&&length(VFS)>1) str_tb(xyput([P[0],P[1],VFS[1]]),Ob);
                   16822:                                        F=0;
                   16823:                                }
                   16824:                                if(F==1){
                   16825:                                        if(I<LS-1){
                   16826:                                                if(L[I+1]==-1){
                   16827:                                                        str_tb(" -- cycle",Out);
                   16828:                                                        I=I+1;
                   16829:                                                        F=0;
                   16830:                                                }
                   16831:                                                else if(type(L[I+1])<2) F=0;
                   16832:                                        }
                   16833:                                }
                   16834:                                while(++I<LS && type(L[I])<2);
                   16835:                                if(I>=LS) break;
                   16836:                                Q=L[I];
                   16837:                        }
                   16838:                }
                   16839:                str_tb(";\n",Out);
                   16840:        }
                   16841:        if(VF)  str_tb(str_tb(0,Ob),Out);
                   16842:        return str_tb(0,Out);
                   16843: }
                   16844:
                   16845: def xybox(L)
                   16846: {
                   16847:        K=length(L);
                   16848:        P=L[0];Q=L[1];
                   16849:        if(K==2)
                   16850:                LL=[ P, [P[0],Q[1]], Q, [Q[0],P[1]] ];
                   16851:        else{
                   16852:                R=L[2];
                   16853:                LL=[ P, R, Q, [P[0]+Q[0]-R[0],P[1]+Q[1]-R[1]] ];
                   16854:        }
                   16855:        Opt=getopt();
                   16856:        SS=getopt(opt);
1.8       takayama 16857:        FL=getopt(color);
                   16858:        if(TikZ&&type(SS)<1&&K==2){
                   16859:                if(type(FL)==4){
                   16860:                        F=FL[0];
                   16861:                        if(length(FL)>1) CMD=FL[1];
                   16862:                }else if(type(FL)==7) F=FL;
                   16863:                else F="";
                   16864:                F=cons(F,["rectangle"]);
                   16865:                if(CMD) return xyarrow(P,Q|opt=F,cmd=CMD);
                   16866:                else return xyarrow(P,Q|opt=F);
                   16867:        }
1.6       takayama 16868:        if(type(SS)!=7&&!TikZ) Opt=cons(["opt","@{-}"],Opt);
                   16869:        Opt=cons(["close",1],Opt);
                   16870:        return xylines(LL|option_list=Opt);
                   16871: }
                   16872:
                   16873: def xyang(S,P,Q,R)
                   16874: {
1.72      takayama 16875:        Opt=delopt(getopt(),"ar");
1.6       takayama 16876:        if(type(Prec=getopt(prec))!=1) Prec=0;
                   16877:        if(type(Q)>2){
1.72      takayama 16878:                if(type(Ar=getopt(ar))!=1) Ar=0;
1.6       takayama 16879:                if(R==1||R==-1){                                /* 直角 */
                   16880:                        P1=ptcommon([Q,P],[-S,0]);
                   16881:                        S*=R;
                   16882:                        P2=ptcommon([P,P1],[S,@pi/2]);
                   16883:                        P3=ptcommon([P1,P2],[S,@pi/2]);
                   16884:                        return xylines([P1,P2,P3]|option_list=Opt);
1.72      takayama 16885:                }else if((AR=abs(R))==0||AR==2||AR==3||AR==4||AR>=10){  /* 矢印 */
1.6       takayama 16886:                        Ang=myarg([Q[0]-P[0],Q[1]-P[1]]);
                   16887:                        if(R<0) Ang+=3.14159;
1.72      takayama 16888:                        if(AR>10) X=deval(@pi/180*AR);
                   16889:                        else{
                   16890:                                ANG=[0.7854,0.5236,1.0472];
                   16891:                                X=(AR==0)?1.5708:ANG[AR-2];
                   16892:                        }
1.6       takayama 16893:                        U=[P[0]+S*dcos(Ang+X),P[1]+S*dsin(Ang+X)];
                   16894:                        V=[P[0]+S*dcos(Ang-X),P[1]+S*dsin(Ang-X)];      /* 矢先 */
1.72      takayama 16895:                        L=(X==0)?[U,V]:[U,P,V];
                   16896:                        if(X&&iand(Ar,2)){
                   16897:                                L=append([V],L);
                   16898:                                if((X=ptcommon([P,Q],[U,V]|in=1))!=0) P=X;
                   16899:                        }
                   16900:                        if(iand(Ar,1))
                   16901:                                L=append([Q,P,0],L);            /* 心棒 */
                   16902:                        return xylines(L|option_list=Opt);
1.6       takayama 16903:                }else if(AR>4&&AR<9){
                   16904:                        Ang=myarg([Q[0]-P[0],Q[1]-P[1]]);
                   16905:                        ANG=[0.7854,0.5236,0.3927,0.2618];
                   16906:                        X=ANG[AR-5];
                   16907:                        U=[P[0]+S*dcos(Ang+X),P[1]+S*dsin(Ang+X)];
                   16908:                        V=[P[0]+S*dcos(Ang-X),P[1]+S*dsin(Ang-X)];
                   16909:                        W=ptcommon([P,U],[P,Q]|in=-2);
                   16910:                        W1=[(U[0]+P[0]+W[0])/3,(U[1]+P[1]+W[1])/3];
                   16911:                        W2=[(V[0]+P[0]+W[0])/3,(V[1]+P[1]+W[1])/3];
1.72      takayama 16912:                        L=iand(Ar,2)?[V,U,1,W1,P,1,W2,V]:[U,W1,P,1,W2,V];
                   16913:                        if(iand(Ar,1)){
                   16914:                                if(iand(Ar,2)) P=ptcommon([P,Q],[U,V]);
                   16915:                                L=append([Q,P,0],L);
1.73      takayama 16916:                        };
1.6       takayama 16917:                        if(type(Sc=getopt(scale))>0){
                   16918:                                if(type(Sc)==1) Sc=[Sc,Sc];
                   16919:                                L=ptaffine(diagm(2,Sc),L);
                   16920:                        }
1.73      takayama 16921:                        Opt=delopt(Opt,"proc");
1.72      takayama 16922:                        if(getopt(proc)==1)     return append([2,Opt],L);
                   16923:                        S=xybezier(L|option_list=Opt);
1.6       takayama 16924:                        if(getopt(dviout)!=1) return S;
1.72      takayama 16925:                        dviout(xyproc(S));
1.6       takayama 16926:                        return 1;
                   16927:                }
                   16928:        }
                   16929:        if(type(Q)<3){
                   16930:                X=deval(Q); Y=deval(R);
                   16931:        }else{
                   16932:                X=myarg([Q[0]-P[0],Q[1]-P[1]]);
                   16933:                Y=myarg([R[0]-P[0],R[1]-P[1]]);
                   16934:        }
                   16935:        if(Prec>2) N=8;
                   16936:        else if(Prec==2) N=6;
                   16937:        else if(Prec==1) N=4;
                   16938:        else N=3;
                   16939:        U=deval(@pi)*2/N;
                   16940:        if(X==Y||Y-X>6.28318){
                   16941:                for(L=[],I=N-1;I>=0;I--) L=cons([P[0]+S*dcos(I*U),P[1]+S*dsin(I*U)],L);
                   16942:                return xylines(L|option_list=append([["curve",1],["close",1]],Opt));
                   16943:        }
                   16944:        for(M=1;(Y-X)/M>U;M++);
                   16945:        for(L=[],I=M+1;I>-2;I--){
                   16946:                Ang=X+(Y-X)*I/M;
                   16947:                L=cons([P[0]+S*dcos(Ang),P[1]+S*dsin(Ang)],L);
                   16948:        }
                   16949:        if(getopt(ar)!=1) return xylines(L|option_list=append([["curve",1],["close",-1]],Opt));
                   16950:        OL=delopt(Opt,["dviout","opt","proc"]);
                   16951:        S=xylines(L|option_list=append([["curve",1],["close",-1],["opt",0]],OL));
                   16952:        T=xylines([P,L[1]]|option_list=cons(["opt",0],OL));
                   16953:        S=ptaffine("close",[S,T]);                      /* connect curves */
                   16954:        if(getopt(opt)==0) return S;
                   16955:        OL=(type(SS=getopt(opt))>1)?[["opt",SS]]:[];
                   16956:        if(type(T=getopt(proc))==1 && T>=1 && T<=3) return [1,OL,S];
                   16957:        if(OL==[]) S=xybezier(S);
                   16958:        else S=(type(SS)==7)? xybezier(S|opt=SS):xybezier(S|opt=SS[0],cmd=SS[1]);
                   16959:        if(getopt(dviout)==1) return xyproc(S|dviout=1);
                   16960:        return S;
                   16961: }
                   16962:
                   16963: def xyoval(P,L,R)
                   16964: {
                   16965:        if(type(Arg=getopt(arg))!=4 && type(Arg=getopt(deg))==4){
                   16966:                if(length(Arg)>2)
                   16967:                        Arg=[@pi*Arg[0]/180,@pi*Arg[1]/180,@pi*Arg[2]/180];
                   16968:                else
                   16969:                        Arg=[@pi*Arg[0]/180,@pi*Arg[1]/180];
                   16970:        }
                   16971:        if(type(Arg)==4){
                   16972:                Arg0=deval(Arg[0]); Arg1=deval(Arg[1]);
                   16973:                if(length(Arg)>2) Arg2=deval(Arg[2]);
                   16974:                if(Arg1<Arg0 || Arg0<-7) return 0;
                   16975:        }
                   16976:        if(type(Prec=getopt(prec))!=0) Prec=0;
                   16977:        if((Ar=getopt(ar))!=1) Ar=0;
                   16978:        L=xyang(L,[0,0],Arg0,Arg1|prec=Prec,opt=0,ar=Ar);
                   16979:        Sc=getopt(scale);
                   16980:        if(type(Sc=getopt(scale))<1) Sc=[1,1];
                   16981:        else if(type(Sc)==1) Sc=[Sc,Sc];
                   16982:        M=mat([1,0],[0,R]);
                   16983:        L=ptaffine(M,L|shift=P);
                   16984:        M=mat([Sc[0],0],[0,Sc[1]]);
                   16985:        L=ptaffine(M,L|arg=Arg2);
                   16986:        if((Opt=getopt(opt))==0) return L;
                   16987:        Opt=(type(Opt)>1)? [["opt2",Opt]]:[];
                   16988:        if(getopt(proc)==1) return [1,Opt,L];
                   16989:        S=xybezier(L|option_list=getopt());
                   16990:        if(getopt(dviout)==1){
                   16991:                xyproc(S|dviout=1);
                   16992:                return 1;
                   16993:        }
                   16994:        return S;
                   16995: }
                   16996:
                   16997: def xycirc(P,R)
                   16998: {
                   16999:        ST=getopt(opt);
                   17000:        if(type(ST)<0) ST="";
                   17001:        if(type(Arg=getopt(arg))!=4 && type(Arg=getopt(deg))==4){
                   17002:                Arg=[@pi*Arg[0]/180,@pi*Arg[1]/180];
                   17003:        }
                   17004: /*                                                             Is it OK?
                   17005:        if(TikZ==0 && XYcm==1){
                   17006:                R*=10; P=[P[0]*10,P[1]*10];
                   17007:        }
                   17008: */
                   17009:        if(type(Arg)==4){
                   17010:                Arg0=deval(Arg[0]); Arg1=deval(Arg[1]);
                   17011:                if(Arg1<=Arg0 || Arg0<-7 || Arg1-Arg0>7) return 0;
                   17012:                if(type(ST)==7)
                   17013:                        S=xygraph([R*cos(x)+P[0],R*sin(x)+P[1]],-4,[Arg0,Arg1],[P[0]-R-1,P[0]+R+1],
                   17014:         [P[1]-R-1,P[1]+R+1]|opt=ST);
                   17015:                else
                   17016:                        S=xygraph([R*cos(x)+P[0],R*sin(x)+P[1]],-4,[Arg0,Arg1],[P[0]-R-1,P[0]+R+1],
                   17017:         [P[1]-R-1,P[1]+R+1]);
                   17018:                if(getopt(close)==1){
                   17019:                        S=S+xyline([0,0],
                   17020:                                [deval(subst(R*cos(x)+P[0],x,Arg0)),deval(subst(R*sin(x)+P[0],x,Arg0))]);
                   17021:                        S=S+xyline([0,0],
                   17022:                                [deval(subst(R*cos(x)+P[0],x,Arg1)),deval(subst(R*sin(x)+P[0],x,Arg1))]);
                   17023:                }
                   17024:                return S;
                   17025:        }
                   17026:        if(TikZ){
                   17027:                SP="";
                   17028:                if(length(P)>2) SP=P[2];
                   17029:                if(type(SP)!=7) SP="$"+my_tex_form(SP)+"$";
                   17030:                if(R==0){
                   17031:                        if(ST!="") ST=ST+",";
                   17032:                        return "\\node ["+ST+"circle,draw]"+xypos([P[0],P[1]])+ "{"+SP+"};\n";
                   17033:                }
1.8       takayama 17034:                if(type(R)!=7) R=rtostr(deval(R));
1.6       takayama 17035:                if(ST!="") ST="["+ST+"]";
                   17036:                S="\\draw "+ST+xypos([P[0],P[1]])+" circle [radius="+R+"]";
                   17037:                if(SP!="") S=S+" node at"+xypos([P[0],P[1]])+" {"+SP+"}";
                   17038:                return S+";\n";
                   17039:        }
                   17040:        S="{"+xypos([P[0],P[1]]);
                   17041:        if(length(P)>2){
                   17042:                SP=P[2];
                   17043:                if(type(P)!=7) SP=my_tex_form(SP);
                   17044:                S=S+" *+{"+SP+"}";
                   17045:        }
                   17046:        S =S+" *\\cir";
                   17047:        if(R!=0){
1.8       takayama 17048:                R=deval(R);
1.6       takayama 17049:                S=S+"<"+rtostr(R)+((XYcm)?"cm>":"mm>");
                   17050:        }
                   17051:        S = S+"{";
                   17052:        if(type(ST)==7) S=S+ST;
                   17053:     return S+"}};\n";
                   17054: }
                   17055:
1.33      takayama 17056: def xypoch(W,H,R1,R2)
                   17057: {
                   17058:        if(H>R1||2*H>R2){
                   17059:                errno(0);
                   17060:                return;
                   17061:        }
                   17062:        if(type(Ar=getopt(ar))!=1) Ar=TikZ?0.25:2.5;
                   17063:        T1=dasin(H/R1);S1=R1*dcos(T1);
                   17064:        T2=dasin(H/R2);S2=R2*dcos(T2);
                   17065:        T3=dasin(2*H/R2);S3=R2*dcos(T3);
                   17066:        S=xyline([R1,0],[W-R1,0]);
                   17067:        S+=xyang(R1,[W,0],-@pi,@pi-T1);
                   17068:        S+=xyline([S2,H],[W-S1,H]);
                   17069:        S+=xyang(R2,[0,0],T2,2*@pi-T3);
                   17070:        S+=xylines([[S3,-2*H],[W-H-R2,-2*H],[W-H-R2,2*H],[W-S3,2*H]]);
                   17071:        S+=xyang(R2,[W,0],-@pi+T2,@pi-T3);
                   17072:        S+=xyline([W-T2,-H],[W-T2,-H]);
                   17073:        S+=xyang(R1,[0,0],0,2*@pi-T1);
                   17074:        S+=xyline([W-S2,-H],[S1,-H]);
                   17075:        if(Ar>0){
                   17076:                S+=xyang(Ar,[W/2,0],[0,0],8);
                   17077:                S+=xyang(Ar,[W/2,-2*H],[0,-2*H],8);
                   17078:                S+=xyang(Ar,[W/2-Ar,-H],[W,-H],8);
                   17079:                S+=xyang(Ar,[W/2-Ar,H],[W,H],8);
                   17080:                S+=xyang(Ar,[W-S3,2*H],[W-H-R2,2*H],8);
                   17081:        }
                   17082:        S+=xyput([R1,0,"$\\bullet$"]);
                   17083:        S+=xyput([0,0,"$\\times$"]);
                   17084:        S+=xyput([W,0,"$\\times$"]);
                   17085:        if(TikZ) S=str_subst(S,";\n\\draw","\n");
                   17086:        return S;
                   17087: }
                   17088:
1.72      takayama 17089: def xycircuit(P,S)
                   17090: {
                   17091:        if(type(Sc=getopt(scale))!=1) Sc=1;
                   17092:        if(type(Opt0=getopt(opt))!=7) Opt0="";
1.73      takayama 17093:        if(type(At=getopt(at))!=1) At=(S=="E"||S=="EE")?1:1/2;
1.72      takayama 17094:        Rev=(getopt(rev)==1)?-1:1;
                   17095:        if(type(P)==4&&type(car(P))==4&&P[0][0]==P[1][0]) Rev=-Rev;
                   17096:        W=R=B2=0;Opt="";
1.73      takayama 17097:        if(S=="L"||S=="VL"||S=="LT"){
1.72      takayama 17098:                G=[1/8*x-2/5*cos(x)+2/5,1/2*sin(x)+1/2];
                   17099:                B=xygraph(G,-21,[0,7*@pi],[-1,10],[-2,2]|scale=0.3/1.06466,opt=0);
                   17100:                B=append(B,[1,[1,0]]);
                   17101:                B=append([[0,0],car(B),1],cdr(B));
                   17102:                W=1;Opt="thick";
                   17103:                if(S=="VL"){
                   17104:                        B2=xyang(0.2,[0.5+0.4*Rev,0.45],[0.5-0.435*Rev,-0.3],3|ar=3,opt=0);
                   17105:                        Opt2="thick,fill";
1.73      takayama 17106:                }else if(S=="LT"){
                   17107:                        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]];
                   17108:                        Opt2="thick";
1.72      takayama 17109:                }
1.73      takayama 17110:        }else if(S=="C"||S=="VC"||S=="C+"||S=="C-"||S=="CT"){
1.72      takayama 17111:                B=[[0,-0.2],[0,0.2],0,[0.15,-0.2],[0.15,0.2]];
                   17112:                W=0.15;Opt="very thick";
                   17113:                if(S=="VC"){
                   17114:                        B2=xyang(0.2,[1/3+0.075,0.3*Rev],[-1/3+0.075,-0.3*Rev],3|ar=3,opt=0);
                   17115:                        Opt2="thick,fill";
1.73      takayama 17116:                }else if(S=="CT"){
                   17117:                        B2=[[1/3+0.075,0.3*Rev],[-1/3+0.075,-0.3*Rev],0,[1/3+0.125,0.244*Rev],
                   17118:                                [1/3+0.025,0.356*Rev]];
                   17119:                        Opt2="thick";
                   17120:                }else if(S=="C+")
1.72      takayama 17121:                        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 17122:                        0,[0.29,0.04*Rev],[0.29,0.24*Rev],0,[0.19,0.14*Rev],[0.39,0.14*Rev]];
                   17123:                else if(S=="C-")
                   17124:                        B2=[[0,0.05],[0.15,-0.05],0,[0,0.15],[0.15,0.05],0,[0,-0.05],[0.15,-0.15]];
                   17125:        }else if(S=="R"||S=="VR"||S=="VR3"||S=="RT"){
1.72      takayama 17126:                for(I=0,B=[[0,0]];I<12;I++)
                   17127:                        if(iand(I,1)) B=cons([I,(-1)^((I+1)/2)],B);
                   17128:                B=reverse(cons([12,0],B));
                   17129:                B=xylines(B|scale=[1/18,0.15],opt=0);
                   17130:                W=2/3;Opt="thick";
                   17131:                if(S=="VR"){
                   17132:                        B2=xyang(0.2,[2/3,0.3*Rev],[0,-0.3*Rev],3|ar=3,opt=0);
                   17133:                        Opt2="thick,fill";
1.73      takayama 17134:                }else if(S=="RT"){
                   17135:                        B2=[[2/3,0.3*Rev],[0,-0.3*Rev],0,[0.717,0.244*Rev],[0.617,0.357*Rev]];
                   17136:                        Opt2="thick";
1.72      takayama 17137:                }else if(S=="RN3"){
                   17138:                        B2=xyang(0.2,[1/3,0.2*Rev],[1/3,0.5*Rev],3|ar=3,opt=0);
                   17139:                        Opt2="thick,fill";
                   17140:                }
1.73      takayama 17141:        }else if(S=="RN"||S=="VRN"||S=="RN3"||S=="NRT"){
1.72      takayama 17142:                B=xylines([[0,0.1],[2/3,0.1],[2/3,-0.1],[0,-0.1],[0,0.1]]|opt=0);
                   17143:                W=2/3;Opt="thick";
                   17144:                if(S=="VRN"){
                   17145:                        B2=xyang(0.2,[2/3,0.3*Rev],[0,-0.3*Rev],3|ar=3,opt=0);
                   17146:                        Opt2="thick,fill";
                   17147:                }else if(S=="RN3"){
                   17148:                        B2=xyang(0.2,[1/3,0.2*Rev],[1/3,0.5*Rev],3|ar=3,opt=0);
                   17149:                        Opt2="thick,fill";
1.73      takayama 17150:                }else if(S=="NRT"){
                   17151:                        B2=[[2/3,0.3*Rev],[0,-0.3*Rev],0,[0.717,0.244*Rev],[0.617,0.357*Rev]];
                   17152:                        Opt2="thick";
1.72      takayama 17153:                }
                   17154:        }else if(S=="circle"){
                   17155:                W=1;
                   17156:                B=xyang(0.5,[0.5,0],0,0|opt=0);
                   17157:        }else if(S=="gap"){
                   17158:                W=0.3;
                   17159:                B=xyang(0.15,[0.15,0],0,3.1416|opt=0);
                   17160:        }else if(S=="E"){
                   17161:                W=0.1;
                   17162:                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 17163:        }else if(S=="EE"){
                   17164:                W=0.15;
                   17165:                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 17166:        }else if(S=="Cell"){
                   17167:                W=0.1;
                   17168:                B=[[0,-0.2],[0,0.2]];
                   17169:                B2=[[0.1,-0.1],[0.1,0.1]];Opt2="very thick";
                   17170:        }else if(S=="Cell2"){
                   17171:                W=0.3;
                   17172:                B=[[0,-0.2],[0,0.2],0,[0.2,-0.2],[0.2,0.2]];
                   17173:                B2=[[0.1,-0.1],[0.1,0.1],0,[0.3,-0.1],[0.3,0.1]];Opt2="very thick";
1.73      takayama 17174:        }else if(S=="Cells"){
                   17175:                W=0.6;
                   17176:                B=[[0,-0.2],[0,0.2],0,[0.5,-0.2],[0.5,0.2],0,[0.1,0],[0.18,0],0,
                   17177:                        [0.24,0],[0.34,0],0,[0.40,0],[0.5,0]];
                   17178:                B2=[[0.1,-0.1],[0.1,0.1],0,[0.6,-0.1],[0.6,0.1]];Opt2="very thick";
1.72      takayama 17179:        }else if (S=="Sw"){
                   17180:                W=0.5;
                   17181:                B=xyang(0.05,[0.05,0],0,0|opt=0);
                   17182:                B0=ptaffine(1,B|shift=[0.4,0]);
                   17183:                B=ptaffine("union",[B,B0]);
                   17184:                B=ptaffine("union",[B,[[0.0908,0.025*Rev],[0.45,0.17*Rev]]]);
                   17185:        }else if(S=="D"){
                   17186:                W=0.3;Opt="thick";
                   17187:                B=[[0,0],[0.3,0.173],0,[0.3,0.173],[0.3,-0.173],0,[0.3,-0.173],[0,0],0,
                   17188:                [0,0.173],[0,-0.173]];
                   17189:        }else if(S=="") R=(Opt0=="")?xyline(P[0],P[1]):xyline(P[0],P[1]|opt=Opt0);
                   17190:        else if(S=="arrow") R=xyang(0.2*Sc,P[1],P[0],3|ar=1,opt=Opt0);
                   17191:        else if(type(S)==4&&type(car(S))==7){
                   17192:                if(type(car(P))!=4) P=[P];
                   17193:                for(R="";P!=[];P=cdr(P)) R+=xyput([car(P)[0],car(P)[1],car(S)]);
                   17194:        }
                   17195:        if(W){
                   17196:                R="";
                   17197:                if(type(P)==4){
                   17198:                        if(type(car(P))==4){
                   17199:                                T=ptcommon([[0,0],[1,0]],P|in=2);
                   17200:                                L=dnorm(P);
                   17201:                                W*=Sc;
                   17202:                                L1=L*At-W/2;L2=L*(1-At)-W/2;
                   17203:                                if(L1>0){
                   17204:                                        P1=[P[0][0]+L1*dcos(T),P[0][1]+L1*dsin(T)];
                   17205:                                        R+=xyline(P[0],P1);
                   17206:                                }
                   17207:                                if(L2>0){
                   17208:                                        P2=[P[1][0]-L2*dcos(T),P[1][1]-L2*dsin(T)];
                   17209:                                        R+=xyline(P2,P[1]);
                   17210:                                }
                   17211:                                B=ptaffine(Sc,B|shift=P1,arg=T);
                   17212:                                if(B2) B2=ptaffine(Sc,B2|shift=P1,arg=T);
                   17213:                        }else{
                   17214:                                B=ptaffine(Sc,B|shift=P1);
                   17215:                                if(B2) B2=ptaffine(Sc,B2|shift=P1);
                   17216:                        }
                   17217:                }else{
                   17218:                        B=ptaffine(Sc,B);
                   17219:                        if(B2) B2=ptaffine(Sc,B2);
                   17220:                }
                   17221:                if(Opt=="") Opt=Opt0;
                   17222:                else if(Opt0!="") Opt=Opt+","+Opt0;
                   17223:                R+=(Opt=="")?xybezier(B):xybezier(B|opt=Opt);
                   17224:                if(B2){
                   17225:                        if(Opt2=="") Opt2=Opt0;
                   17226:                        else if(Opt0!="") Opt2=Opt2+","+Opt0;
                   17227:                        R+=(Opt2=="")?xybezier(B2):xybezier(B2|opt=Opt2);
                   17228:                }
                   17229:        }
                   17230:        return R;
                   17231: }
                   17232:
                   17233:
1.6       takayama 17234: def ptaffine(M,L)
                   17235: {
                   17236:        if(type(L)!=4&&type(L)!=5){
                   17237:                erno(0);return L;
                   17238:        }
                   17239:        if(type(M)==7){ /* connect lists */
                   17240:                if(M=="reverse"){
                   17241:                        for(LO=LR=[],F=0,LT=L; LT!=[]; LT=cdr(LT)){
                   17242:                                if(type(P=car(LT))==4 || type(P)==7){
                   17243:                                        LR=cons(P,LR);
                   17244:                                        continue;
                   17245:                                }else{
                   17246:                                        if(P==-1){
                   17247:                                                LL=reverse(LR);
                   17248:                                                LO=append(reverse(cons(-1,cdr(LL))),LO);
                   17249:                                                LO=cons(car(LL),LO);
                   17250:                                                LR=[];
                   17251:                                        }else if(P==1){
                   17252:                                                LR=cons(car(LR),cons(1,cdr(LR)));
                   17253:                                        }else if(P==0 || length(LT)==1){
                   17254:                                                        if(LO!=[] && car(LO)!=0 && (type(car(LO))==4 || car(LO)==1))
                   17255:                                                                LO=cons(0,LO);
                   17256:                                                        LO=append(LR,LO);
                   17257:                                                        if(length(LT)>1&&length(LO)>0&&car(LO)!=0) LO=cons(0,LO);
                   17258:                                                        LR=[];
                   17259:                                        }
                   17260:                                }
                   17261:                        }
                   17262:                        return append(LR,LO);
                   17263:                }
                   17264:                if(type(L[0][0])!=4) L=[L];
                   17265:                LO=[];
                   17266:                if(M=="connect" || M=="close" || M=="loop"){
                   17267:                        Top=car(car(L));
                   17268:                        for(K=1,LL=L; LL!=[]; LL=cdr(LL)){
                   17269:                                for(F=0,LT=car(LL); LT!=[]; LT=cdr(LT),F++){
                   17270:                                        if((LTT=car(LT))==0) LTT=1;
                   17271:                                        if(F==0 && LO!=[]){
                   17272:                                                LO0=car(LO);
                   17273:                                                if(car(LO)!=1&&length(LO)>1) LO=cons(1,LO);
                   17274:                                                if(LTT==LO0) continue;
                   17275:                                                else LO=cons(1,cons(LTT, LO));
                   17276:                                        }else LO=cons(LTT, LO);
                   17277:                                }
                   17278:                        }
                   17279:                        if(M!="connect"){
                   17280:                                if(Top==car(LO) || car(LO)==1 || M=="loop")
                   17281:                                        LO=cons(-1,cdr(LO));
                   17282:                                else
                   17283:                                        LO=cons(-1,cons(1,LO));
                   17284:                        }
                   17285:                        return reverse(LO);
                   17286:                }
                   17287:                if(M=="union"){
                   17288:                        for(LL=reverse(L); LL!=[]; LL=cdr(LL)){
                   17289:                                if(LO!=[]) LO=cons(0,LO);
                   17290:                                LO=append(car(LL),LO);
                   17291:                        }
                   17292:                        L=LO;
                   17293:                }
                   17294:                return L;
                   17295:        }
                   17296:        if(type(Arg=getopt(deg))==1)
                   17297:                Arg=@pi*Arg/180;
                   17298:        else Arg=getopt(arg);
                   17299:        if(type(Arg)==2) Arg=deval(Arg);
                   17300:        if(type(Arg)==1)
                   17301:                M=M*mat([dcos(Arg),-dsin(Arg)],[dsin(Arg),dcos(Arg)]);
                   17302:        if(type(Sft=getopt(org))==4){
                   17303:                Sft=ltov(Sft);
                   17304:                Sft-=M*Sft;
                   17305:        }else Sft=ltov([0,0]);
                   17306:        if(type(V=getopt(shift))==4)
                   17307:                Sft+=ltov(V);
                   17308:        if(getopt(proc)==1){
                   17309:                if(Sft!=0&&ltov(Sft)!=[0,0]) Sft=[["shift",vtol(Sft)]];
                   17310:                else Sft=[];
                   17311:                for(LO=[],LT=L;LT!=[];LT=cdr(LT)){
                   17312:                        if(type(car(T=car(LT)))<2){
                   17313:                                if((P=car(T))==0){      /* exedraw 0 */
                   17314:                                        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]]];
                   17315:                                        V=ptbbox(ptaffine(M,V|option_list=Sft));
                   17316:                                        L1=cdr(cdr(cdr(T)));
                   17317:                                        LO=cons(append([0,V[0],V[1]],L1),LO);
                   17318:                                        continue;
                   17319:                                }else if(P==1){ /* exedraw 1 */
                   17320:                                        L1=[];
                   17321:                                        for(TT=cdr(cdr(T));TT!=[];TT=cdr(TT)){
                   17322:                                                D=car(TT);
                   17323:                                                if(type(D[0][0])==4){
                   17324:                                                        for(L2=[],DT=D;DT!=[];DT=cdr(DT))
                   17325:                                                                L2=cons(ptaffine(M,car(DT)|option_list=Sft),L2);
                   17326:                                                        L1=cons(reverse(L2),L1);
                   17327:                                                }else L1=cons(ptaffine(M,D|option_list=Sft),L1);
                   17328:                                        }
                   17329:                                        LO=cons(append([1,T[1]],reverse(L1)),LO);
                   17330:                                        continue;
                   17331:                                }else if(P>=2 && P<=5){
                   17332:                                        L1=ptaffine(M,cdr(cdr(T))|optilon_list=Sft);
                   17333:                                        LO=cons(append([P,T[1]],L1),LO);
                   17334:                                        continue;
                   17335:                                }
                   17336:                        }
                   17337:                        LO=cons(T,LO);
                   17338:                }
                   17339:                return reverse(LO);
                   17340:        }
                   17341:        F=0;
                   17342:        if(type(L)==4){
                   17343:                for(LT=L; LT!=[]; LT=cdr(LT)){
                   17344:                        if((T=type(car(LT)))==4||T==5){
                   17345:                                F=1; break;
                   17346:                        }
                   17347:                }
                   17348:        }
                   17349:        if(F==0) return (Sft==0)?ptaffine(M,[L])[0]:ptaffine(M,[L]|shift=vtol(Sft))[0];
                   17350:        for(LO=[],LT=L; LT!=[]; LT=cdr(LT)){
                   17351:                if(((T=type(P=car(LT)))!=4 && T!=5)||type(P[0])>3) LO=cons(P,LO);
                   17352:                else{
                   17353:                        if(T==4) P=ltov(P);
                   17354:                        V=M*P;
                   17355:                        if(Sft!=0) V+=Sft;
                   17356:                        if(T==4) V=vtol(V);
                   17357:                        LO=cons(V,LO);
                   17358:                }
                   17359:        }
                   17360:        return reverse(LO);
                   17361: }
                   17362:
                   17363: def ptlattice(M,N,X,Y)
                   17364: {
                   17365:        if(type(S=getopt(scale))!=1) S=1;
                   17366:        if(type(Cond=getopt(cond))!=4) Cond=[];
                   17367:        Line=getopt(line);
                   17368:        if(Line==1 || Line==2) F=newmat(M,N);
                   17369:        else Line=0;
                   17370:        if(type(Org=getopt(org))==4) Org=ltov(Org);
                   17371:        else Org=newvect(length(X));
                   17372:        X=ltov(X); Y=ltov(Y);
                   17373:        for(L=[],I=M-1;I>=0;I--){
                   17374:                for(P0=P1=0,J=N-1;J>=0;J--){
                   17375:                        P=Org+I*X+J*Y;
                   17376:                        for(C=Cond; C!=[]; C=cdr(C))
                   17377:                                if(subst(car(C),x,P[0],y,P[1])<0) break;
                   17378:                        if(C!=[]) continue;
                   17379:                        if(Line) F[I][J]=1;
                   17380:                        else L=cons(vtol(S*P),L);
                   17381:                }
                   17382:        }
                   17383:        if(Line==0) return L;
                   17384:        for(I=M-1;I>=0;I--){
                   17385:                for(T0=0,T1=J=N-1;J>=0;J--){
                   17386:                        if((K=F[I][J])!=0){
                   17387:                                if(T0==0) T0=J;
                   17388:                                else T1=J;
                   17389:                        }
                   17390:                        if(K==0 || T1==0){
                   17391:                                if(T1<T0){
                   17392:                                        L=cons(vtol(S*(Org+I*X+T0*Y)), L);
                   17393:                                        L=cons(vtol(S*(Org+I*X+T1*Y)), L);
                   17394:                                        L=cons(0,L);
                   17395:                                }
                   17396:                                T0=0; T1=N-1;
                   17397:                        }
                   17398:                }
                   17399:        }
                   17400:        for(J=N-1;J>=0;J--){
                   17401:                for(T0=0,T1=I=M-1;I>=0;I--){
                   17402:                        if((K=F[I][J])!=0){
                   17403:                                if(T0==0) T0=I;
                   17404:                                else T1=I;
                   17405:                        }
                   17406:                        if(K==0 || T1==0){
                   17407:                                if(T1<T0){
                   17408:                                        L=cons(vtol(S*(Org+T0*X+J*Y)), L);
                   17409:                                        L=cons(vtol(S*(Org+T1*X+J*Y)), L);
                   17410:                                        L=cons(0,L);
                   17411:                                }
                   17412:                                T0=0; T1=M-1;
                   17413:                        }
                   17414:                }
                   17415:        }
                   17416:        return cdr(L);
                   17417: }
                   17418:
                   17419: def ptpolygon(N,R)
                   17420: {
                   17421:        if(type(S=getopt(scale))!=1) S=1;
                   17422:        if(type(Org=getopt(org))!=4) Org=[0,0];
                   17423:        Pi=deval(@pi);
                   17424:        if(type(Arg=getopt(deg))==1)
                   17425:                Arg=Pi*Arg/180;
                   17426:        else Arg=getopt(arg);
                   17427:        if(type(Arg)==2) Arg=deval(Arg);
                   17428:        if(type(Arg)!=1) Arg=0;
                   17429:        Arg -= Pi*(1/2+1/N);
                   17430:        D=Pi*2/N;
                   17431:        for(L=[],I=N-1; I>=0; I--)
                   17432:                L=cons([S*(Org[0]+R*dcos(Arg+I*D)),S*(Org[1]+R*dsin(Arg+I*D))],L);
                   17433:        return L;
                   17434: }
                   17435:
                   17436: def ptwindow(L,X,Y)
                   17437: {
                   17438:        if(type(S=getopt(scale))==1){
                   17439:                X=[S*X[0],S*X[1]]; Y=[S*Y[0],S*Y[1]];
                   17440:        }
                   17441:        for(R=[],LT=L;LT!=[];LT=cdr(LT)){
                   17442:                P=car(LT);
                   17443:                if(P[0]<X[0] || P[0]>X[1] || P[1]<Y[0] || P[1]>Y[1])
                   17444:                        R=cons(0,R);
                   17445:                else R=cons(P,R);
                   17446:        }
                   17447:        return reverse(R);
                   17448: }
                   17449:
                   17450: def lninbox(L,W)
                   17451: {
                   17452:        if(L[0]==L[1]) return 0;
                   17453:        R=newvect(2);C=newvect(2);
                   17454:        for(J=0;J<2;J++){
                   17455:                C[J]=L[1][J]-L[0][J];
                   17456:                if(C[J]!=0){
                   17457:                        R[J]=[(W[J][0]-L[0][J])/C[J],(W[J][1]-L[0][J])/C[J]];
                   17458:                        if(R[J][0]>R[J][1]) R[J]=[R[J][1],R[J][0]];
                   17459:                }
                   17460:        }
                   17461:        if(R[0]==0) R[0]=R[1];
                   17462:        if(R[1]==0) R[1]=R[0];
                   17463:        S0=(R[0][0]<R[1][0])?R[1][0]:R[0][0];
                   17464:        S1=(R[0][1]<R[1][1])?R[0][1]:R[1][1];
                   17465:        if(getopt(in)==1){
                   17466:                if(S0<0) S0=0;
                   17467:                if(S1>1) S1=1;
                   17468:        }
                   17469:        if(S0>S1) return 0;
                   17470:        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]];
                   17471: }
                   17472:
                   17473: def ptbbox(L)
                   17474: {
                   17475:        J=length(L[0]);
                   17476:        if((Box=getopt(box))==1){
                   17477:                for(R=[],I=0;I<J;I++){
                   17478:                        P=car(LT=L)[I][0];Q=car(LT)[I][1];
                   17479:                        for(;LT!=[];LT=cdr(LT)){
                   17480:                                if((type(T=car(LT))==4 || type(T)==5) && length(T)==J){
                   17481:                                        if(T[I][0]<P) P=T[I][0];
                   17482:                                        if(T[I][1]>Q) Q=T[I][1];
                   17483:                                }
                   17484:                        }
                   17485:                        R=cons([P,Q],R);
                   17486:                }
                   17487:        }else if(type(Box)==4) return ptbbox([ptbbox(L),Box]|box=1);
                   17488:        else{
                   17489:                for(R=[],I=0;I<J;I++){
                   17490:                        P=Q=car(LT=L)[I];LT=cdr(LT);
                   17491:                        for(;LT!=[];LT=cdr(LT)){
                   17492:                                if((type(T=car(LT))==4||type(T)==5) && type(T[0])<2 && length(T)==J){
                   17493:                                        if((V=T[I])<P) P=V;
                   17494:                                        else if(V>Q) Q=V;
                   17495:                                }
                   17496:                        }
                   17497:                        R=cons([P,Q],R);
                   17498:                }
                   17499:        }
                   17500:        return reverse(R);
                   17501: }
                   17502:
                   17503: def iscombox(S,T)
                   17504: {
                   17505:        for(;S!=[];S=cdr(S),T=cdr(T))
                   17506:                if(car(S)[0]>car(T)[1] || car(S)[1]<car(T)[0]) return 0;
                   17507:        return 1;
                   17508: }
                   17509:
                   17510: def ptcopy(L,V)
                   17511: {
                   17512:        if(type(V[0])!=4) V=[V];
                   17513:        for(F=0,LL=[]; V!=[]; V=cdr(V)){
                   17514:                if(F)   LL=append(LL,[0]);
                   17515:                F++;
                   17516:                LL=append(LL,ptaffine(1,L|shift=car(V)));
                   17517:        }
                   17518: }
                   17519:
1.58      takayama 17520: def regress(L)
                   17521: {
                   17522:        E=deval(exp(0));
                   17523:        for(S0=T0=0,S=L;S!=[];S=cdr(S)){
                   17524:                S0+=car(S)[0]*E;T0+=car(S)[1]*E;
                   17525:        }
                   17526:        K=length(L);S0/=K;T0/=K;
                   17527:        for(SS=TT=0,S=L;S!=[];S=cdr(S)){
                   17528:                SS+=(car(S)[0]-S0)^2*E;TT+=(car(S)[1]-T0)^2*E;
                   17529:                ST+=(car(S)[0]-S0)*(car(S)[1]-T0)*E;
                   17530:        }
                   17531:        if(!SS||!TT) return [];
                   17532:        A=ST/SS;
                   17533:        L=[A,A*S0-T0,ST/dsqrt(SS*TT),S0,dsqrt(SS/K),T0,dsqrt(TT/K)];
                   17534:        if(isint(N=getopt(sint))){
                   17535:                R=reverse(L);
                   17536:                for(L=[];R!=[];R=cdr(R)) L=cons(sint(car(R),N|str=0),L);
                   17537:        }
                   17538:        return L;
                   17539: }
                   17540:
1.6       takayama 17541: def    average(L)
                   17542: {
1.32      takayama 17543:        if(getopt(opt)=="co"){
                   17544:                S0=average(L[0]);V0=car(S0);
                   17545:                S1=average(L[1]);V1=car(S1);
                   17546:                L0=os_md.m2l(L[0]|flat=1);
                   17547:                L1=os_md.m2l(L[1]|flat=1);
                   17548:                for(S=0;L0!=[];L0=cdr(L0),L1=cdr(L1))
                   17549:                        S+=(car(L0)-V0)*(car(L1)-V1);
                   17550:                S/=S0[1]*S1[1]*S0[2];
                   17551:                S=[S,S0,S1];
                   17552:        }else{
                   17553:                L=os_md.m2l(L|flat=1);
                   17554:                M0=M1=car(L);
                   17555:                for(I=SS=0, LT=L; LT!=[]; LT=cdr(LT), I++){
                   17556:                        S+=(V=car(LT));
                   17557:                        SS+=V^2;
                   17558:                        if(V<M0)                M0=V;
                   17559:                        else if(V>M1)   M1=V;
                   17560:                }
                   17561:                SS=dsqrt(SS/I-S^2/I^2);
                   17562:                S=[deval(S/I),SS,I,M0,M1];
1.6       takayama 17563:        }
1.8       takayama 17564:        if(isint(N=getopt(sint))) S=sint(S,N);
                   17565:        return S;
1.6       takayama 17566: }
                   17567:
                   17568: def m2ll(M)
                   17569: {
                   17570:        for(R=[],I=size(M)[0]-1; I>=0; I--)
                   17571:                R=cons(vtol(M[I]),R);
                   17572:        return R;
                   17573: }
                   17574:
                   17575: def madjust(M,W)
                   17576: {
                   17577:        if(type(Null=getopt(null))<0) Null=0;
                   17578:        if(type(M)==4 && type(M[0])==4){
                   17579:                M=lv2m(M|null=Null);
                   17580:                return m2ll(madjust(M,W|null=Null));
                   17581:        }
                   17582:        S=size(M);
                   17583:        if(W<0){
                   17584:                W=-W;
                   17585:                T0=ceil(S[0]/W);
                   17586:                T1=S[1]*W;
                   17587:                N=newmat(T0,T1);
                   17588:                for(I=0; I<T0; I++){
                   17589:                        for(K=0; K<W; K++){
                   17590:                                II=K*T0+I;
                   17591:                                for(J=0; J<S[1]; J++)
                   17592:                                        N[I][S[1]*K+J]=(II<S[0])?M[II][J]:Null;
                   17593:                        }
                   17594:                }
                   17595:        }else{
                   17596:                T1=W;
                   17597:                T0=S[0]*(D=ceil(S[1]/T1));
                   17598:                N=newmat(T0,T1);
                   17599:                for(K=0; K<D; K++){
                   17600:                        for(J=0; J<W;J++){
                   17601:                                JJ=W*K+J;
                   17602:                                for(I=0; I<S[0]; I++)
                   17603:                                        N[S[0]*K+I][J]=(JJ<S[1])?M[I][JJ]:Null;
                   17604:                        }
                   17605:                }
                   17606:        }
                   17607:        return N;
                   17608: }
                   17609:
                   17610: def texcr(N)
                   17611: {
                   17612:        if(!isint(N) || N<0 || N>127) return N;
                   17613:        S=(iand(N,8))? "\\allowdisplaybreaks":"";
                   17614:        if(iand(N,2))  S=S+"\\\\";
                   17615:        if(iand(N,16)) S=S+"\\pause";
                   17616:        if(iand(N,1))  S=S+"\n";
                   17617:        if(iand(N,4))  S=S+"& ";
                   17618:        else if(!iand(N,1)) S=S+" ";
                   17619:        if(iand(N,64)) S=S+"=";
                   17620:        if(iand(N,32)) S=","+S;
                   17621:        return S;
                   17622: }
                   17623:
                   17624: def ltotex(L)
                   17625: {
                   17626:        /* extern TeXLim;       */
                   17627:
                   17628:        if(type(L)==5)
                   17629:                L = vtol(L);
                   17630:        if(type(L) != 4)
                   17631:                return my_tex_form(L);
                   17632:        Opt=getopt(opt);
                   17633:        Pre=getopt(pre);
                   17634:        if(type(Var=getopt(var))<1) Var=0;
                   17635:     Cr2="\n";
                   17636:        if(type(Cr=getopt(cr))==4){
                   17637:                Cr2=Cr[1];Cr=Cr[0];
                   17638:        }
                   17639:        if(isint(Cr)) Cr=texcr(Cr);
                   17640:        if(type(Cr)!=7) Cr="\\\\\n & "; /* Cr=7 */
                   17641:        if(type(Opt)==7) Opt=[Opt];
                   17642:        if(type(Opt)!=4)
                   17643:                Op = -1;
                   17644:        else{
                   17645:                Op=findin(Opt[0],["spt","GRS","Pfaff","Fuchs","vect","cr","text","spts","spts0",
                   17646:                        "dform","tab", "graph","coord"]);
                   17647:                Opt=cdr(Opt);
                   17648:        }
                   17649:        if(Op==0){      /* spt */
                   17650:                Out = str_tb("\\left\\{\n ",0);
                   17651:                for(CC=0; L!=[]; L=cdr(L), CC++){
                   17652:                        if(CC>0) str_tb(",\\, ",Out);
                   17653:                        TP=car(L);
                   17654:                        if(Op!=0)
                   17655:                                str_tb(my_tex_form(TP),Out);
                   17656:                        else if(TP[0]==1)
                   17657:                                str_tb(my_tex_form(TP[1]),Out);
                   17658:                        else
                   17659:                                str_tb(["[", my_tex_form(TP[1]), "]_", rtotex(TP[0])],Out);
                   17660:                }
                   17661:                str_tb("%\n\\right\\}\n",Out);
                   17662:        }else if(Op==1){ /* GRS */
                   17663:                Out = string_to_tb("\\begin{Bmatrix}\n");
                   17664:                if(type(Pre)==7) str_tb(Pre,Out);
                   17665:                MC=length(M=ltov(L));
                   17666:                for(ML=0, I=length(M); --I>=0; ){
                   17667:                        if(length(M[I]) > ML)  ML=length(M[I]);
                   17668:                }
                   17669:                for(I=0; I<ML; I++){
                   17670:                        for(CC=J=0; J<MC; J++, CC++){
                   17671:                                if(length(M[J]) <= I){
                   17672:                                        if(CC > 0) str_tb(" & ",Out);
                   17673:                                }else if(M[J][I][0] <= 1){
                   17674:                                        if(M[J][I][0] == 0) str_tb(" & ",Out);
                   17675:                                        else
                   17676:                                                str_tb([(!CC)?" ":" & ", my_tex_form(M[J][I][1])], Out);
                   17677:                                }else
                   17678:                                        str_tb([((!CC)?" [":" & ["), my_tex_form(M[J][I][1]), "]_",
                   17679:                                         rtotex(M[J][I][0])], Out);
                   17680:                        }
                   17681:                        str_tb((I<ML-1)?"\\\\\n":"\n", Out);
                   17682:                }
                   17683:                str_tb("\\end{Bmatrix}",Out);
                   17684:        }else if(Op==2){ /* Pfaff */
                   17685:                V=monototex(Opt[0]);
                   17686:                Out = string_to_tb("d"+V+"= \\Biggl(");
                   17687:                Opt=cdr(Opt);
                   17688:                II=length(Opt);
                   17689:                for(I=0; I<II; I++){
                   17690:                         str_tb([(I>0)?" + ":" ",mtotex(L[I]),"\\frac{d",monototex(Opt[I]),"}{",
                   17691:                         my_tex_form(Opt[I]),(I==II-1)?"}\n":"}\n\\\\&\n"],Out);
                   17692:                }
                   17693:                str_tb(["\\Biggr)",V,"\n"],Out);
                   17694:        }else if(Op==3){ /* Fuchs */
                   17695:                Out = string_to_tb("\\frac{d");
                   17696:                V=my_tex_form(Opt[0]);
                   17697:                str_tb([V,"}{d",my_tex_form(Opt[1]),"}="] ,Out);
                   17698:                Opt=cdr(Opt); Opt=cdr(Opt);
                   17699:                II=length(Opt);
                   17700:                for(I=0; I<II; I++){
                   17701:                         str_tb([(I>0)?" +":"\\Biggl(", " \\frac{",
                   17702:                         my_tex_form(L[I]),"}{", my_tex_form(Opt[I]),"}\n"],Out);
                   17703:                }
                   17704:                str_tb(["\\Biggr)",V,"\n"],Out);
                   17705:        }else if(Op==4){        /* vect */
                   17706:                Out=str_tb(mtotex(matc(L)|lim=0,var=Var),0);
                   17707:        }else if(Op==5 || Op==6){       /* cr or text */
                   17708:                Out = str_tb(0,0);
                   17709:                if(type(Lim=getopt(lim))!=1) Lim=0;
                   17710:                else if(Lim<30&&Lim>0) Lim=TeXLim;
                   17711:                Str=getopt(str);
                   17712:                if(length(Opt)==1 && (car(Opt)=="spts" || car(Opt)=="spts0") && type(Str)!=1)
                   17713:                        Str=2;
                   17714:                for(K=I=0; L!=[]; I++, L=cdr(L)){
                   17715:                        LT=car(L);
                   17716:                        if((!Lim||Op==6)&&I>0) str_tb((Op==5)?Cr:"\n",Out);
                   17717:                        if(Op==6){
                   17718:                                if(type(LT)==7){
                   17719:                                        str_tb([LT," "],Out);
                   17720:                                        I=-1;
                   17721:                                        continue;
                   17722:                                }
                   17723:                                str_tb("$",Out);
                   17724:                        }
                   17725:                        KK=0;
                   17726:                        if(Str>0 && type(LT)==4 && Opt!=[])
                   17727:                                S=ltotex(LT|opt=car(Opt),lim=0,str=Str,cr=Cr2,var=Var);
                   17728:                        else if(type(LT)==6){
                   17729:                                if(Lim>0){
                   17730:                                        S=mtotex(LT|var=Var,lim=0,len=1);
                   17731:                                        KK=S[1];
                   17732:                                        S=S[0];
                   17733:                                }else S=mtotex(LT|var=Var,lim=0);
                   17734:                        }else if(type(LT)==3 || type(LT)==2)
                   17735:                                S=fctrtos(LT|TeX=2,lim=0,var=Var);
                   17736:                        else S=my_tex_form(LT);
                   17737:                        if(Op!=6&&I>0&&Lim){
                   17738:                                if(Lim<0){
                   17739:                                        if(I%(-Lim)==0)
                   17740:                                                str_tb((Op==5)?Cr:"\n",Out);
                   17741:                                }else if((K+=(KK=(KK)?KK:texlen(S)))>Lim){
                   17742:                                        str_tb((Op==5)?Cr:"\n",Out);
                   17743:                                        K=KK;
                   17744:                                }
                   17745:                        }
                   17746:                        str_tb(S,Out);
                   17747:                        if(Op==6) str_tb("$",Out);
                   17748:                }
                   17749:        }else if(Op==7||Op==8){ /* spts, spts0 */
                   17750:                if(type(Lim=getopt(lim))!=1 || (Lim<30 && Lim!=0))
                   17751:                        Lim=TeXLim;
                   17752:                Str=getopt(str);
                   17753:                Out = str_tb(0,0);
                   17754:                for(K=0; L!=[]; L=cdr(L)){
                   17755:                        LT=car(L);
                   17756:                        KK=0;
                   17757:                        if(type(LT)==7 && Str==1) S=LT;
                   17758:                        else if(type(LT)==3 || type(LT)==2)
                   17759:                                S=fctrtos(LT|TeX=2,lim=0,var=Var);
                   17760:                        else if(type(LT)==6){
                   17761:                                if(Lim){
                   17762:                                        S=mtotex(LT|var=Var,lim=0,len=1);
                   17763:                                        KK=S[1];
                   17764:                                        S=S[0];
                   17765:                                }else S=mtotex(LT|var=Var,lim=0);
                   17766:                        }else
                   17767:                                S=my_tex_form(LT);
                   17768:                        if(Lim!=0){
                   17769:                                if(!KK) KK=texlen(S);
                   17770:                                if(K>0 && K+KK>Lim){
                   17771:                                        str_tb(Cr,Out);
                   17772:                                        K=0;
                   17773:                                }
                   17774:                        }
                   17775:                        if(K>0){
                   17776:                                str_tb((Op==7)?"\\ ":" ",Out);
                   17777:                                if(type(LT)>3 && type(LT)<7)    str_tb("%\n",Out);
                   17778:                        }
                   17779:                        str_tb(S,Out);
                   17780:                        K+=KK;
                   17781:                        if(OP==7)       K++;
                   17782:                }
                   17783:        }else if(Op==9){        /* dform */
                   17784:                Out=str_tb(0,0);
                   17785:                for(I=0;L!=[];L=cdr(L),I++){
                   17786:                        for(J=0,LT=car(L); LT!=[]; LT=cdr(LT),J++){
                   17787:                                if(J==0){
                   17788:                                        if((V=car(LT))==0)      continue;
                   17789:                                        if(I>0){
                   17790:                                                if(type(V)==1){
                   17791:                                                        if(V<0){
                   17792:                                                                str_tb("-",Out);
                   17793:                                                                V=-V;
                   17794:                                                        }
                   17795:                                                        else    str_tb("+",Out);
                   17796:                                                        if(V==1 && length(LT)>1) continue;
                   17797:                                                        str_tb(monototex(V),Out);
                   17798:                                                        continue;
                   17799:                                                }
                   17800:                                                else    str_tb("+",Out);
                   17801:                                        }
                   17802:                                }else if(J>0)   str_tb((J>1)?"\\wedge d":"\\,d",Out);
                   17803:                                V=monototex(car(LT));
                   17804:                                if(V<"-" || V>=".")     str_tb(V,Out);
                   17805:                                else str_tb(["(",V,")"],Out);
                   17806:                        }
                   17807:                }
                   17808:        }else if(Op==10 && type(L)==4 && type(car(L))==4){      /* tab */
                   17809:                if(type(Null=getopt(null))<0) Null="";
                   17810:                if(getopt(vert)==1){
                   17811:                        M=lv2m(L|null=Null);
                   17812:                        L=m2ll(mtranspose(M));
                   17813:                }
                   17814:                if(type(W=getopt(width))==1)
                   17815:                        L=madjust(L,W|null=Null);
                   17816:                LV=ltov(L);
                   17817:                S=length(LV);
                   17818: #if 1
                   17819:                if(type(T=getopt(left))==4){
                   17820:                        T=str_times(T,S);
                   17821:                        for(L=[],I=0;I<S;I++){
                   17822:                                L=cons(cons(car(T),LV[I]),L);
                   17823:                                T=cdr(T);
                   17824:                        }
                   17825:                        LV=reverse(L);
                   17826:                }
                   17827:                if(type(T=getopt(right))==4){
                   17828:                        T=str_times(T,S);
                   17829:                        for(L=[],I=0;I<S;I++){
                   17830:                                L=cons(append(LV[I],[car(T)]),L);
                   17831:                                T=cdr(T);
                   17832:                        }
                   17833:                        LV=reverse(L);
                   17834:                }
                   17835:                for(I=CS=0; I<S; I++)
                   17836:                        if(length(LV[I])>CS) CS=length(LV[I]);
                   17837:                if(type(T=getopt(top))==4){
                   17838:                        LV=cons(str_times(T,CS),vtol(LV));
                   17839:                        S++;
                   17840:                }
                   17841:                if(type(T=getopt(last))==4){
                   17842:                        LV=append(vtol(LV),[str_times(T,CS)]);
                   17843:                        S++;
                   17844:                }
                   17845: #else
                   17846:                for(I=CS=0; I<S; I++)
                   17847:                        if(length(LV[I])>CS) CS=length(LV[I]);
                   17848: #endif
                   17849:                if(type(Title=getopt(title))!=7) Title="";
                   17850:                if(type(Vline=getopt(vline))!=4) Vline=[0,CS];
                   17851:                else Vline=subst(Vline,z,CS);
                   17852:                for(VV=[],VT=Vline;VT!=[];VT=cdr(VT)){
                   17853:                        if(type(T=car(VT))==4 && T[1]>0){
                   17854:                                for(I=T[0];I<=CS;I+=T[1]) VV=cons(I,VV);
                   17855:                        }else VV=cons(T,VV);
                   17856:                }
                   17857:                Vline=qsort(VV);
                   17858:                Out=str_tb("\\begin{tabular}{",0);
                   17859:                if(type(Al=getopt(align))==7 && str_len(Al)>1){
                   17860:                        str_tb(Al,Out);
                   17861:                }else{
                   17862:                        if(type(Al)!=7 || str_len(Al)<1) Al="r";
                   17863:                        for(I=0;I<=CS;I++){
                   17864:                                if(I!=0) str_tb(Al,Out);
                   17865:                                while(Vline!=[] && car(Vline)==I){
                   17866:                                        str_tb("|",Out);
                   17867:                                        Vline=cdr(Vline);
                   17868:                                }
                   17869:                        }
                   17870:                }
                   17871:                str_tb("}",Out);
                   17872:                if(Title!="")
                   17873:                        str_tb("\n\\multicolumn{"+rtostr(CS)+"}{c}{"+Title+"}\\\\",Out);
                   17874:                if(type(Hline=getopt(hline))!=4) Hline=[0,S];
                   17875:                else Hline=subst(Hline,z,S);
                   17876:                for(VV=[],VT=Hline;VT!=[];VT=cdr(VT)){
                   17877:                        if(type(T=car(VT))==4 && T[1]>0){
1.14      takayama 17878:                                for(I=T[0];I<=S;I+=T[1]) VV=cons(I,VV);
1.6       takayama 17879:                        }else VV=cons(T,VV);
                   17880:                }
                   17881:                Hline=qsort(VV);
                   17882:                while(Hline!=[] && car(Hline)==0){
                   17883:                        str_tb(" \\hline\n",Out);
                   17884:                        Hline=cdr(Hline);
                   17885:                }
                   17886: /*
                   17887:                if(type(getopt(left))==4) CS++;
                   17888:                if(type(getopt(right))==4) CS++;
                   17889:                if(type(T=getopt(top))==4){
                   17890:                        LV=cons(str_times(T,CS),vtol(LV));
                   17891:                        S++;
                   17892:                }
                   17893:                if(type(T=getopt(last))==4){
                   17894:                        LV=append(vtol(LV),[str_times(T,CS)]);
                   17895:                        S++;
                   17896:                }
                   17897:                if(type(T=getopt(left))==4){
                   17898:                        T=str_times(T,S);
                   17899:                        for(L=[],I=0;I<S;I++){
                   17900:                                L=cons(cons(car(T),LV[I]),L);
                   17901:                                T=cdr(T);
                   17902:                        }
                   17903:                        LV=reverse(L);
                   17904:                }
                   17905:                if(type(T=getopt(right))==4){
                   17906:                        T=str_times(T,S);
                   17907:                        for(L=[],I=0;I<S;I++){
                   17908:                                L=cons(append(LV[I],[car(T)]),L);
                   17909:                                T=cdr(T);
                   17910:                        }
                   17911:                        LV=reverse(L);
                   17912:                }
                   17913: */
                   17914:                for(I=0; I<S; I++){
                   17915:                        for(C=0,LT=LV[I];C<CS; C++){
                   17916:                                if(LT!=[]){
                   17917:                                        P=car(LT);
                   17918:                                        if(type(P)!=7) P="$"+my_tex_form(P)+"$";
                   17919:                                        if(P!="") str_tb(P,Out);
                   17920:                                        LT=cdr(LT);
                   17921:                                }
                   17922:                                if(C<CS-1) str_tb("& ",Out);
                   17923:                        }
                   17924:                        str_tb("\\\\",Out);
                   17925:                        while(Hline!=[] && car(Hline)==I+1){
                   17926:                                str_tb(" \\hline",Out);
                   17927:                                Hline=cdr(Hline);
                   17928:                        }
                   17929:                        str_tb("\n",Out);
                   17930:                }
                   17931:                str_tb("\\end{tabular}\n",Out);
                   17932:        }else if(Op==11){       /* graph */
1.10      takayama 17933:                if(type(Strip=getopt(strip))!=1) Strip=0;
                   17934:                if(type(MX=getopt(max))!=1)  MX=0;
                   17935:                if(type(ML=getopt(mult))!=1) ML=0;
                   17936:                if((REL=getopt(relative))!=1) REL=0;
                   17937:                CL=getopt(color);
                   17938:                OL=delopt(getopt(),["color","strip","mult"]);
                   17939:                if(ML==1&&type(CL)==4){
                   17940:                        LL=L[1];L=L[0];K=length(L);S=T="";
                   17941:                        if(!MX){
                   17942:                                MX=vector(length(L[0]));
                   17943:                                for(LT=L;LT!=[];LT=cdr(LT)){
                   17944:                                        for(I=0,LTT=car(LT);LTT!=[];I++,LTT=cdr(LTT)){
                   17945:                                                if(REL==1) MX[I]+=car(LTT);
                   17946:                                                else if(MX[I]<car(LTT)) MX[I]=car(LTT);
                   17947:                                        }
                   17948:                                }
                   17949:                                MX=lmax(MX);
                   17950:                                OL=cons(["max",MX],OL);
                   17951:                        }
                   17952:                        if(REL==1) MX=newvect(length(L[0]));
                   17953:                        for(I=0;I<K;I++){
                   17954:                                for(R=[],J=length(L[I]);--J>=0;){
                   17955:                                        if(REL==1){
                   17956:                                                R=cons([MX[J],V=MX[J]+L[I][J]],R);
                   17957:                                                MX[J]=V;
                   17958:                                        }else R=cons([(!I)?0:L[I-1][J],L[I][J]],R);
                   17959:                                }
                   17960:                                OP=cons(["color",CL[I]],OL);
                   17961:                                S+=ltotex([R,LL]|option_list=cons(["value",0],cons(["strip",(!I)?1:2],OP)));
                   17962:                                T+=ltotex([R,LL]|option_list=cons(["strip",3],OP));
                   17963:                        }
                   17964:                        return(!Strip)?xyproc(S+T):(S+T);
                   17965:                }else if(!TikZ) CL=0;
                   17966:                if(type(Line=getopt(line))!=1){
                   17967:                        if(type(Line)==4){
                   17968:                                if(type(Line[0])==1 && (type(Line[1])==7 || type(Line[1])==1)){
                   17969:                                        Opt=Line[1]; Line=Line[0];
                   17970:                                }else if(ML==1){
                   17971:                                        OL=delopt(OL,"line");
                   17972:                                        LL=L[1];L=L[0];K=length(L);S="";
                   17973:                                        if(!MX){
1.15      takayama 17974:                                                MX=newvect(length(L[0]));
1.10      takayama 17975:                                                for(LT=L;LT!=[];LT=cdr(LT)){
                   17976:                                                        for(I=0,LTT=car(LT);LTT!=[];I++,LTT=cdr(LTT)){
                   17977:                                                                if(REL==1) MX[I]+=car(LTT);
                   17978:                                                                else if(MX[I]<car(LTT)) MX[I]=car(LTT);
                   17979:                                                        }
                   17980:                                                }
                   17981:                                                MX=lmax(MX);
                   17982:                                                OL=cons(["max",MX],OL);
                   17983:                                        }
1.15      takayama 17984:                                        for(I=0;I<K;I++)
                   17985:                                                S+=ltotex([L[I],LL]|option_list
1.10      takayama 17986:                                                        =cons(["line",Line[I]],cons(["strip",(!I)?1:2],OL)));
                   17987:                                        return(!Strip)?xyproc(S):S;
                   17988:                                }
                   17989:                        }else Line=0;
                   17990:                }else Opt="@{-}";
                   17991:                Width=8; Hight=3; WRet=1/2; HMerg=(getopt(horiz)==1)?0.3:0.2;
1.6       takayama 17992:                if(!TikZ){
1.7       takayama 17993:                        Width*=10; Hight*=10; HMerg*=10;
1.6       takayama 17994:                }
1.10      takayama 17995:                VMerg=HMerg;
                   17996:                if(type(Shift=getopt(shift))!=1)
                   17997:                        Shift=0;
1.6       takayama 17998:                if(type(V=getopt(size))==4){
                   17999:                        Width=V[0];Hight=V[1];
                   18000:                        if(length(V)>2) WRet=V[2];
1.10      takayama 18001:                        if(length(V)>3) VMerg=VMerg=V[3];
                   18002:                        if(length(V)>4) HMerg=V[4];
1.6       takayama 18003:                }
                   18004:                Val=getopt(value);
                   18005:                if(!isint(Val)) Val=-1;
                   18006:                if(type(Line=getopt(line))!=1){
                   18007:                        if(type(Line)==4 && type(Line[0])==1 && (type(Line[1])==7 || type(Line[1])==1)){
                   18008:                                Opt=Line[1]; Line=Line[0];
                   18009:                        }else   Line=0;
                   18010:                }else Opt="@{-}";
                   18011:                if(type(car(L))==4){
                   18012:                        LL=L[1]; L=L[0];
                   18013:                }else LL=[];
                   18014:                if(Line==-1){
                   18015:                        for(Sum=0, LT=L; LT!=[]; LT=cdr(LT)){
                   18016:                                if((S=car(LT))<=0) return 0;
                   18017:                                Sum+=S;
                   18018:                        }
1.16      takayama 18019:                        for(R=[],LT=L;LT!=[];LT=cdr(LT)) R=cons(car(LT)/Sum,R);
1.6       takayama 18020:                        R=reverse(R);
                   18021:                        Opt0=Opt*2/3;
1.10      takayama 18022:                        Out=str_tb((Strip>0)?0:xyproc(1),0);
1.16      takayama 18023:                        if(type(CL)!=4) str_tb(xylines(ptpolygon(6,Opt)|close=1,curve=1),Out);
1.6       takayama 18024:                        for(S=0,RT=R,LT=LL;RT!=[];RT=cdr(RT)){
1.16      takayama 18025:                                SS=S+RT[0];
                   18026:                                if(type(CL)==4){
                   18027:                                        str_tb(xyang(Opt,[0,0],(0.25-SS)*6.2832,(0.25-S)*6.2832|ar=1,opt=car(CL)),Out);
                   18028:                                        if(length(CL)>0) CL=cdr(CL);
                   18029:                                }else str_tb(xyline([0,0],[Opt*dsin(S*6.2832),Opt*dcos(S*6.2832)]),Out);
                   18030:                                T=(S+SS)/2;
                   18031:                                S=SS;
1.6       takayama 18032:                                if(LT!=[]){
1.16      takayama 18033:                                        str_tb(xyput([Opt0*dsin(T*6.2832),Opt0*dcos(T*6.2832),car(LT)]),Out);
1.6       takayama 18034:                                        LT=cdr(LT);
                   18035:                                }
                   18036:                        }
1.10      takayama 18037:                        if(!Strip) str_tb(xyproc(0),Out);
1.6       takayama 18038:                        return str_tb(0,Out);
                   18039:                }
                   18040:                if(MX==0){
                   18041:                        for(MX=0,LT=L; LT!=[]; LT=cdr(LT))
                   18042:                                if(car(LT)>MX) MX=car(LT);
                   18043:                }
                   18044:                MX-=Shift;
                   18045:                S=length(L);
                   18046:                WStep=Width/S;
                   18047:                WWStep=WStep*WRet;
1.10      takayama 18048:                HStep=(Hight<0)?-Hight:Hight/MX;
1.7       takayama 18049:                if(LL!=[]&&length(LL)==S-1) WS2=WStep/2;
                   18050:                else WS2=0;
1.10      takayama 18051:                Out=str_tb((Strip>0)?0:xyproc(1),0);
                   18052:                Hori=getopt(horiz);
                   18053:                if(Strip<2){
                   18054:                        if(Hori==1)  str_tb(xyline([0,0],[0,Width-WStep+WWStep]),Out);
                   18055:                        else str_tb(xyline([0,0],[Width-WStep+WWStep,0]),Out);
                   18056:                }
1.6       takayama 18057:                for(I=0,LT=L;LT!=[]; LT=cdr(LT),I++){
1.10      takayama 18058:                        XP=WStep*I; XPM=XP+WWStep/2;
                   18059:                        if(type(LTT=car(LT))==4){
                   18060:                                YP0=(car(LTT)-Shift)*HStep;YP=(LTT[1]-Shift)*HStep;
                   18061:                                VL=LTT[1];
                   18062:                                if(REL) VL-=LTT[0];
                   18063:                        }else{
                   18064:                                YP0=0;YP=(LTT-Shift)*HStep;VL=LTT;
                   18065:                        }
                   18066:                        if(Hori==1){
                   18067:                                if(Line!=0){
                   18068:                                        if(I>0)
                   18069:                                                str_tb(xyarrow([XPM,YP],[XPM-WStep,YPP]|opt=Opt),Out);
                   18070:                                        if(Val!=0)
                   18071:                                                str_tb(xyput([YP+HMerg, XPM,car(LT)]),Out);
                   18072:                                        if(Line==2)
                   18073:                                                str_tb(xyput([YP,XPM,"$\\bullet$"]),Out);
                   18074:                                        YPP=YP;
                   18075:                                }else if(YP!=0 || Val==1){
                   18076:                                        if(Strip!=3){
                   18077:                                                if(CL) str_tb(xybox([[YP,XP+WWStep], [YP0,XP]]|color=CL),Out);
                   18078:                                                else str_tb(xybox([[YP,XP+WWStep],[YP0,XP]]),Out);
                   18079:                                        }
                   18080:                                        if(Val!=0) str_tb(xyput([(YP<0||REL==1)?(YP-HMerg):(YP+HMerg),XPM,VL]),Out);
                   18081:                                }
                   18082:                                if(LL!=[]&&I<length(LL)&&Strip<2) str_tb(xyput([-VMerg,XPM+WS2,LL[I]]),Out);
                   18083:                        }else{
                   18084:                                if(Line!=0){
                   18085:                                        if(I>0)
                   18086:                                                str_tb(xyarrow([XPM-WStep,YPP],[XPM,YP]|opt=Opt),Out);
                   18087:                                        if(Val!=0)
                   18088:                                                str_tb(xyput([XPM,YP+HMerg,car(LT)]),Out);
                   18089:                                        if(Line==2)
                   18090:                                                str_tb(xyput([XPM,YP,"$\\bullet$"]),Out);
                   18091:                                        YPP=YP;
                   18092:                                }else if(YP!=0 || Val==1){
                   18093:                                        if(Strip!=3){
                   18094:                                                if(CL) str_tb(xybox([[XP,YP0],[XP+WWStep,YP]]|color=CL),Out);
                   18095:                                                else str_tb(xybox([[XP,YP0],[XP+WWStep,YP]]),Out);
                   18096:                                        }
                   18097:                                        if(Val!=0) str_tb(xyput([XPM,(YP<0||REL==1)?(YP-HMerg):(YP+HMerg),VL]),Out);
1.6       takayama 18098:                                }
1.10      takayama 18099:                                if(LL!=[]&&I<length(LL)&&Strip<2) str_tb(xyput([XPM+WS2,-VMerg,LL[I]]),Out);
1.6       takayama 18100:                        }
                   18101:                }
1.10      takayama 18102:                if(!Strip)str_tb(xyproc(0),Out);
1.6       takayama 18103:        }else if(Op==12){       /* coord */
                   18104:                Out=str_tb("(",0);
                   18105:                for(LT=L;;){
                   18106:                        X=car(LT);
                   18107:                        if(type(X)>3 || imag(X)==0)     str_tb(my_tex_form(X),Out);
                   18108:                        else{
                   18109:                                XR=real(X);XI=imag(X);
                   18110:                                S=monototex(imag(X));
                   18111:                                if(S=="1") S="";
                   18112:                                else if(S=="- 1") S="-";
                   18113:                                if(getopt(cpx)==2) S=S+"\\sqrt{-1}";
                   18114:                                else S=S+"i";
                   18115:                                if(XR!=0){
                   18116:                                        if(str_char(S,0,"-")==0) S=monototex(XR)+S;
                   18117:                                        else S=monototex(XR)+"+"+S;
                   18118:                                }
                   18119:                                str_tb(S,Out);
                   18120:                        }
                   18121:                        if((LT=cdr(LT))==[]) break;
                   18122:                        else str_tb(",",Out);
                   18123:                }
                   18124:                str_tb(")",Out);
                   18125:        }
                   18126:        else    return my_tex_form(L);
                   18127:        S = str_tb(0,Out);
                   18128:        return (getopt(small)==1)?smallmattex(S):S;
                   18129: }
                   18130:
                   18131:
                   18132: def str_tb(L,TB)
                   18133: {
                   18134:        if(type(TB) == 0) TB = "";
                   18135:        if(L == 0)
                   18136:                return (type(TB) == 7)?string_to_tb(TB):tb_to_string(TB);
                   18137:        if(type(L) == 7)
                   18138:                L = [L];
                   18139:        else if(type(L) != 4){
                   18140:                erno(0);
                   18141:                return 0;
                   18142:        }
                   18143:        if(type(TB) <= 7)
                   18144:                 TB = string_to_tb((type(TB)==7)?TB:"");
                   18145:        for(; L != []; L = cdr(L))
                   18146:                write_to_tb(car(L), TB);
                   18147:        return TB;
                   18148: }
                   18149:
                   18150: /*
                   18151: def redgrs(M,T)
                   18152: {
                   18153:        L = [zzz];
                   18154:        for(I=S=0,Eq=[],MT=M; MT!=[]; I++, MT=cdr(MT)){
                   18155:                for(J=LS=0, N=car(MT); N!=[]; N=cdr(N)){
                   18156:                        X = makev([z,I,z,J]);
                   18157:                        L=cons(X,L);
                   18158:                        LS += X;
                   18159:                        S += car(N)[1]*X;
                   18160:                }
                   18161:                Eq = cons(LS-zzz,Eq);
                   18162:        }
                   18163:        Eq = cons(S-T,Eq);
                   18164:        Sol= lnsol(Eq,L);
                   18165:        for(LS=[],S=Sol; S!=[]; S=cdr(S)){
                   18166:                T=car(S);
                   18167:                if(type(S)!=4) return 0;
                   18168:                LS=cons(car(S)[0],LS);
                   18169:        }
                   18170: }
                   18171: */
                   18172:
                   18173: /* T=0 : all reduction
                   18174:                =1 : construction procedure
                   18175:                =2 : connection coefficient
                   18176:                =3 : operator
                   18177:                =4 : series expansion
                   18178:                =5 : expression by TeX
                   18179:                =6 : Fuchs relation
                   18180:                =7 : All
                   18181:                =8 : basic
                   18182:                =9 : ""
                   18183:                =10: irreducible
                   18184:                =11: recurrence */
                   18185: def getbygrs(M, TT)
                   18186: {
                   18187:        /* extern TeXEq;        */
                   18188:
                   18189:        if(type(M)==7) M=s2sp(M);
                   18190:        if(type(M) != 4 || TT =="help"){
                   18191:                mycat(
                   18192: ["getbygrs(m,t) or getbygrs(m,[t,s_1,s_2,...]|perm=?,var=?,pt=?,mat=?)\n",
                   18193: " m: generalized Riemann scheme or spectral type\n",
                   18194: " t: reduction, construct, connection, series, operator, TeX, Fuchs, irreducible, basic, recurrence,\n",
                   18195: "    All\n",
                   18196: " s: TeX dviout simplify short general operator irreducible top0 x1 x2 sft\n",
                   18197: "Ex: getbygrs(\"111,21,111\", [\"All\",\"dviout\",\"operator\",\"top0\"])\n"]);
                   18198:                return 0;
                   18199:        }
                   18200:        if(type(TT) == 4){
                   18201:                T  = TT[0];
                   18202:                T1 = cdr(TT);
                   18203:        }else{
                   18204:                T  = TT;
                   18205:                T1 = [];
                   18206:        }
                   18207:        if(type(T) == 7)
                   18208:                T = findin(T,["reduction","construct","connection", "operator", "series",
                   18209:                         "TeX", "Fuchs", "All", "basic", "", "irreducible", "recurrence"]);
                   18210:        TeX   = findin("TeX", T1);
                   18211:        Simp  = findin("simplify", T1);
                   18212:        Short = findin("short", T1);
                   18213:        Dviout= findin("dviout", T1);
                   18214:        General=findin("general", T1);
                   18215:        Op     =findin("operator", T1);
                   18216:        Irr    =findin("irreducible", T1);
                   18217:        Top0   =findin("top0",T1);
                   18218:        X1     =findin("x1",T1);
                   18219:        X2     =findin("x2",T1);
                   18220:        Sft    =findin("sft",T1);
                   18221:        Title = getopt(title);
                   18222:        Mat   = getopt(mat);
                   18223:        if(Mat!=1 || T<0 ||(T!=0&&T!=1&&T!=5&&T!=6&&T!=8&&T!=10&&T!=9)) Mat = 0;
                   18224:        if(findin("keep",T1) >= 0)
                   18225:                Keep = Dviout = 1;
                   18226:        else Keep = 0;
                   18227:        if(Dviout >= 0 || T == 5) TeX = 1;
                   18228:        for(J = 0, MM = M; J == 0 && MM != []; MM = cdr(MM)){
                   18229:                for(MI = car(MM); MI != []; MI = cdr(MI)){
                   18230:                        if(type(car(MI)) != 1 || car(MI) <= 0){
                   18231:                                J = 1; break;
                   18232:                        }
                   18233:                }
                   18234:        }
                   18235:
                   18236:        /* spectral type -> GRS */
                   18237:        if(J == 0){
                   18238:                for(R = [], S = J = 0, MM = M; MM != []; MM = cdr(MM), J++){
                   18239:                        MT = qsort(car(MM));
                   18240:                        R = cons(reverse(MT), R);
                   18241:                        if(J == 1){
                   18242:                                S = length(MT)-1;
                   18243:                                if(MT[S] > MT[0]) S = 0;
                   18244:                        }
                   18245:                }
                   18246:                M = reverse(R);
                   18247:                R = getopt(var);
                   18248:                if(type(R)<1){
                   18249:                        for(R = [], I = J-1; I >= 0; I--)
                   18250:                                R = cons(asciitostr([97+I]), R);
                   18251:                }
                   18252:                Sft=(Sft>=0)?1:0;
                   18253:                if(General < 0)
                   18254:                        Sft=-Sft-1;
                   18255:                M = sp2grs(M,R,Sft|mat=Mat);
                   18256:        }
                   18257:        for(M0=[],MM=M;MM!=[];MM=cdr(MM)){      /* change "?" -> z_z */
                   18258:                for(M1=[],Mm=car(MM);Mm!=[];Mm=cdr(Mm)){
                   18259:                        Mt=car(Mm);
                   18260:                        if(type(Mt)==4 && Mt[1]=="?"){
                   18261:                                M1=cons([Mt[0],z_z],M1);
                   18262:                                continue;
                   18263:                        }else if(type(Mt)==7 && Mt=="?"){
                   18264:                                M1=cons(z_z,M1);
                   18265:                                continue;
                   18266:                        }
                   18267:                        M1=cons(Mt,M1);
                   18268:                }
                   18269:                M0=cons(reverse(M1),M0);
                   18270:        }
                   18271:        M = fspt(reverse(M0),5);  /* short -> long */
                   18272:        if(findin(z_z,vars(M))>=0)
                   18273:                M=subst(M,z_z,lsol(chkspt(M|mat=Mat)[3],z_z));  /* Fuchs relation */
                   18274:        NP = length(M);
                   18275:        Perm = getopt(perm);
                   18276:        if(type(Perm) == 4)
                   18277:                M = mperm(M,Perm,0);
                   18278:        if(T == 9){  /* "" */
                   18279:                if(Short >= 0)
                   18280:                        M = chkspt(M|opt=4,mat=Mat);
                   18281:                return M;
                   18282:        }
                   18283:        R = [0,M];
                   18284:        ALL = [R];
                   18285:
                   18286:        while(type(R = redgrs(R[1]|mat=Mat)) == 4)
                   18287:                ALL = cons(R, ALL);
                   18288:        if(R < 0)
                   18289:                return 0;
                   18290:
                   18291:        /* TeX */
                   18292:        if(TeX >= 0 && !chkfun("print_tex_form", "names.rr"))
                   18293:                return 0;
                   18294:        if(Dviout >= 0 && type(Title) == 7)
                   18295:                dviout(Title|keep=1);
                   18296:        if(T == 7 && Dviout >= 0){
                   18297:                S=["keep","simplify"];
                   18298:                if(Top0 >= 0)
                   18299:                        S = cons("top0",S);
                   18300:                getbygrs(M,cons(5,S)|title="\\noindent Riemann Scheme",mat=Mat);
                   18301:                Same = 0;
                   18302:                if(R > 0){
                   18303:                        MM = getbygrs(M,8|mat=Mat);    /* basic GRS */
                   18304:                        MS = chkspt(MM|opt=0,mat=Mat); /* spectral type */
                   18305:                        if(M != MM)
                   18306:                                 getbygrs(MM,cons(5,S)|title="Basic Riemann Scheme",mat=Mat);
                   18307:                        else{
                   18308:                                 dviout("This is a basic Riemann Scheme.\n\n\\noindent"|keep=1);
                   18309:                                 Same = 1;
                   18310:                        }
                   18311:                        dviout(MS|keep=1);
                   18312:                }
                   18313:                if(chkspt(ALL[0][1]|mat=Mat)[3] != 0)
                   18314:                        getbygrs(M,cons(6,S)|title="Fuchs condition",mat=Mat);
                   18315:                if(Same == 0){
                   18316:                        M1 = M[1];
                   18317:                        if(M1[length(M1)-1][0]==1 && Mat!=1){
                   18318:                                M1=M[2];
                   18319:                                if(M1[length(M1)-1][0] == 1){
                   18320:                                        getbygrs(M,cons(2,S)|title="Connection formula");
                   18321:                                        if(M1[length(M[0][0])-1][0] == 1 && R==0)
                   18322:                                                getbygrs(M,cons(11,S)|title="Recurrence relation shifting the last exponents at $\\infty$, 0, 1");
                   18323:                                }
                   18324:                                getbygrs(M,cons(1,S)|title="Integral representation");
                   18325:                                getbygrs(M,cons(4,S)|title="Series expansion");
                   18326:                        }
                   18327:                        if(Irr < 0){
                   18328:                                TI="Irreduciblity $\\Leftrightarrow$ any value of the following linear forms $\\notin\\mathbb Z$";
                   18329:                                if(R > 0)
                   18330:                                        TI += " + fundamental irreducibility";
                   18331:                                getbygrs(M,cons(10,S)|title=TI,mat=Mat);
                   18332:                                dviout("which coorespond to the decompositions"|keep=1);
                   18333:                                sproot(chkspt(M|opt=0),"pairs"|dviout=1,keep=1);
                   18334:                        }
                   18335:                }
                   18336:                if(Op >= 0 && Mat!=1) getbygrs(M,cons(3,S)|title="Operator");
                   18337:                dviout(" ");
                   18338:                return 1;
                   18339:        }
                   18340:        if(T == 0 && TeX >= 0){
                   18341:                T = 1; TeX = 16;
                   18342:        }
                   18343: /* Fuchs */
                   18344:        Fuc = chkspt(ALL[0][1]|Mat=mat)[3];
                   18345:        if(Fuc == 0) Simp = -1;
                   18346:        if(type(Fuc) == 1){
                   18347:                print("Violate Fuchs condition");
                   18348:                return 0;
                   18349:        }
                   18350:        if(T == 6){
                   18351:                if(Dviout >= 0) dviout(Fuc|eq=0,keep=Keep);
                   18352:                return (TeX >= 0)?my_tex_form(Fuc):Fuc;
                   18353:        }
                   18354:        Fuc = [Fuc];
                   18355: /* Generelized Riemann scheme */
                   18356:        if(T == 5){
                   18357:                M = ltov(M);
                   18358:                for(ML=0, I=0; I<NP; I++){
                   18359:                        L = length(M[I]);
                   18360:                        if(L > ML) ML = L;
                   18361:                }
                   18362:                Out = string_to_tb("P\\begin{Bmatrix}\nx=");
                   18363:                if(Top0 < 0)
                   18364:                        write_to_tb("\\infty & ",Out);
                   18365:                Pt = getopt(pt);
                   18366:                if(type(Pt) == 4){
                   18367:                        for(J = 3; J < NP; J++){
                   18368:                                str_tb(["& ",rtotex(car(Pt))],Out);
                   18369:                                Pt = cdr(Pt);
                   18370:                        }
                   18371:                }
                   18372:                else if(X2>=0)
                   18373:                        str_tb("0 & x_2",Out);
                   18374:                else
                   18375:                        str_tb((X1>=0)?"x_1 & x_2":"0 & 1",Out);
                   18376:                for(J = 3; J < NP; J++)
                   18377:                        str_tb(["& x_",rtotex(J)],Out);
                   18378:                if(Top0 >= 0)
                   18379:                        write_to_tb("& \\infty",Out);
                   18380:                write_to_tb("\\\\\n",Out);
                   18381:                for(I = 0; I < ML; I++){
                   18382:                        for(CC = 0, J = (Top0 >= 0)?1:0; ; J++, CC++){
                   18383:                                if(J == NP){
                   18384:                                        if(Top0 < 0) break;
                   18385:                                        J = 0;
                   18386:                                }
                   18387:                                if(length(M[J]) <= I){
                   18388:                                        if(CC > 0) write_to_tb(" & ",Out);
                   18389:                                }else if(M[J][I][0] <= 1){
                   18390:                                        if(M[J][I][0] == 0) str_tb(" & ",Out);
                   18391:                                        else
                   18392:                                                str_tb([(!CC)?" ":" & ", my_tex_form(M[J][I][1])], Out);
                   18393:                                }else{
                   18394:                                        str_tb([((!CC)?"[":" & ["), my_tex_form(M[J][I][1]),
                   18395:                                                (Mat==1)?"]_{":"]_{("],Out);
                   18396:                                        str_tb([my_tex_form(M[J][I][0]),(Mat==1)?"}":")}"],Out);
                   18397:                                }
                   18398:                                if(Top0 >= 0 && J == 0)
                   18399:                                        break;
                   18400:                        }
                   18401:                        if(I == 0)
                   18402:                                str_tb("&\\!\\!;x",Out);
                   18403:                        str_tb("\\\\\n",Out);
                   18404:                }
                   18405:                str_tb("\\end{Bmatrix}",Out);
                   18406:                Out = str_tb(0,Out);
                   18407:                if(Dviout >= 0)
                   18408:                        dviout(Out|eq=0,keep=Keep);
                   18409:                return Out;
                   18410:        }
                   18411:
                   18412: /* Reduction */
                   18413:        if(T == 0){
                   18414:                if(Simp >= 0)
                   18415:                        ALL = simplify(ALL,Fuc,4);
                   18416:                return reverse(ALL);
                   18417:        }
                   18418:        LA = length(ALL) - 1;
                   18419:        NP = length(ALL[0][1]);
                   18420:
                   18421: /* irreducible */
                   18422:        if(T == 10){
                   18423:                for(IR=[], I = 0; I < LA; I++){
                   18424:                        AI = ALL[I]; AIT = AI[1];
                   18425:                        K = AI[0][0];
                   18426:                        P = -AIT[0][K][1];
                   18427:                        P -= cterm(P);
                   18428:                        IR = cons(P, IR);
                   18429:                        for(J = 0; J < NP; J++){
                   18430:                                K = AI[0][J];
                   18431:                                for(L = length(AIT[J]) - 1; L >= 0 ; L--){
                   18432:                                        if(L == K || AIT[J][L][0] <= AIT[J][K][0])
                   18433:                                                continue;
                   18434:                                        P = AIT[J][L][1] - AIT[J][K][1];
                   18435:                                        Q = cterm(P);
                   18436:                                        if(dn(Q)==1)
                   18437:                                                P -= Q;
                   18438:                                        IR = cons(P,IR);
                   18439:                                }
                   18440:                        }
                   18441:                }
                   18442:                P=Fuc[0];
                   18443:                Q=cterm(P);
                   18444:                if(type(Q)==1 && dn(Q)==1){
                   18445:                        for(F=0,V=vars(P);V!=[];V=cdr(V)){
                   18446:                                R=mycoef(P,1,car(V));
                   18447:                                if(type(R)!=1 || Q%R!=0){
                   18448:                                        F=1; break;
                   18449:                                }
                   18450:                        }
                   18451:                        if(F==0){
                   18452:                                P-=Q;
                   18453:                                Simp=0;
                   18454:                        }
                   18455:                }
                   18456:                if(Simp >= 0){
                   18457:                        IR=simplify(IR,[P],4);
                   18458:                        for(R=[]; IR!=[]; IR=cdr(IR)){
                   18459:                                P=car(IR);
                   18460:                                Q=cterm(P);
                   18461:                                if(dn(Q)==1) P-=Q;
                   18462:                                R=cons(P,R);
                   18463:                        }
                   18464:                        IR=R;
                   18465:                }
                   18466:                for(R=[]; IR!=[]; IR=cdr(IR)){
                   18467:                        P=car(IR);
                   18468:                        if(str_len(rtostr(P)) > str_len(rtostr(-P)))
                   18469:                                P = -P;
                   18470:                        R = cons(P,R);
                   18471:                }
                   18472:                R = ltov(R);
                   18473: #ifdef USEMODULE
                   18474:                R = qsort(R,os_md.cmpsimple);
                   18475: #else
                   18476:                R = qsort(R,cmpsimple);
                   18477: #endif
                   18478:                R = vtol(R);
                   18479:                if(TeX >= 0){
                   18480:                        Out = string_to_tb("");
                   18481:                        for(I=L=K=0; R!=[]; R=cdr(R),I++){
                   18482:                                K1 = K;
                   18483:                                RS = my_tex_form(car(R));
                   18484:                                K = nmono(car(R));
                   18485:                                L += K;
                   18486:                                if(I){
                   18487:                                        if(K1 == K && L < 30)
                   18488:                                                str_tb("\\quad ",Out);
                   18489:                                        else{
                   18490:                                                L = K;
                   18491:                                                str_tb((TeXEq==5)?["\\\\%\n &"]:["\\\\%\n "],Out);
                   18492:                                        }
                   18493:                                }
                   18494:                                str_tb(RS,Out);
                   18495:                        }
                   18496:                        R = Out;
                   18497:                        if(Dviout>=0){
                   18498:                                dviout(R|eq=0,keep=Keep);
                   18499:                                return 1;
                   18500:                        }
                   18501:                }
                   18502:                return R;
                   18503:        }
                   18504:
                   18505:        AL = []; SS = 0;
                   18506:        for(I = 0; I <= LA; I++){
                   18507:                AI = ALL[I]; AIT = AI[1];  /* AIT: GRS */
                   18508:                if(I > 0){
                   18509:                        for(S = J = 0; J < NP; J++){
                   18510:                                GE = AIT[J][AI0[J]][1];
                   18511:                                S += GE;
                   18512:                                if(J == 0)
                   18513:                                        SS = [];
                   18514:                                else
                   18515:                                        SS = cons(GE,SS);
                   18516:                        }
                   18517:                        SS = cons(1-Mat-S, reverse(SS));
                   18518:                }
                   18519:                AI0 = AI[0];
                   18520:                AL = cons([SS, cutgrs(AIT)], AL);
                   18521:        }
                   18522:        AL = reverse(AL);
                   18523:        AD = newvect(NP);
                   18524:        ALT = AL[0][1];
                   18525:        for(J = 1; J < NP; J++){
                   18526:                /* AD[J] = ALT[J][0][1];   [J][?][1] <- [J][?][0]: max */
                   18527:                for(MMX=0, K = KM = length(ALT[J])-1; K >= 0; K--){
                   18528:                        if(MMX <= ALT[J][K][0]){
                   18529:                                 if(J == 1 && MMX == ALT[J][K][0])
                   18530:                                         continue;
                   18531:                                 KM = K;
                   18532:                                 MMX = ALT[J][K][0];
                   18533:                        }
                   18534:                }
                   18535:                AD[J] = ALT[J][KM][1];
                   18536:        }
                   18537:        AL = cdr(AL);
                   18538:        AL = cons([vtol(AD), ALT], AL);
                   18539:        AL = cons([0, mcgrs(ALT, [vtol(-AD)]|mat=Mat)], AL);
                   18540:        if(Simp >= 0 && T != 3)
                   18541:                AL = simplify(AL,Fuc,4);
                   18542: /* Basic */
                   18543:        if(T == 8){
                   18544:                ALT = AL[0][1];
                   18545:                if(TeX >= 0){
                   18546:                        if(Dviout >= 0){
                   18547:                                return getbygrs(ALT,["TeX","dviout","keep"]);
                   18548:                        }
                   18549:                        return getbygrs(ALT,"TeX");
                   18550:                }
                   18551:                if(Short >= 0)
                   18552:                        ALT = chkspt(ALT|opt=4);
                   18553:                return ALT;
                   18554:        }
                   18555:
                   18556: /* Construct */
                   18557:        if(T == 1){
                   18558:                if(TeX >= 0){
                   18559:                        L = length(AL);
                   18560:                        I = Done = 0; Out0=Out1=""; NM = DN = [];
                   18561:                        if(TeX != 16){
                   18562:                                AL11=AL[L-1][1][1];
                   18563:                                AT = AL11[length(AL11)-1];
                   18564:                                if(type(AT) == 4){
                   18565:                                        PW = (AT[0] > 1)?"":AT[1];
                   18566:                                }else PW = AT;
                   18567:                        }
                   18568:                        Out = string_to_tb("");
                   18569:                        while(--L >= 0){
                   18570:                                if(TeX == 16){
                   18571:                                        if(Done)
                   18572:                                                write_to_tb(":\\ ", Out);
                   18573:                                        write_to_tb(getbygrs(AL[L][1],(Top0>=0)?["TeX", "top0"]:"TeX"|mat=Mat), Out);
                   18574:                                        Done = 1;
                   18575:                                        if(L != 0) write_to_tb((TeXEq==5)?
                   18576:                                                "\\\\%\n&\\leftarrow ":"\\\\%\n\\leftarrow ", Out);
                   18577:                                }
                   18578:                                ALT = AL[L][0];
                   18579:                                if(TeX != 16){
                   18580:                                        V1 = (I==0)?"x":V2;
                   18581:                                        V2 = /* (I==0 && L<=2)?"s": */
                   18582:                                                 "s_"+rtotex(I);
                   18583:                                }else V1=V2="x";
                   18584:                                JJ = (type(ALT) == 4)?length(ALT):0;
                   18585:                                if(I > 0 && L > 0)
                   18586:                                        write_to_tb("\n ", Out);
                   18587:                                for(Outt = "", J = 1; J < JJ; J++){
                   18588:                                        if(ALT[J] == 0) continue;
                   18589:                                        if(J == 1)      Outt += V1;
                   18590:                                        else if(J == 2) Outt += "(1-"+V1+")";
                   18591:                                        else            Outt += "(x_"+rtotex(J)+"-"+V1+")";
                   18592:                                        Outt += "^"+ rtotex(ALT[J]);
                   18593:                                }
                   18594:                                if(TeX != 16) write_to_tb(Outt, Out);
                   18595:                                else if(Outt != "")
                   18596:                                        str_tb(["\\mathrm{Ad}\\Bigl(",Outt,"\\Bigr)"], Out);
                   18597:                                if(JJ == 0){
                   18598:                                        if(I != 0)
                   18599:                                                Out1 = "ds_"+rtotex(I-1)+Out1;
                   18600:                                        continue;
                   18601:                                }
                   18602:                                if(ALT[0] == 0) continue;
                   18603:                                Out0 += "\\int_p^{"+V1+"}";
                   18604:                                if(TeX == 16)
                   18605:                                        str_tb(["mc_",rtotex(ALT[0])], Out);
                   18606:                                else{
                   18607:                                        str_tb(["(",V1,"-",V2,")^",rtotex(-1+ALT[0])], Out);
                   18608:                                        AL11=AL[L-1][1][1];
                   18609:                                        AT = AL11[length(AL11)-1];
                   18610:                                        if(type(AT) == 4) AT = AT[1];
                   18611:                                        DN = cons(ALT[0]+AT+1,DN);
                   18612:                                        NM = cons(AT+1,cons(ALT[0],NM));
                   18613:                                }
                   18614:                                if(L != 2) Out1 += "d"+V2;
                   18615:                                I++;
                   18616:                        }
                   18617:                        if(R){
                   18618:                                if(I == 0) Ov = "x";
                   18619:                                else Ov = "s_"+rtotex(I-1);
                   18620:                                Out1 = "u_B("+Ov+")"+Out1;
                   18621:                        }
                   18622:                        if(TeX != 16){
                   18623:                                Out0 = string_to_tb(Out0);
                   18624:                                str_tb([Out, Out1], Out0);
                   18625:                                Out = Out0;
                   18626:                                NM = simplify(NM, Fuc, 4);
                   18627:                                DN = simplify(DN, Fuc, 4);
                   18628:                                DNT = lsort(NM,DN,"reduce");
                   18629:                                NMT = DNT[0]; DNT = DNT[1];
                   18630:                                if(NMT != [] && PW != ""){
                   18631:                                        write_to_tb((TeXEq==5)?"\\\\\n &\\sim\\frac{\n"
                   18632:                                                :"\\\\\n \\sim\\frac{\n", Out);
                   18633:                                        for(PT = NMT; PT != []; PT = cdr(PT))
                   18634:                                                str_tb(["  \\Gamma(",my_tex_form(car(PT)), ")\n"], Out);
                   18635:                                        write_to_tb(" }{\n", Out);
                   18636:                                        for(PT = DNT; PT != []; PT = cdr(PT))
                   18637:                                                write_to_tb("  \\Gamma("+my_tex_form(car(PT))+")\n", Out);
                   18638:                                        write_to_tb(" }", Out);
                   18639:                                        if(R > 0) write_to_tb("C_0", Out);
                   18640:                                        write_to_tb("x^"+rtotex(PW) +"\\ \\ (p=0,\\ x\\to0)", Out);
                   18641:                                }
                   18642:                        }else
                   18643:                                Out = str_tb(0, Out);
                   18644:                        if(Dviout >= 0){
                   18645:                                dviout(Out|eq=0,keep=Keep);
                   18646:                                return 1;
                   18647:                        }
                   18648:                        return O;
                   18649:                }
                   18650:                if(Short >= 0){
                   18651:                        for(ALL = [] ; AL != []; AL = cdr(AL)){
                   18652:                                 AT = car(AL);
                   18653:                                 ALL = cons([AT[0], chkspt(AT[1]|opt=4)], ALL);
                   18654:                        }
                   18655:                        AL = reverse(ALL);
                   18656:                }
                   18657:                return AL;  /* AL[0][1] : reduced GRS, R==0 -> rigid */
                   18658:        }
                   18659:
                   18660:        if(T == 2 || T == 4 || T == 11){
                   18661:                for(I = (T==2)?2:1; I >= (T==11)?0:1; I--){
                   18662:                        ALT = M[I];
                   18663:                        if(ALT[length(ALT)-1][0] != 1){
                   18664:                                mycat(["multiplicity for",I,":",ALT[length(ALT)-1][1],
                   18665:                                        "should be 1"]);
                   18666:                                return;
                   18667:                        }
                   18668:                }
                   18669:        }
                   18670:        LA++;
                   18671:        NM = DN = [];
                   18672:
                   18673: /* Three term relation */
                   18674:        if(T == 11){
                   18675:                if(R > 0){
                   18676:                        print("This is not rigid\n");
                   18677:                        return 0;
                   18678:                }
                   18679:                for(I = 0; I <= LA; I++){
                   18680:                        if(I > 0){
                   18681:                                AI = AL[I][0];  /* operation */
                   18682:                                if(AI[0] != 0){
                   18683:                                        DN = cons(simplify(AI1+1,Fuc,4),DN);
                   18684:                                        NM = cons(simplify(AI1+AI[0]+1,Fuc,4),NM);
                   18685:                                }
                   18686:                        }
                   18687:                        ALT = AL[I][1][1]; AI1 = ALT[length(ALT)-1][1];
                   18688:                }
                   18689:                DNT = lsort(NM,DN,"reduce");
                   18690:                if(TeX < 0) return DNT;
                   18691:                NMT = DNT[0]; DNT = DNT[1];
                   18692:                Out = str_tb("u_{0,0,0}-u_{+1,0,-1}=\\frac{","");
                   18693:                for(PT = NMT; PT != []; PT = cdr(PT))
                   18694:                        str_tb(["(",my_tex_form(car(PT)),")"], Out);
                   18695:                str_tb(["}\n{"],Out);
                   18696:                for(PT = DNT; PT != []; PT = cdr(PT))
                   18697:                        str_tb(["(",my_tex_form(car(PT)),")"], Out);
                   18698:                write_to_tb("}u_{0,+1,-1}",Out);
                   18699:                if(Dviout >= 0){
                   18700:                        dviout(Out|eq=0,keep=Keep);
                   18701:                        return 1;
                   18702:                }
                   18703:                return Out;
                   18704:        }
                   18705:
                   18706:        AD=newvect(NP);
                   18707:        for(I = 0; I <= LA; I++){
                   18708:                if(I > 0){
                   18709:                        AI = AL[I][0];  /* operation */
                   18710:                        if(T == 2 && AI[0] != 0){
                   18711:                                DN = cons(simplify(-AI2,Fuc,4), cons(simplify(AI1+1,Fuc,4),DN));
                   18712:                                NM = cons(simplify(-AI2-AI[0],Fuc,4), cons(simplify(AI1+AI[0]+1,Fuc,4),
                   18713:                                 NM));
                   18714:                        }
                   18715:                        for(J = 1; J < NP; J++)
                   18716:                                AD[J] += simplify(AI[J],Fuc,4);
                   18717:                }
                   18718:                if(T == 2){
                   18719:                        ALT = AL[I][1][1]; AI1 = ALT[length(ALT)-1][1];
                   18720:                        ALT = AL[I][1][2]; AI2 = ALT[length(ALT)-1][1];
                   18721:                        if(I == 0){
                   18722:                                 C3 = AI1; C4 = AI2;
                   18723:                        }
                   18724:                }
                   18725:        }
                   18726:
                   18727: /* Connection */
                   18728:        if(T == 2){
                   18729:                DNT = lsort(NM,DN,"reduce");
                   18730:                NMT = DNT[0]; DNT = DNT[1];
                   18731:                if(TeX < 0) return [NMT,DNT,AD];
                   18732:                C0 = M[1][length(M[1])-1][1];
                   18733:                C1 = M[2][length(M[2])-1][1];
                   18734:                M =  AL[0][1];
                   18735:                C3 = M[1][length(M[1])-1][1];
                   18736:                C4 = M[2][length(M[2])-1][1];
                   18737:                Out = str_tb(["c(0\\!:\\!", my_tex_form(C0),
                   18738:                        " \\rightsquigarrow 1\\!:\\!", my_tex_form(C1),")"], "");
                   18739:                if(R > 0 && AMSTeX == 1 && (TeXEq == 4 || TeXEq == 5)){
                   18740:                        write_to_tb("\\\\\n", Out);
                   18741:                        if(TeXEq == 5) write_to_tb(" &", Out);
                   18742:                }
                   18743:                write_to_tb("=\\frac{\n",Out);
                   18744:                for(PT = NMT; PT != []; PT = cdr(PT))
                   18745:                        write_to_tb("  \\Gamma("+my_tex_form(car(PT))+")\n", Out);
                   18746:                write_to_tb(" }{\n",Out);
                   18747:                for(PT = DNT; PT != []; PT = cdr(PT))
                   18748:                        write_to_tb("  \\Gamma("+my_tex_form(car(PT))+")\n",Out);
                   18749:                write_to_tb(" }", Out);
                   18750:                for(J = 3; J < length(AD); J++){
                   18751:                        if(AD[J] == 0) continue;
                   18752:                        str_tb(["\n (1-x_", rtotex(J), "^{-1})^", rtotex(AD[J])], Out);
                   18753:                }
                   18754:                if(R != 0)
                   18755:                        str_tb(["\n c_B(0\\!:\\!", my_tex_form(C3),
                   18756:                                " \\rightsquigarrow 1\\!:\\!", my_tex_form(C4), ")"], Out);
                   18757:                Out = tb_to_string(Out);
                   18758:                if(Dviout >= 0){
                   18759:                        dviout(Out|eq=0,keep=Keep);
                   18760:                        return 1;
                   18761:                }
                   18762:                return Out;
                   18763:        }
                   18764:
                   18765: /*  Series */
                   18766:        if(T == 4){
                   18767:                AL11 = AL[0][1][1];
                   18768:                V = AL11[length(AL11)-1][1];
                   18769:                S00 = -V; S01 = (R==0)?[]:[[0,0]];
                   18770:                S1 = S2 = [];
                   18771:                for(Ix = 1, ALL = cdr(AL); ALL != []; ){
                   18772:                        ALT = ALL[0][0];
                   18773:                        if(ALT[0] != 0){ /* mc */
                   18774:                                for(Sum = [], ST = S01; ST != []; ST = cdr(ST))
                   18775:                                        Sum = cons(car(ST)[0], Sum);
                   18776:                                S1 = cons(cons(S00+1,Sum), S1);
                   18777:                                S2 = cons(cons(S00+1+ALT[0],Sum),S2);
                   18778:                                S00 += ALT[0];
                   18779:                        }
                   18780:                        ALL = cdr(ALL);
                   18781:                        for(I = 1; I < length(ALT); I++){  /* addition */
                   18782:                                if(I == 1){
                   18783:                                        S00 += ALT[1];
                   18784:                                        if(ALL == [])
                   18785:                                                S00 = [S00];
                   18786:                                }else{
                   18787:                                        if(ALT[I] == 0)
                   18788:                                                continue;
                   18789:                                        if(ALL != []){
                   18790:                                                S1 = cons([-ALT[I],Ix],S1);
                   18791:                                                S2 = cons([1,Ix],S2);
                   18792:                                                S01= cons([Ix,I],S01);
                   18793:                                                Ix++;
                   18794:                                        }else
                   18795:                                                S00 = cons([ALT[I],I],S00);
                   18796:                                }
                   18797:                        }
                   18798:                }
                   18799:                S00 = reverse(S00);
                   18800:                S01 = qsort(S01); S1 = qsort(S1); S2 = qsort(S2);
                   18801:                if(Simp >= 0){
                   18802:                         S00 = simplify(S00,Fuc,4);
                   18803:                         S01 = simplify(S01,Fuc,4);
                   18804:                         S1  = simplify(S1,Fuc,4);
                   18805:                         S2  = simplify(S2,Fuc,4);
                   18806:                         SS  = lsort(S1,S2,"reduce");
                   18807:                         S1 = SS[0]; S2 = SS[1];
                   18808:                }
                   18809:
                   18810:                if(TeX >= 0){
                   18811:                                                 /* Top linear power */
                   18812:                        TOP = Ps = Sm = "";
                   18813:                        for(TOP = Ps = Sm = "", ST = cdr(S00); ST != []; ST = cdr(ST)){
                   18814:                                SP = car(ST);
                   18815:                                if(SP[0] != 0){
                   18816:                                        if(SP[1] == 2)
                   18817:                                                TOP += "(1-x)^"+rtotex(SP[0]);
                   18818:                                        else
                   18819:                                                TOP += "(1-x/x_"+rtotex(SP[1])+")^"+rtotex(SP[0]);
                   18820:                                }
                   18821:                        }
                   18822:                                                 /* Top power */
                   18823:                        PW = my_tex_form(car(S00));
                   18824:                        if(PW == "0")
                   18825:                                PW = "";
                   18826:                        NP = length(AL[0][1]);
                   18827:                        PWS = newvect(NP);
                   18828:                        for(I = 0; I < NP; I++)
                   18829:                                PWS[I] = "";
                   18830:                        for(S = S01, I = 0; S != []; S = cdr(S), I++){
                   18831:                                SI = rtotex(car(S)[0]);
                   18832:                                if(I > 0) Sm += ",\\ ";
                   18833:                                Sm += "n_"+SI+"\\ge0";
                   18834:                                if(PW != "")
                   18835:                                        PW += "+";
                   18836:                                PW += "n_"+SI;
                   18837:                                if(car(S)[1] > 2)
                   18838:                                        PWS[car(S)[1]] += "-n_"+rtotex(car(S)[0]);
                   18839:                                else if(car(S)[1] == 0)
                   18840:                                        Ps = "C_{n_0}"+Ps;
                   18841:                        }
                   18842:                        for(I = 3; I < NP; I++){
                   18843:                                if(PWS[I] != "")
                   18844:                                        Ps += "x_"+rtotex(I)+"^{"+PWS[I]+"}";
                   18845:                        }
                   18846:                        Out = str_tb([TOP, Ps, "x^{", PW, "}"], "");
                   18847:                                 /* Gamma factor */
                   18848:                        for(I = 0, SS = S1; I <= 1; I++, SS = S2){
                   18849:                                PW = string_to_tb("");
                   18850:                                for(PW1=""; SS != [] ; SS = cdr(SS)){
                   18851:                                        for(J = 0, SST = car(SS); SST != [];  SST = cdr(SST), J++){
                   18852:                                                if(J == 0){
                   18853:                                                        JJ = (car(SST) == 1)?((length(SST)==2)?(-1):0):1;
                   18854:                                                        if(JJ > 0)
                   18855:                                                                str_tb(["(", my_tex_form(car(SST)), ")_{"], PW);
                   18856:                                                        else if(JJ == 0)
                   18857:                                                                PW1 = "(";
                   18858:                                                }else{
                   18859:                                                        if(JJ > 0){
                   18860:                                                                if(J > 1) write_to_tb("+", PW);
                   18861:                                                                str_tb(["n_", rtotex(car(SST))], PW);
                   18862:                                                        }else{
                   18863:                                                                if(J > 1) PW1 += "+";
                   18864:                                                                PW1 += "n_"+rtotex(car(SST));
                   18865:                                                        }
                   18866:                                                }
                   18867:                                        }
                   18868:                                        if(JJ > 0) write_to_tb("}", PW);
                   18869:                                        else PW1 += (JJ == 0)?")!":"!";
                   18870:                                }
                   18871:                                if(I == 0)
                   18872:                                        Out0 = "\\frac";
                   18873:                                Out0 += "{"+tb_to_string(PW)+PW1+"}";
                   18874:                                PW = string_to_tb(""); PW1 = "";
                   18875:                        }
                   18876:                        if(Out0 == "\\frac{}{}")
                   18877:                                Out0 = "";
                   18878:                        Out = "\\sum_{"+Sm+"}"+Out0 + Top + tb_to_string(Out);
                   18879:                        if(length(S01) == 1){
                   18880:                                Out = str_subst(Out, "{n_"+SI+"}", "n");
                   18881:                                Out = str_subst(Out, "n_"+SI, "n");
                   18882:                        }
                   18883:                        if(Dviout >= 0)
                   18884:                                dviout(Out|eq=0,keep=Keep);
                   18885:                        return Out;
                   18886:                }
                   18887:                return [cons(S00, S01), S1, S2];
                   18888:        }
                   18889:
                   18890: /* Operator */
                   18891:        if(T==3){
                   18892:                Fuc0 = car(Fuc);
                   18893:                if(Fuc0 != 0){  /* Kill Fuchs relation */
                   18894:                        for(V = vars(Fuc0); V != []; V = cdr(V)){
                   18895:                                VT = car(V);
                   18896:                                if(deg(Fuc0,VT) == 1){
                   18897:                                        AL = mysubst(AL, [VT, -red(coef(Fuc0,0,VT)/coef(Fuc0,1,VT))]);
                   18898:                                        break;
                   18899:                                }
                   18900:                        }
                   18901:                        if(V == []){
                   18902:                                print("Fuchs condition has no variable with degree 1");
                   18903:                                return 0;
                   18904:                        }
                   18905:                }
                   18906:                L = newvect(NP);
                   18907:                Pt = getopt(pt);
                   18908:                for(I = NP-1; I >= 1; I--){
                   18909:                        if(type(Pt) == 4)
                   18910:                                L[I] = Pt[I-1];
                   18911:                        else if(I >= 3 || X1 >= 0 || (X2 >= 0 && I >= 2))
                   18912:                                L[I] = makev(["x_", I]);
                   18913:                        else L[I] = I-1;
                   18914:                }
                   18915:                if(R){  /* non-rigid basic */
                   18916:                        MM = AL[0][1];  /* Riemann scheme */
                   18917:                        for(OD = 0, MT = car(MM); MT != []; MT = cdr(MT))
                   18918:                                OD += car(MT)[0];
                   18919:                        for(V = DN = [], M = MM; M != []; M = cdr(M)){
                   18920:                                MT = car(M);  /* exponents */
                   18921:                                for(K = KM = 0, NT = []; ; K++){
                   18922:                                        for(J = 0, P = 1, MTT = MT; MTT != []; MTT = cdr(MTT)){
                   18923:                                                if(J == 0 && car(MTT)[1] == 0)
                   18924:                                                        KM = car(MTT)[0];
                   18925:                                                for(KK = car(MTT)[0] - K -1; KK >= 0;  KK--)
                   18926:                                                        P *= (dx-car(MTT)[1]-KK);
                   18927:                                        }
                   18928:                                        if(P == 1) break;
                   18929:                                        NT = cons(P,NT);
                   18930:                                }
                   18931:                                V = cons(reverse(NT), V);
                   18932:                                DN = cons(KM, DN);
                   18933:                        }
                   18934:                        V  = ltov(reverse(V));   /* conditions for GRS */
                   18935:                        DN = ltov(reverse(DN));  /* dims of local hol. sol. */
                   18936:                        for(J = OD; J >= 0; J--){
                   18937:                                for(I = Q = 1; I < NP; I++){
                   18938:                                        if(J > DN[I])
                   18939:                                                Q *= (x-L[I])^(J-DN[I]);
                   18940:                                }
                   18941:                                K = mydeg(Q,x);
                   18942:                                if(J == OD){
                   18943:                                        P = Q*dx^J;
                   18944:                                        DM = K;
                   18945:                                }else{
                   18946:                                        for(I = DM-OD+J-K; I >= 0; I--){
                   18947:                                                X = makev(["r",J,"_",I]);
                   18948:                                                P += Q*x^I*X*dx^J;
                   18949:                                        }
                   18950:                                }
                   18951:                        }
                   18952:                        for(R = [], I = 0; I < NP; I++){
                   18953:                                Q = toeul(P, [x,dx], (I==0)?"infty":L[I]);  /* Euler at I-th pt */
                   18954:                                for(VT = V[I], J=0; VT != [] ; VT = cdr(VT), J++){
                   18955:                                         if(car(VT) != 0)
                   18956:                                                 R = cons(rpdiv(coef(Q,J,x), car(VT), dx)[0], R); /* equations */
                   18957:                                }
                   18958:                        }
                   18959:                        for(RR = RRR = [], I = OD-1; I>=0; I--){
                   18960:                                 RR = [];
                   18961:                                 for(RT = R; RT != [] ; RT = cdr(RT)){
                   18962:                                         if( (VT = mycoef(car(RT), I, dx)) != 0)
                   18963:                                                 RR = cons(VT, RR);   /* real linear eqs */
                   18964:                                 }
                   18965:                                 J = mydeg(mycoef(P,I,dx),x);
                   18966:                                 for(S = 0, VVV = []; J >= 0; J--){
                   18967:                                         X = makev(["r",I,"_",J]);
                   18968:                                         VVV = cons(X, VVV);     /* unknowns */
                   18969:                                 }
                   18970:                                 RR = lsol(RR,VVV);
                   18971:                                 LN = length(RR);
                   18972:                                 for(K=0; K<LN; K++){
                   18973:                                         RRT = RR[K];
                   18974:                                         if(type(RRT) != 4) continue;
                   18975:                                         R = mysubst(R,RRT);
                   18976:                                         P = mysubst(P,RRT);
                   18977:                                 }
                   18978:                        }
                   18979:                }else  /* Rigid case */
                   18980:                        P = dx^(AL[0][1][0][0][0]);
                   18981:  /* additions and middle convolutions */
                   18982:                for(ALT = AL; ALT != []; ALT = cdr(ALT)){
                   18983:                        AI = car(ALT)[0];
                   18984:                        if(type(AI) != 4) continue;
                   18985:                        V = ltov(AI);
                   18986:                        if(V[0] != 0) P = mc(P,x,V[0]);
                   18987:                        for(I = 1; I < NP; I++){
                   18988:                                if(V[I] != 0)
                   18989:                                        P = sftexp(P,x,L[I],-V[I]);
                   18990:                        }
                   18991:                }
                   18992:                P = (Simp>=0)? simplify(P,Fuc,4|var=[dx]):simplify(P,Fuc,4);
                   18993:                if(TeX >= 0){
                   18994:                        Val = 1;
                   18995:                        if(mydeg(P,dx) > 2 && AMSTeX == 1 && TeXEq > 3)
                   18996:                                Val = (TeXEq==5)?3:2;
                   18997:                        Out = fctrtos(P|var=[dx,"\\partial"],TeX=Val);
                   18998:                        if(Dviout < 0) return Out;
                   18999:                        dviout(Out|eq=0,keep=Keep);
                   19000:                        return 1;
                   19001:                }
                   19002:                return P;
                   19003:        }
                   19004:        return 0;
                   19005: }
                   19006:
                   19007: def mcop(P,M,S)
                   19008: {
                   19009:        for(V=[],ST=S;ST!=[];ST=cdr(ST))
                   19010:                if(isvar(VT=car(ST))) V=cons(vweyl(VT),V);
                   19011:        V=reverse(V);
                   19012:        N=length(V);
                   19013:        for(MT=M;MT!=[];MT=cdr(MT)){
                   19014:                T=car(MT);
                   19015:                if(T[0]!=0)
                   19016:                        P=mc(P,V[0],T[0]);
                   19017:                for(TT=cdr(T),ST=cdr(S);ST!=[];TT=cdr(TT),ST=cdr(ST))
                   19018:                        if(car(TT)!=0) P=sftpexp(P,V,S[0]-ST[0],-car(TT));
                   19019:        }
                   19020:        return P;
                   19021: }
                   19022:
                   19023: /* option: zero, all, raw */
                   19024: def shiftop(M,S)
                   19025: {
                   19026:        if(type(M)==7)  M=s2sp(M);
                   19027:        if(type(S)==7)  S=s2sp(S);
                   19028:        Zero=getopt(zero);
                   19029:        NP=length(M);
                   19030:        for(V=L=[],I=NP-1; I>=0; I--){
                   19031:                V=cons(strtov(asciitostr([97+I])),V);
                   19032:                if(I>2) L=cons(makev(["y_", I-1]),L);
                   19033:                else L=cons(I-1,L);
                   19034:        }
                   19035:        if(type(M[0][0])==4){
                   19036:                F=1;RS=M;SS=S;
                   19037:                R=chkspt(M);
                   19038:                if(R[2]!=2 || R[3]!=0){
                   19039:                        mycat("GRS is not valid!");return 0;
                   19040:                }
                   19041:                for(; S!=[]; S=cdr(S)){
                   19042:                        if(nmono(S[0][0])!=1) break;
                   19043:                        if(isint(S[0][1]-S[0][0])==0) break;
                   19044:                }
                   19045:                if(S!=[]){
                   19046:                        mycat("Error in shift!"); return 0;
                   19047:                }
                   19048:        }else{
                   19049:                F=0;
                   19050:                RS=sp2grs(M,V,[1,length(M[0]),1]);
                   19051:                for(SS=S0=[],I=0; I<NP; I++){
                   19052:                        for(J=F=0; J<length(M[I]); J++){
                   19053:                                if(I==0 && J==length(M[0])-1) break;
                   19054:                                if((U=S[I][J])!=0){
                   19055:                                        if(isint(U)!=1){
                   19056:                                                mycat("Error in shift!"); return 0;
                   19057:                                        }
                   19058:                                        VT=RS[I][J][1];
                   19059:                                        SS=cons([VT,VT+U],SS);
                   19060:                                }else if(I>0 && Zero==1 && F==0){
                   19061:                                        RS=mysubst(RS,[RS[I][J][1],0]);
                   19062:                                        F=J+1;
                   19063:                                }
                   19064:                        }
                   19065:                        if((F>0 && J==2) || (I==0 && J==1)){
                   19066:                                J=(I==0)?0:2-F; VT=RS[I][J][1];
                   19067:                                S0=cons([VT,strtov(asciitostr([strtoascii(rtostr(VT))[0]]))],S0);
                   19068:                        }
                   19069:                }
                   19070:        }
                   19071:        RS1=mysubst(RS,SS);
                   19072:        if(F==1){
                   19073:                R=chkspt(RS1);
                   19074:                if(R[2]!=2 || R[3]!=0){
                   19075:                        mycat("Error in shift!");
                   19076:                        return 0;
                   19077:                }
                   19078:        }
                   19079:        R=getbygrs(RS,1); R1=getbygrs(RS1,1);
                   19080:        RT=R[0][1][0];
                   19081:        if(length(RT)!=1 || RT[0][0]!=1){
                   19082:                mycat("Not rigid!");
                   19083:                return 0;
                   19084:        }
                   19085:        P=dx;Q=Q1=1;
                   19086:        for(RT = R, RT1=R1; RT != []; RT = cdr(RT), RT1=cdr(RT1)){
                   19087:                V=car(RT)[0]; V1=car(RT1)[0];
                   19088:                if(type(V) != 4) continue;
                   19089:
                   19090:                if(V[0] != 0){
                   19091:                        P = mc(P,x,V[0]);  /* middle convolution */
                   19092:                        QT = mc(Q,x,V[0]);
                   19093:                }else QT=Q;
                   19094:                D0=mydeg(Q,dx);D0T=mydeg(QT,dx);
                   19095:                C0=red(mycoef(Q,D0,dx)/mycoef(QT,D0T,dx));
                   19096:                if(C0!=1) QT=red(C0*QT);
                   19097:
                   19098:                if(V1[0] != 0) Q1T = mc(Q1,x,V1[0]);
                   19099:                else Q1T=Q1;
                   19100:                D1=mydeg(Q1,dx);D1T=mydeg(Q1T,dx);
                   19101:                C1=red(mycoef(Q1,D1,dx)/mycoef(Q1T,D1T,dx));
                   19102:                if(C1!=1) Q1T=red(C1*Q1T);
                   19103:                DD=(V[0]-V1[0])+(D0-D0T)-(D1-D1T);
                   19104:                if(DD>0){
                   19105:                        QT=muldo(dx^DD,QT,[x,dx]);
                   19106:                        D0T+=DD;
                   19107:                }else if(DD<0){
                   19108:                        Q1T=muldo(dx^(-DD),Q1T,[x,dx]);
                   19109:                        D1T-=DD;
                   19110:                }
                   19111:                C=mylcm(dn(QT),dn(Q1T),x);
                   19112:                if(C!=1){
                   19113:                        QT=red(C*QT); Q1T=red(C*Q1T);
                   19114:                }
                   19115:                Q=QT;Q1=Q1T;
                   19116:                for(I = 1; I < NP; I++){
                   19117:                        if(V[I]!=0){
                   19118:                                P = sftexp(P,x,L[I],-V[I]);  /* addition u -> (x-L[I])^V[I]u */
                   19119:                                QT = sftexp(QT,x,L[I],-V[I]);
                   19120:                        }
                   19121:                        if(V1[I]!=0)
                   19122:                                Q1T = sftexp(Q1T,x,L[I],-V1[I]);
                   19123:                }
                   19124:                C=red(mycoef(QT,D0T,dx)*mycoef(Q1,D1T,dx)/(mycoef(Q,D0T,dx)*mycoef(Q1T,D1T,dx)));
                   19125:                Q=red(dn(C)*QT);Q1=red(nm(C)*Q1T);
                   19126:                for(I = 1; I < NP; I++){
                   19127:                        if((J=V[I]-V1[I])!=0){
                   19128:                                if(J>0) Q1*=(x-L[I])^J;
                   19129:                                else Q*=(x-L[I])^(-J);
                   19130:                        }
                   19131:                        while((QT=tdiv(Q,x-L[I]))!=0){
                   19132:                                if((Q1T=tdiv(Q1,x-L[I]))!=0){
                   19133:                                        Q=QT;Q1=Q1T;
                   19134:                                }else break;
                   19135:                        }
                   19136:                }
                   19137:        }
                   19138:        P1=mysubst(P,SS);
                   19139:        if(type(S0)==4 && S0!=[]){
                   19140:                P=mysubst(P,S0); Q=mysubst(Q,S0);
                   19141:                P1=mysubst(P1,S0); Q1=mysubst(Q1,S0);
                   19142:                RS=mysubst(RS,S0); RS1=mysubst(RS1,S0);
                   19143:        }
                   19144:        R=mygcd(Q1,P1,[x,dx]);
                   19145:        if(findin(dx,vars(R[0]))>=0){
                   19146:                mycat("Some error!");
                   19147:                return 0;
                   19148:        }
                   19149:        Q=muldo(R[1]/R[0],Q,[x,dx]);
                   19150:        R=divdo(Q,P,[x,dx]);
                   19151:        Q=red(R[1]/R[2]);
                   19152:        R=fctr(nm(Q));
                   19153:        QQ=Q/R[0][0];
                   19154:        R1=fctr(dn(QQ));
                   19155:        for(RR=cdr(R1); RR!=[]; RR=cdr(RR)){
                   19156:                VT=vars(car(RR)[0]);
                   19157:                if(findin(x,VT)<0 && findin(dx,VT)<0){
                   19158:                        for(I=car(RR)[1];I>0;I--) QQ=red(QQ*car(RR)[0]);
                   19159:                }
                   19160:        }
                   19161:        Raw=getopt(raw);
                   19162:        Dviout=getopt(dviout);
                   19163:        if(Dviout==1) Raw=4;
                   19164:        if(Raw!=1){
                   19165:                for(RR=cdr(R); RR!=[]; RR=cdr(RR)){
                   19166:                        VT=vars(car(RR)[0]);
                   19167:                        if(findin(x,VT)<0 && findin(dx,VT)<0){
                   19168:                                for(I=car(RR)[1];I>0;I--) QQ=red(QQ/car(RR)[0]);
                   19169:                        }
                   19170:                }
                   19171:        }
                   19172:        if(Raw==2||Raw==3||Raw==4){
                   19173:                R=mygcd(QQ,P,[x,dx]);  /* R[0]=R[1]*QQ + R[2]*P */
                   19174:                Q1=red(R[0]/R[2]);
                   19175:                for(Q=1,RR=cdr(fctr(nm(Q1))); RR!=[]; RR=cdr(RR)){
                   19176:                        VT=vars(car(RR)[0]);
                   19177:                        if(findin(x,VT)<0){
                   19178:                                for(I=car(RR)[1];I>0;I--) Q*=car(RR)[0];
                   19179:                        }
                   19180:                }
                   19181:                if(Raw==3) QQ=[QQ,Q];
                   19182:                else if(Raw==4)    /* Q=Q*R[1]/R[0]*QQ+Q/R[0]*P */
                   19183:                        QQ=[QQ,Q,red(R[1]*Q/R[0])];
                   19184:                else QQ=Q;
                   19185:        }
                   19186:        F=getopt(all);
                   19187:        if(Dviout==1){
                   19188:                Pre = " x=\\infty & 0 & 1";
                   19189:                for(I=3; I<NP; I++) Pre = Pre+"& "+rtostr(L[I]);
                   19190:                Pre = Pre+"\\\\\n";
                   19191:                PW=str_tb(ltotex(RS|opt="GRS",pre=Pre),0);
                   19192:                str_tb(
                   19193: "=\\{u\\mid Pu=0\\}\\\\\n&\\underset{Q_2}{\\overset{Q_1}{\\rightleftarrows}}\n",PW);
                   19194:                str_tb([ltotex(RS1|opt="GRS",pre=Pre),"\\\\\n"],PW);
                   19195:                R=fctrtos(QQ[0]|TeX=3,var=[dx,"\\partial"]);
                   19196:                if(type(R)==4)  R="\\frac1{"+R[1]+"}"+R[0];
                   19197:                str_tb(["Q_1&=",R,"\\\\\n"],PW);
                   19198:                R=fctrtos(QQ[2]|TeX=3,var=[dx,"\\partial"]);
                   19199:                if(type(R)==4)  R="\\frac1{"+R[1]+"}"+R[0];
                   19200:                str_tb(["Q_2&=",R,"\\\\\n"],PW);
                   19201:                str_tb(["Q_2Q_1&\\equiv ",fctrtos(QQ[1]|TeX=3),"\\mod W(x)P"],PW);
                   19202:                if(F==1)
                   19203:                        str_tb(["\\\\\nP&=",fctrtos(P|TeX=3,var=[dx,"\\partial"])],PW);
                   19204:                dviout(str_tb(0,PW)|eq=0,title="Shift Operator");
                   19205:        }
                   19206:        if(F==1) return [QQ,P,RS,P1,RS1];
                   19207:        else if(F==0) return QQ;
                   19208:        return [QQ,P,RS];
                   19209: }
                   19210:
1.56      takayama 19211:
                   19212: def shiftPfaff(A,B,G,X,M)
                   19213: {
                   19214:        if(type(G)==4){
                   19215:                G0=G[1];G1=G[0];
                   19216:        }
                   19217:        if(type(G)==6){
                   19218:                G=map(red,G);
                   19219:                G0=llcm(G);G1=map(red,G0*G);
                   19220:        }
                   19221:        if(type(G)==3){
                   19222:                G=red(G);G0=dn(G);G1=nm(G);
                   19223:        }
                   19224:        if(type(M)==4){
                   19225:                M0=M[0];M1=M[1];
                   19226:        }else{
                   19227:                M0=M;M1=0;
                   19228:        }
                   19229:        X=vweyl(X);
                   19230:        D0=mydeg(G0,X[0]);D1=mydeg(G1,X[0]);
                   19231:        if(M1>=0){
                   19232:                D=(D1-M1>D0)?D1-M1:D0;
                   19233:                G0=muldo(X[1]^D,G0,X);G1=muldo(X[1]^(D+M1),G1,X);
                   19234:        }else{
                   19235:                D=(D0+M1>D1)?D0+M1:D1;
                   19236:                G0=muldo(X[1]^(D-M1),G0,X);G1==muldo(X[1]^D,G1,X);
                   19237:        }
                   19238:        G0=map(mc,G0,X,M0);G1=map(mc,G1,X,M0+M1);
                   19239:        G0=appldo(G0,A,X|Pfaff=1);
                   19240:        G1=sppldo(G1,B,X|Pfaff=1);
                   19241:        return rmul(myinv(G0),G1);
                   19242: }
                   19243:
1.6       takayama 19244: def conf1sp(M)
                   19245: {
                   19246:        if(type(M)==7) M=s2sp(M);
                   19247:        L0 = length(M);
                   19248:        L1 = length(M[L0-1]);
                   19249:        X2 = getopt(x2);
                   19250:        Conf= getopt(conf);
                   19251:        if(Conf != 0)
                   19252:                Conf = -1;
                   19253:        if((X2==1 || X2==-1) && Conf != 0){
                   19254:                X1 = 0;
                   19255:                X = x_1;
                   19256:        }else{
                   19257:                X1 = 1;
                   19258:                X = x_2;
                   19259:        }
                   19260:        G = sp2grs(M,a,[L0,L1]);
                   19261:        for(I = 0; I < L0-1; I++){
                   19262:                V = makev([a,I-Conf,0]);
                   19263:                G = subst(G,V,0);
                   19264:        }
                   19265:        L2 = length(M[1]);
                   19266:        for(I=J=S0=S1=0; I < L2; I++){
                   19267:                S1 += G[1][I][0];
                   19268:                while(S0 < S1){
                   19269:                        S0 += G[0][J][0];
                   19270:                        if((V=G[0][J][1]) != 0)
                   19271:                                G = mysubst(G,[V,V-G[1][I][1]]);
                   19272:                        J++;
                   19273:                }
                   19274:                if(S0 > S1){
                   19275:                        print("Error in data!");
                   19276:                        return 0;
                   19277:                }
                   19278:        }
                   19279:        if(Conf==0){
                   19280:                for(L=[], I=L0-2; I>=0; I--)
                   19281:                        L=cons(I,L);
                   19282:                L=cons(L0-1,L);
                   19283:                P = getbygrs(G,["operator","x2"]|perm=L);
                   19284:        }else if(X1)
                   19285:                P = getbygrs(mperm(G,[[1,2]],[]), ["operator","x2"]);
                   19286:        else
                   19287:                P = getbygrs(G,["operator","x1"]);
                   19288:        if(Conf==0)
                   19289:                P=nm(mysubst(P,[X,c]));
                   19290:        else{
                   19291:                P = nm(mysubst(P,[X,1/c]));
                   19292:                if(X2==-1){
                   19293:                        for(I=2; I<L0; I++){
                   19294:                                V=makev(["x_",I]); VC=makev([c,I]);
                   19295:                                P = nm(mysubst(P,[V,1/VC]));
                   19296:                        }
                   19297:                }
                   19298:        }
                   19299:        for(I = 1; I < L2; I++){
                   19300:                X = G[1][I][1];
                   19301:                P = nm(mysubst(P,[X,X/c]));
                   19302:        }
                   19303:        VS = vars(P);
                   19304:        while(VS!=[]){
                   19305:                V = car(VS);
                   19306:                if(str_chr(rtostr(V),0,"r")==0){
                   19307:                        CV = mycoef(P,1,V);
                   19308:                        D = mymindeg(CV,c);
                   19309:                        if(D > 0) P = mysubst(P,[V,V/c^D]);
                   19310:                        CV = mycoef(P,1,V);
                   19311:                        DD = mydeg(CV,dx);
                   19312:                        CVV = mycoef(CV,DD,dx);
                   19313:                        CD1 = mydeg(CVV,x);
                   19314:                        CD  = (X==x1)?0:CD1;
                   19315:                        while(CD>=0 && CD<=CD1){
                   19316:                                CC = mycoef(CVV,CD,x);
                   19317:                                if(type(CC)==1){
                   19318:                                        VT = mycoef(mycoef(mycoef(P,DD,dx),CD,x),0,V)/CC;
                   19319:                                        if(VT != 0) P = mysubst(P,[V,V-VT]);
                   19320:                                        break;
                   19321:                                }
                   19322:                                if(X==x1) CD++;
                   19323:                                else CD--;
                   19324:                        }
                   19325:                        while(subst(P,c,0,V,0) == 0)
                   19326:                                P = red(mysubst(P,[V,c*V])/c);
                   19327:                }
                   19328:                VS =cdr(VS);
                   19329:        }
                   19330:        return P;
                   19331: }
                   19332:
1.44      takayama 19333: /* ((1)(1)) ((1))   111|11|21  [[ [2,[ [1,[1]],[1,[1]] ]], [1,[[1,[1]]]] ]]  */
                   19334: /* (11)(1),111  111|21,111 [[[2,[1,1]],[1,[1]]],[1,1,1]]  */
                   19335: def s2csp(S)
                   19336: {
                   19337:        if(type(S)!=7){
                   19338:                U="";
                   19339:                if(type(N=getopt(n))>0){
                   19340:                        for(D=0,S=reverse(S);S!=[];S=cdr(S),D++){
                   19341:                                if(D) U=","+U;
                   19342:                                T=str_subst(rtostr(car(S)),","," ");
                   19343:                                U=str_cut(T,1,str_len(T)-2)+U;
                   19344:                        }
                   19345:                        V=strtoascii(U);
                   19346:                        for(R=[];V!=[];V=cdr(V)){
                   19347:                                if((CC=car(V))==91){    /* [ */
                   19348:                                        if(length(V)>1 && V[1]==91) V=cdr(V);
                   19349:                                        for(I=1;(CC=V[I])!=91&&CC!=93;I++);
                   19350:                                        if(CC==91){
                   19351:                                                R=cons(40,R);   /* ( */
                   19352:                                                while(I--) V=cdr(V);
                   19353:                                        }else{
                   19354:                                                V=cdr(V);
                   19355:                                                while(--I) R=cons(car(V),R);
                   19356:                                        }
                   19357:                                }else if(CC==93){               /* ] */
                   19358:                                        R=cons(41,R);
                   19359:                                        if(length(V)>1 && V[1]==93) V=cdr(V);
                   19360:                                }else R=cons(CC,R);
                   19361:                        }
                   19362:                        return asciitostr(reverse(R));
                   19363:                }
                   19364:                for(;S!=[];S=cdr(S)){
                   19365:                        if(U!="") U=U+",";
                   19366:                        for(D=0,TU="",T=car(S);T!=[];D++){
                   19367:                                if(type(car(T))==4){
                   19368:                                        R=lpair(T,0);
                   19369:                                        T=R[0];R1=m2l(R[1]|flat=1);
                   19370:                                }else R1=[];
                   19371:                                if(D) TU="|"+TU;
                   19372:                                TU=s2sp([T])+TU;
                   19373:                                T=R1;
                   19374:                        }
                   19375:                                U=U+TU;
                   19376:                }
                   19377:                return U;
                   19378:        }
                   19379:        S=strtoascii(S);
1.45      takayama 19380:        if(type(N=getopt(n))>0){
                   19381:                S=ltov(S);
                   19382:                L=length(S);
                   19383:                R="";
                   19384:                for(I=J=N=0, V=[];J<L;J++){
                   19385:                        if(S[J]==72) I=J;                       /* ( */
                   19386:                        else if(S[J]>47&&S[J]<58) N=N*10+S[J]-48;
                   19387:                        else{
                   19388:                                if(N>0){
                   19389:                                        V=cons(N,V);
                   19390:                                        N=0;
                   19391:                                }
                   19392:                                if(S[J]==41){   /* ) */
                   19393:
                   19394:                                }else if(S[J]==44){             /* , */
                   19395:
                   19396:                                }
                   19397:                        }
                   19398:                }
                   19399:        }
1.44      takayama 19400:        for(P=TS=[],I=D=0; S!=[]; S=cdr(S)){
                   19401:                if((C=car(S))==44){                     /* , */
                   19402:                        P=cons(D,P);D=0;
                   19403:                }else if(C==124){       /* | */
                   19404:                        D++;C=44;
                   19405:                }
                   19406:                TS=cons(C,TS);
                   19407:        }
                   19408:        S=reverse(TS);
                   19409:        P=reverse(cons(D,P));
                   19410:        U=s2sp(asciitostr(S));
                   19411:
                   19412:        for(R=[];P!=[];P=cdr(P),U=cdr(U)){
                   19413:                D=car(P);R0=car(U);
                   19414:                while(D--){
                   19415:                        U=cdr(U);
                   19416:                        for(U0=car(U),R2=[];U0!=[];U0=cdr(U0)){
                   19417:                                for(R1=[],N=car(U0);N>0;R0=cdr(R0)){
                   19418:                                        R1=cons(car(R0),R1);
                   19419:                                        if(type(car(R0))==4) N-=car(R0)[0];
                   19420:                                        else N-=car(R0);
                   19421:                                }
                   19422:                                R2=cons([car(U0),reverse(R1)],R2);
                   19423:                        }
                   19424:                        R0=reverse(R2);
                   19425:                }
                   19426:                R=cons(R0,R);
                   19427:        }
                   19428:        return reverse(R);
                   19429: }
                   19430:
                   19431:
1.36      takayama 19432: def partspt(S,T)
                   19433: {
1.40      takayama 19434:        if(length(S)>length(T)) return [];
1.38      takayama 19435:        if(type(Op=getopt(opt))!=1) Op=0;
1.40      takayama 19436:        else{
                   19437:                VS=ltov(S);
                   19438:                L=length(S)-1;
                   19439:                VT=ltov(qsort(T));
                   19440:        }
1.38      takayama 19441:        if(length(S)==length(T)){
1.40      takayama 19442:                if(S==T||qsort(S)==qsort(T)) R=S;
1.38      takayama 19443:                else return [];
1.40      takayama 19444:        }else if(getopt(sort)==1){
                   19445:                S0=S1=[];
                   19446:                for(;S!=[]&&car(S)==car(T);S=cdr(S),T=cdr(T))
                   19447:                        S0=cons(car(S),S0);
                   19448:                if(S!=[]&&car(S)<car(T)) return [];
                   19449:                S0=reverse(S0);
                   19450:                for(S=reverse(S),T=reverse(T);S!=[],car(S)==car(T);S=cdr(S),T=cdr(T))
                   19451:                        S1=cons(car(S),S1);
                   19452:                if(car(S)!=[]&&car(S)<cat(T)) return [];
                   19453:                R=partspt(reverse(S),reverse(T));
                   19454:                if(S1!=[]){
                   19455:                        for(R0=[];R!=[];R=cdr(R))
                   19456:                                R0=cons(append(car(R),S1),R0);
                   19457:                        R=reverse(R0);
                   19458:                }
                   19459:                if(S0!=[]){
                   19460:                        for(R0=[];R!=[];R=cdr(R))
                   19461:                                R0=cons(append(S0,car(R)),R0);
                   19462:                        R=reverse(R0);
                   19463:                }
1.38      takayama 19464:        }else{
                   19465:          for(R=[];;){
                   19466:                for(I=J=P=0;I<L;I++){
                   19467:                        P=VS[I];
                   19468:                        X=100000;
                   19469:                        while((P-=(Y=VT[J++]))>0){
                   19470:                                if(X<Y) break;
                   19471:                                X=Y;
                   19472:                        }
                   19473:                        if(X<Y||P<0) break;
                   19474:                }
                   19475:                if(!P&&X>=Y) R=cons(vtol(VT),R);
                   19476:                if(!vnext(VT)) break;
                   19477:          }
1.36      takayama 19478:        }
1.38      takayama 19479:        if(Op){
                   19480:                for(W=[];R!=[];R=cdr(R)){
                   19481:                        for(I=0,S=VS[0],K=U=[],TR=car(R);TR!=[];TR=cdr(TR)){
                   19482:                                K=cons(car(TR),K);
                   19483:                                if(!(S-=car(K))){
                   19484:                                        U=cons([VS[I],reverse(K)],U);
                   19485:                                        K=[];
                   19486:                                        S=VS[++I];
                   19487:                                        if(I==L){
                   19488:                                                U=cons([S,cdr(TR)],U);
                   19489:                                                break;
                   19490:                                        }
                   19491:                                }
1.36      takayama 19492:                        }
1.38      takayama 19493:                        W=cons(reverse(U),W);
                   19494:                }
                   19495:                R=W;
                   19496:                if(iand(Op,1)){
1.40      takayama 19497:                        for(R=[];W!=[];W=cdr(W))
1.38      takayama 19498:                                R=cons(reverse(qsort(car(W))),R);
                   19499:                        R=lsort(R,[],1);
                   19500:                }
                   19501:                if(Op==3){
                   19502:                        for(W=[];R!=[];R=cdr(R)){
                   19503:                                for(S=[],TR=car(R);TR!=[];TR=cdr(TR))
                   19504:                                        S=append(S,car(TR)[1]);
                   19505:                                W=cons(S,W);
1.36      takayama 19506:                        }
1.38      takayama 19507:                        R=reverse(W);
1.36      takayama 19508:                }
                   19509:        }
1.38      takayama 19510:        return R;
1.36      takayama 19511: }
                   19512:
1.38      takayama 19513: #if 0
1.36      takayama 19514: def confspt(S,T)
                   19515: {
                   19516:        R=[];
                   19517:        LS=length(S);LT=length(T);
                   19518:        if(LS<LT)  return R;
                   19519:        if(LS==LT){
                   19520:                return(S==T)? return [[S,T]]:R;
                   19521:        }
                   19522:        R=[];
                   19523:        for(ST=S,S0=T0=[],TT=T;ST!=[];ST=cdr(ST),TT=cdr(TT)){
                   19524:                if(car(ST)>car(TT)) return R;
                   19525:                if(car(ST)==car(TT){
                   19526:                        S0=cons(car(ST));T0=cons(car(TT));
                   19527:                        LS--;LT--;continue;
                   19528:                }
                   19529:                V=car(TT);D=LS-LT;
                   19530:                for(P=[ST],DD=D;DD>0;){
                   19531:                        VD=V-car(car(ST));
                   19532:                }
                   19533:        }
                   19534: }
                   19535: #endif
                   19536:
1.50      takayama 19537: def mcvm(N)
                   19538: {
                   19539:   X=getopt(var);
                   19540:   if((Z=getopt(z))!=1) Z=0;
                   19541:   if(type(N)==4){
                   19542:     if((K=length(N))==1&&isvar(X)) X=[X];
                   19543:     if(type(X)!=4){
                   19544:       for(X=[],I=0;I<K;I++) X=cons(asciitostr([97+I]),X);
                   19545:       X=reverse(X);
                   19546:     }
                   19547:        if(getopt(e)==1){
                   19548:          if(length(N)==4){
                   19549:                N=ltov(N);
                   19550:                if(N[1]<N[3]){
                   19551:                        I=N[1];N[1]=N[3];N[3]=I;
                   19552:                }
                   19553:                if(N[2]<N[3]||N[2]>=N[1]+N[3]) return 0;
                   19554:                X=X[0];
                   19555:                for(R=[],I=1;I<N[3];I++) R=cons(makev([X[0],I]),R);
                   19556:                for(L=[],I=N[1];I<=N[2];I++) L=cons(makev([X[0],I]),L);
                   19557:                for(S=0,I=N[1];I<=N[2];I++){
                   19558:                  V=makev([X[0],I]);
                   19559:           S+=polbyroot(R,V)/polbyroot(lsort(L,V,1),V);
                   19560:                  S=red(S);
                   19561:                }
                   19562:                return S;
                   19563:       }
                   19564:        }
                   19565:        for(M=[],I=S=0;I<K;Z=0,I++){
                   19566:                M=cons(mcvm(N[I]|var=X[I],z=Z),M);
                   19567:                S+=N[I];
                   19568:        }
                   19569:        M=newbmat(K,K,reverse(M));
1.52      takayama 19570:     NR=N;
1.50      takayama 19571:        N=S;
                   19572:   }else{
                   19573:        if(type(X)==7) X=strtov(X);
                   19574:        if(!isvar(X)) X=a;
                   19575:     M=newmat(N,N);
                   19576:     for(I=0;I<N;I++){
                   19577:       V=makev([X,I+1]);
                   19578:       for(J=0;J<=I;J++){
                   19579:         R=polbyroot([1,J],V|var=X);
                   19580:         if(Z==1) R*=V;
                   19581:         M[I][J]=R;
                   19582:       }
                   19583:     }
                   19584:   }
1.52      takayama 19585:   if((Get=getopt(get))==1){
1.50      takayama 19586:     for(R=[],I=0;I<N;I++){
                   19587:       U=newmat(N,N);
                   19588:       for(J=0;J<N;J++) U[J][J]=M[J][I];
1.56      takayama 19589:       R=cons(rmul(rmul(myinv(M),U),M),R);
1.50      takayama 19590:     }
                   19591:     return reverse(R);
1.52      takayama 19592:   }else if(Get==2||Get==3||Get==4){
1.51      takayama 19593:        for(V=[],I=N;I>0;I--) V=cons(makev(["a0",I]),V);
                   19594:     MI=myinv(M);
                   19595:        V=ltov(V)*MI;
                   19596:        for(R=[],I=0;I<N;I++){
                   19597:       for(J=I+1;J<N;J++){
                   19598:         K=newmat(N,N);
                   19599:         K[I][I]=V[J];K[I][J]=-V[J];K[J][J]=V[I];K[J][I]=-V[I];
1.56      takayama 19600:            R=cons(rmul(rmul(MI,K),M),R);
1.51      takayama 19601:        }
                   19602:        }
1.52      takayama 19603:     R=reverse(R);
                   19604:        if(Get==2||length(NR)!=2||Z==1) return R;
                   19605:     for(V1=[],I=NR[0];I>0;I--) V1=cons(os_md.makev([X[0],I]),V1);
                   19606:     for(V2=[],I=NR[1];I>0;I--) V2=cons(os_md.makev([X[1],I]),V2);
                   19607:     R=subst(R,car(V1),0,car(V2),0);
                   19608:     V1=subst(V1,car(V1),0);
                   19609:     V2=subst(V2,car(V2),0);
                   19610:     for(V=[],S=V1;S!=[];S=cdr(S)) for(T=V2;T!=[];T=cdr(T)) V=cons(car(T)-car(S),V);
                   19611:     V=reverse(V);
                   19612:     Mx=length(V);
                   19613:     for(A0=[],I=J=NR[0]-1;J>=0;I+=--J) for(K=0;K<NR[1];K++,I++) A0=cons(R[I],A0);
                   19614:     A0=reverse(A0);
                   19615:     for(F0=[],T=1,I=Mx-1;I>=0;I--) F0=cons(1/(x-V[I]), F0);
                   19616:     MV=confexp([F0,V]|sym=3);
                   19617:     RR=newvect(Mx);
                   19618:     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]);
                   19619:     RR0=mysubst(RR,[append(cdr(V1),cdr(V2)),vtol(newvect(Mx-2))]|lpair=1);
                   19620:     RR0=vtol(RR0);
                   19621:     return (Get==3)?[RR,RR0]:RR0;
1.50      takayama 19622:   }
                   19623:   return M;
                   19624: }
1.36      takayama 19625:
1.34      takayama 19626: def confexp(S)
                   19627: {
1.52      takayama 19628:        if((Sym=getopt(sym))==1||Sym==2||Sym==3){
1.51      takayama 19629:                D=polbyroot(S[1],x);
1.52      takayama 19630:                for(R=[],T=S[0];T!=[];T=cdr(T)){
                   19631:                        M=D*car(T);
                   19632:                        if(type(M)>3) M=map(red,M);
                   19633:                        else M=red(M);
                   19634:                        R=cons(M,R);
                   19635:                }
1.51      takayama 19636:                R=reverse(R);
                   19637:                if(Sym==2) return R;
                   19638:                M=length(R);N=length(S[1]);
                   19639:                E=newmat(M,N);
                   19640:                for(I=0;I<M;I++){
                   19641:                        for(J=0;J<N;J++) E[I][J]=mycoef(R[I],N-J-1,x);
                   19642:                }
1.52      takayama 19643:                if(Sym==3){
                   19644:                        for(R=[],P=1,T=S[1];T!=[];T=cdr(T)) R=cons(P/=(x-car(T)),R);
                   19645:                        R=confexp([reverse(R),S[1]]|sym=1);
                   19646:                        return E*myinv(R);
                   19647:                }
1.51      takayama 19648:                return E;
                   19649:        }
1.35      takayama 19650:        if(type(S[0])==4){
1.52      takayama 19651:                for(E=[];S!=[];S=cdr(S)) E=cons(confexp(car(S),E));
1.35      takayama 19652:                return reverse(E);
                   19653:        }
1.34      takayama 19654:        V=x;E=[];
                   19655:        for(P=0,Q=[],ST=S;ST!=[];ST=cdr(ST)){
                   19656:                Q=cons(car(ST)[0],Q);
                   19657:                P+=car(ST)[1]/(V-car(ST)[0]);
                   19658:                P=red(P);
                   19659:        }
                   19660:        P=red(P*polbyroot(Q,V));
                   19661:        Q=cdr(reverse(Q));
                   19662:        for(I=(length(W=Q));I>=0;I--){
                   19663:                C=mycoef(P,I,V);
                   19664:                P-=C*polbyroot(W,V);
                   19665:                W=cdr(W);
                   19666:                E=cons(red(C),E);
                   19667:        }
                   19668:        return reverse(E);
                   19669: }
                   19670:
1.6       takayama 19671: def pgen(L,VV)
                   19672: {
                   19673:        if(type(L[0])<4) L=[L];
                   19674:        if(type(L)==4) L=ltov(L);
                   19675:        K=length(L);
                   19676:        V=newvect(K);
                   19677:        if(type(Sum=getopt(sum))!=1) Sum=0;
                   19678:        if((Num=getopt(num))!=1) Num=0;
                   19679:        if((Sep=getopt(sep))!=1) Sep=0;
                   19680:        if(type(Shift=getopt(shift))!=1) Shift=0;
                   19681:        for(;;){
                   19682:                for(PP=1,R=[],II=K-1; II>=0; II--){
                   19683:                        R=cons(V[II]+Shift,R);
                   19684:                        if(II>0 && Sep==1) R=cons("_",R);
                   19685:                        PP*=L[II][0]^V[II];
                   19686:                }
                   19687:                P+=makev(cons(VV,R)|num=Num)*PP;
                   19688:                for(I=0;I<K;){
                   19689:                        if(++V[I]<=L[I][1]){
                   19690:                                if(Sum>0){
                   19691:                                         for(S=II=0;II<K;) S+=V[II++];
                   19692:                                         if(S>Sum){
                   19693:                                                 V[I++]=0;
                   19694:                                                 continue;
                   19695:                                         }
                   19696:                                }
                   19697:                        }else{
                   19698:                                V[I++]=0;
                   19699:                                continue;
                   19700:                        }
                   19701:                        break;
                   19702:                }
                   19703:                if(I>=K) return P;
                   19704:        }
                   19705: }
                   19706:
                   19707: def diagm(M,A)
                   19708: {
                   19709:        return mgen(M,0,A,1);
                   19710: }
                   19711:
                   19712: def mgen(M,N,A,S)
                   19713: {
                   19714:        if(M==0 && N==0){
                   19715:                mycat([
                   19716: "mgen(m,n,a,s|sep=1) : generate a matrix of size m x n\n",
                   19717: " n : a number or \"diagonal\", \"highdiag\", \"lowdiag\",\"skew\",\"symmetric\",\"perm\" = 0,-1,-2,..\n",
                   19718: " a : a symbol or list (ex. a, [a], [a,b,c], [1,2,3])\n",
                   19719: " s : 0 or 1 (shift of suffix)\n"
                   19720:                ]);
                   19721:                return 0;
                   19722:        }
                   19723:        if(type(N)==7) N=-findin(N,["diag","highdiag","lowdiag","skew","symmetric","perm"]);
                   19724:        Sep=(getopt(sep)==1)?1:0;
                   19725:        if(S < 0 || S > 2)
                   19726:                S = 0;
                   19727:        if(M+S > 30 || N+S > 30){
                   19728:                erno(1);
                   19729:                return;
                   19730:        }
                   19731:        if(N==-5){
                   19732:                NM=newmat(M,M);
                   19733:                for(I=0;I<M;I++,A=cdr(A)) NM[I][car(A)-S]=1;
                   19734:                return NM;
                   19735:        }
                   19736:        if(type(A) == 4)
                   19737:                L = length(A)-1;
                   19738:        else
                   19739:                L = -1;
                   19740:        if(N <= 0 && N >= -2){
                   19741:                MM = newmat(M,M);
                   19742:                J = K = 0;
                   19743:                if(N == -1){
                   19744:                        K = 1; M--;
                   19745:                }else if(N == -2){
                   19746:                        J = 1; M--;
                   19747:                }
                   19748:                for(I = 0; I < M; I++){
                   19749:                        if(L >= 0)
                   19750:                                MM[I+J][I+K] = A[(I > L)?L:I];
                   19751:                        else if(type(A)==7 || isvar(A))
                   19752:                                MM[I+J][I+K] = makev([A,S+I]|sep=Sep);
                   19753:                        else
                   19754:                                 MM[I+J][I+K] = A;
                   19755:                }
                   19756:                return MM;
                   19757:        }
                   19758:        K = N;
                   19759:        if(K < 0) N = M;
                   19760:        MM = newmat(M,N);
                   19761:        for(I = 0; I < M; I++){
                   19762:                if(L >= 0)
                   19763:                        AA = rtostr(A[(I > L)?L:I]);
                   19764:                else
                   19765:                        AA = rtostr(A)+rtostr(I+S);
                   19766:                if(AA>="0" && AA<=":"){
                   19767:                        erno(0); return;
                   19768:                }
                   19769:                for(J = 0; J < N; J++){
                   19770:                        if(K < 0){
                   19771:                                if(I > J) continue;
                   19772:                                if(K == -3 && I == J) continue;
                   19773:                        }
                   19774:                        MM[I][J] = makev([AA,J+S]|sep=Sep);
                   19775:                }
                   19776:        }
                   19777:        if(K < 0){
                   19778:                for(I = 0; I < M; I++){
                   19779:                        for(J = 0; J < I; J++)
                   19780:                                MM[I][J] = (K == -4)?MM[J][I]:-MM[J][I];
                   19781:                }
                   19782:        }
                   19783:        return MM;
                   19784: }
                   19785:
                   19786: def newbmat(M,N,R)
                   19787: {
                   19788:        S  = newvect(M);
                   19789:        T  = newvect(N);
                   19790:        IM = length(R);
1.50      takayama 19791:        if(type(car(R))!=4 && M==N && M==IM){
                   19792:                for(RR=TR=[],I=0;I<M;I++){
                   19793:                        for(TR=[R[I]],J=0;J<I;J++) TR=cons(0,TR);
                   19794:                        RR=cons(TR,RR);
                   19795:                }
                   19796:                R=reverse(RR);
                   19797:        }
1.6       takayama 19798:        for(I = 0; I < IM; I++){
                   19799:                RI = R[I];
                   19800:                JM = length(RI);
                   19801:                for(J = 0; J < JM; J++){
                   19802:                        RIJ = RI[J];
                   19803:                        if(type(RIJ) == 6){
                   19804:                                S[I] = size(RIJ)[0];
                   19805:                                T[J] = size(RIJ)[1];
                   19806:                        }
                   19807:                }
                   19808:        }
                   19809:        for(I = K = 0; I < M; I++){
                   19810:                if(S[I] == 0)
                   19811:                        S[I] = 1;
                   19812:                K += S[I];
                   19813:        }
                   19814:        for(J = L = 0; J < N; J++){
                   19815:                if(T[J] == 0)
                   19816:                        T[J] = 1;
                   19817:                L += T[J];
                   19818:        }
                   19819:        M = newmat(K,L);
                   19820:        if(type(Null=getopt(null))>0){
                   19821:                for(I=0;I<K;I++){
                   19822:                        for(J=0;J<L;J++) M[I][J]=Null;
                   19823:                }
                   19824:        }
                   19825:        for(I0 = II = 0; II < IM; I0 += S[II++]){
                   19826:                RI = R[II];
                   19827:                JM = length(RI);
                   19828:                for(J0 = JJ = 0; JJ < JM; J0 += T[JJ++]){
                   19829:                        if((RIJ = RI[JJ]) == 0)
                   19830:                                continue;
                   19831:                        Type = type(RIJ);
                   19832:                        for(I = 0; I < S[II]; I++){
                   19833:                                for(J = 0; J < T[JJ]; J++){
                   19834:                                        if(Type == 6)
                   19835:                                                M[I0+I][J0+J] = RIJ[I][J];
                   19836:                                        else if(Type == 4 || Type == 5)
                   19837:                                                M[I0+I][J0+J] = (I>0)?RIJ[I]:RIJ[J];
                   19838:                                        else
                   19839:                                                M[I0+I][J0+J] = RIJ;
                   19840:                                }
                   19841:                        }
                   19842:                }
                   19843:        }
                   19844:        return M;
                   19845: }
                   19846:
                   19847: def unim(S)
                   19848: {
                   19849:        if(!Rand++) random(currenttime());
                   19850:        if(!isint(Wt=getopt(wt))||Wt<0||Wt>10) Wt=2;
                   19851:        if(!isint(Xa=getopt(abs)) || Xa<1)
                   19852:                Xa=9;
                   19853:        if((Xaa=Xa)>10) Xaa=10;
                   19854:        if(Xaa%2) Xaa++;
                   19855:        Xh=Xaa/2;
                   19856:        if(type(S0=SS=S)==4){
                   19857:                Int=(getopt(int)==1)?1:0;
                   19858:                U=[1,1,1,1,1,1,1,1,1,1,1,1,2,2,3,4];
                   19859:                M=newmat(S[0],S[1]);
                   19860:                SS=cdr(S);SS=cdr(SS);
                   19861:                if(Rk=length(SS)) L=SS;
                   19862:                else{
                   19863:                        L=[0];
                   19864:                        I=(S[0]>S[1])?S[1]:S[0];
                   19865:                        if(I<=2) return 0;
                   19866:                        if(!isint(Rk=getopt(rank))||Rk<1||Rk>S[0]||Rk>S[1])
                   19867:                                Rk=random()%(I-1)+2;
                   19868:                        for(I=1;I<Rk;){
                   19869:                                P=random()%(S[1]+Wt)-Wt;
                   19870:                                if(P<=0) P=1;
                   19871:                                if(findin(P,L)!=0){
                   19872:                                        L=cons(P,L);
                   19873:                                        I++;
                   19874:                                }
                   19875:                        }
                   19876:                }
                   19877:                L=ltov(qsort(L));
                   19878:                M[0][L[0]]=1;
                   19879:                for(I=1;I<Rk;I++){
                   19880:                        P=Int?1:U[random()%length(U)];
                   19881:                        if(P>Xa) P=Xa;
                   19882:                        M[I][L[I]]=(random()%2)?P:(-P);
                   19883:                }
                   19884:                for(I=0;I<Rk;I++){
                   19885:                        if(I!=0&&abs(M[I][L[I]])>1) M[K=random()%I][KK=L[I]]=1;
                   19886:                        I0=(I==0)?1:L[I]+1;
                   19887:                        I1=(I==Rk-1)?S[1]:L[I+1];
                   19888:                        for(J=I0;J<I1;J++){
                   19889:                                for(K=1;K<=Xa;K++){
                   19890:                                        P=random()%(I+1);
                   19891:                                        if((random()%2)==1) M[P][J]++;
                   19892:                                        else M[P][J]--;
                   19893:                                }
                   19894:                        }
                   19895:                }
                   19896:                S=M;
                   19897:                Res=(getopt(res)==1)?dupmat(S):0;
                   19898:        }
                   19899:        Conj=0;
                   19900:        if(type(S)<2){
                   19901:                if(S<2||S>20) return 0;
                   19902:                if(getopt(conj)==1){
                   19903:                        M=S+Wt;
                   19904:                        if(M>15) M=10;
                   19905:                        M0=floor((M-1)/2);
                   19906:                        for(R=[],I=0;I<S;I++) R=cons(random()%M-M0,R);
                   19907:                        R=qsort(R);
                   19908:                        M=diagm(S,R);
                   19909:                        if(getopt(diag)!=1){
                   19910:                                for(I=1;I<S;I++)
                   19911:                                        if(M[I-1][I-1]==M[I][I] && random()%2) M[I-1][I]=1;
                   19912:                        }
                   19913:                        if(M[0][0]==M[S-1][S-1]){
                   19914:                                for(I=1;I<S;I++) if(M[I-1][I]==1) break;
                   19915:                                if(I==S){
                   19916:                                        if(M[0][0]>0) M[0][0]--;
                   19917:                                        else M[S-1][S-1]++;
                   19918:                                }
                   19919:                        }
                   19920:                        if(getopt(res)==1) RR=diagm(S,[1]);
                   19921:                        S1=S;
                   19922:                        Res=dupmat(S=M);
                   19923:                        if(isint(I=getopt(int))&&I>1&&random()%I==0){
                   19924:                                K=S[0][0];L=K+1;
                   19925:                                for(I=1;I<S1;I++){
                   19926:                                        if(S[I][I]>L && S[I-1][I]==0 && (I==S1-1||S[I][I+1]==0)){
                   19927:                                                L=S[I][I];
                   19928:                                                if(RR){
                   19929:                                                        RR[I][I]=L-K;RR[0][I]=1;
                   19930:                                                }
                   19931:                                                S[0][I]=1;
                   19932:                                                if(!(random()%3)) break;
                   19933:                                        }
                   19934:                                }
                   19935:                                if(random()%3==0){
                   19936:                                        for(I=0;I<S1-1;I++){
                   19937:                                                if(iand(S[I][I],1)&&S[I][I+1]==1){
                   19938:                                                        for(J=I+2;J<S1&&S[I][J]==0;J++);
                   19939:                                                        if(J<S1) continue;
                   19940:                                                        for(J=I-1;J>=0&&S[J][I]==0;J--);
                   19941:                                                        if(J>=0) continue;
                   19942:                                                        S[I][I+1]=2;
                   19943:                                                        for(J=0;J<S1;J++) RR[I][J]*=2;
                   19944:                                                        break;
                   19945:                                                }
                   19946:                                        }
                   19947:                                }
                   19948:                        }
                   19949:                }else{
                   19950:                        M=diagm(S,[1]);
                   19951:                        S1=S;
                   19952:                }
                   19953:        }
                   19954:        if(type(S)==6){
                   19955:                M=dupmat(S);
                   19956:                S=size(S);
                   19957:                S1=S[1];S=S[0];
                   19958:                Nt=1;
                   19959:                if(getopt(conj)==1&&S==S1) Conj=1;
                   19960:        }
                   19961:        if(!isint(Ct=getopt(time)))
                   19962:                Ct=(S>3||S1>3)?100:200;
                   19963:        if(getopt(both)==1){
                   19964:                OL=delopt(getopt(),"both");
                   19965:                M=unim(mtranspose(M)|option_list=OL);
                   19966:                M=mtranspose(M);
                   19967:        }
                   19968:        Mx=20;
                   19969:        for(I=K=LL=0;I<Ct+Mx;I++){
                   19970:                P=random()%S;Q=random()%S;
                   19971:                if(3*K>Ct) T=random()%Xaa-Xh;
                   19972:                else if(5*K<Ct) T=random()%2-1;
                   19973:                else T=random()%4-2;
                   19974:                if(T>=0) T++;
                   19975:                if(P==Q) continue;
                   19976:                for(G=0,J=S1-1;J>=0;J--){
                   19977:                        if((H=abs(M[Q][J]+M[P][J]*T))>Xa&&(!Conj||J!=P)) break;
                   19978:                        if(K<Mx&&!Conj) G=igcd(G,H);
                   19979:                }
                   19980:                if(K<Mx && G>1) J=1;
                   19981:                if(J>0) continue;
                   19982:                if(J<0&&Conj==1){
                   19983:                        for(J=S1-1;J>=0;J--)
                   19984:                                if(J!=Q&&abs(M[J][P]-M[J][Q]*T)>Xa) break;
                   19985:                        if(J<0&&abs(M[Q][P]-M[Q][Q]*T+M[P][P]*T-M[P][Q]*T^2)>Xa) J=1;
                   19986:                        if(J<0&&M[P][P]==M[Q][Q]){
                   19987:                                LF=0;
                   19988:                                for(L=S1-1;J>=0;J--) if(L!=Q&&M[J][Q]!=0) LF++;
                   19989:                                for(L=S1-1;J>=0;J--) if(L!=P&&M[P][J]!=0) LF++;
                   19990:                                        if(!LF) J=1;
                   19991:                        }
                   19992:                }
                   19993:                if(J<0){
                   19994:                        for(J=S1-1;J>=0;J--)
                   19995:                                M[Q][J]+=M[P][J]*T;
                   19996:                        if(Conj==1)
                   19997:                                for(J=S1-1;J>=0;J--) M[J][P]-=M[J][Q]*T;
                   19998:                        if(RR) for(J=S1-1;J>=0;J--) RR[Q][J]+=RR[P][J]*T;
                   19999:                        K++;
                   20000:                }
                   20001:                if(K%5==0){
                   20002:                        if(!Nt) M=mtranspose(M);
                   20003:                        else if(!Conj&&K%2==0){
                   20004:                                for(F=0;F<S;F++){
                   20005:                                        if((V=lgcd(M[F]))>1){
                   20006:                                                for(L=0;L<S1;L++) M[F][L]/=V;
                   20007:                                        }
                   20008:                                }
                   20009:                        }
                   20010:                }
                   20011:                if(I>Ct){
                   20012:                        for(L=S-1;L>=0;L--){
                   20013:                                for(F=0,J=S1-1;J>=0;J--)
                   20014:                                        if(M[L][J]!=0) F++;
                   20015:                                if(F<2){
                   20016:                                        F=-1;break;
                   20017:                                }
                   20018:                                else F=0;
                   20019:                        }
                   20020:                        if(F<0 && LL++<5){
                   20021:                                I=(CT-CT%2)/2;K=1;
                   20022:                        }
                   20023:                        if(I>Ct) break;
                   20024:                }
                   20025:        }
                   20026:        if(RR){
                   20027:                for(I=F=0;I<S1;I++){
                   20028:                        V=Res[I][I];
                   20029:                        for(J=I+1;J<S1;J++){
                   20030:                                if(Res[J][J]!=V) break;
                   20031:                                for(LP=0;LP<2;LP++){
                   20032:                                        if(J==S1-1||Res[J][J+1]==0){
                   20033:                                                if(I==0||Res[I-1][I]==0){
                   20034:                                                        for(VL=VS=[],K=0;K<S1;K++){
                   20035:                                                                VL=cons(RR[K][J],VL);VS=cons(RR[K][I],VS);
                   20036:                                                        }
                   20037:                                                        VR=ldev(VL,VS);
                   20038:                                                        if(VR[0]){
                   20039:                                                                for(K=S1-1,VN=VR[1];K>=0;K--,VN=cdr(VN))
                   20040:                                                                        RR[K][J]=car(VN);
                   20041:                                                                F=1;
                   20042:                                                        }
                   20043:                                                }
                   20044:                                        }
                   20045:                                        K=I;I=J;J=K;
                   20046:                                }
                   20047:                        }
                   20048:                        if(F&&I==S1-1){
                   20049:                                F=0;I=-1;
                   20050:                        }
                   20051:                }
                   20052:                if(getopt(int)==1){
                   20053:                        N=mtranspose(M);
                   20054:                        for(F=I=0;I<S1;I++) if(lgcd(M[I])>1||lgcd(N[I])>1) F++;
                   20055:                        if(F){
                   20056:                                for(F=I=0;I<S1;I++){
                   20057:                                        if(Res[I][I]==-1) F=ior(F,1);
                   20058:                                        else if(Res[I][I]==1) F=ior(F,2);
                   20059:                                }
                   20060:                                C=0;
                   20061:                                if(!iand(F,1)) C=1;
                   20062:                                else if(!iand(F,2)) C=-1;
                   20063:                                if(C){
                   20064:                                        for(I=0;I<S1;I++){
                   20065:                                                M[I][I]+=C;Res[I][I]+=C;
                   20066:                                        }
                   20067:                                }
                   20068:                        }
                   20069:                }
                   20070:                if(getopt(rep)!=1){
                   20071:                        for(Lp=0;Lp<5;Lp++){
                   20072:                                F=(M==Res||abs(lmax(RR))>Xa*10||abs(lmin(RR))>Xa*10)?1:0;
                   20073:                                for(I=0;!F&&I<S1&&Lp<4;I++){
                   20074:                                        for(K=L=J=0;J<S1;J++){
                   20075:                                                if(M[I][J]) K++;
                   20076:                                                if(M[J][I]) L++;
                   20077:                                        }
                   20078:                                        if(K<2||L<2) F=1;
                   20079:                                }
                   20080:                                if(!F) break;
                   20081:                                R=unim(S0|option_list=cons(["rep",1],getopt()));
                   20082:                                M=R[0];Res=R[1];RR=R[3];
                   20083:                        }
                   20084:                }
                   20085:        }
                   20086:        if(Res==0) return M;
                   20087:        if(RR){
                   20088:                for(I=K=V=0;I<S1;I++){
                   20089:                        for(J=0;J<S1;J++){
                   20090:                        if(RR[J][I]>0) V++;
                   20091:                                else if(RR[J][I]<0) V--;
                   20092:                        }
                   20093:                        if(I<S1-1&&Res[I][I+1]!=0) continue;
                   20094:                        if(V<0){
                   20095:                                for(;K<=I;K++) RR=colm(RR,K,-1);
                   20096:                        }
                   20097:                        K=I+1;V=0;
                   20098:                }
                   20099:        }
                   20100:        if(getopt(rep)!=1){
                   20101:                if((F=getopt(dviout))==1){
                   20102:                        if(getopt(conj)==1){
                   20103:                                if(RR) show([Res,"=",myinv(RR),M,RR]|opt="spts0",str=1,lim=200);
                   20104:                        }else{
                   20105:                                if(type(Lim=getopt(lim))==1)
                   20106:                                         mtoupper(M,0|step=1,opt=7,dviout=1,pages=1,lim=Lim);
                   20107:                                else mtoupper(M,0|step=1,opt=7,dviout=1,pages=1);
                   20108:                        }
                   20109:                }else if(F==-1){
                   20110:                        if(getopt(conj)==1){
                   20111:                                if(RR) return ltotex([Res,"=",myinv(RR),M,RR]|opt="spts0",str=1,lim=200);
                   20112:                        }else{
                   20113:                                if(type(Lim=getopt(lim))==1)
                   20114:                                         return mtoupper(M,0|step=1,opt=7,pages=1,lim=Lim,dviout=-1);
                   20115:                                else return mtoupper(M,0|step=1,opt=7,pages=1,dviout=-1);
                   20116:                        }
                   20117:                }
                   20118:        }
                   20119:        if(RR==0) return[M,Res];
                   20120:        return [M,Res,myinv(RR),RR];
                   20121: }
                   20122:
                   20123: def pfrac(F,X)
                   20124: {
                   20125:        F = red(F);
                   20126:        FN = nm(F);
                   20127:        FD = dn(F);
                   20128:        if(mydeg(FD,X) == 0)
                   20129:                return [[F,1,1]];
                   20130:        R = rpdiv(FN,FD,X);
                   20131:        FN = R[0]/R[1];
                   20132:        R0 = R[2]/R[1];
                   20133:        FC = fctr(FD);
                   20134:        RT=[];
                   20135:        if(getopt(root)==2){
                   20136:                for(FE=[],FT=FC;FT!=[];FT=cdr(FT)){
                   20137:                        if(mydeg(P=car(FT)[0],X)==4 && vars(P)==[X] && pari(issquare,C=mycoef(P,4,X))){
                   20138:                                if((S=mycoef(P,3,X)/4/C)!=0) P=subst(P,X,X-S);
                   20139:                                if(mycoef(P,1,X)==0 && pari(issquare,C0=mycoef(P,0,X))){
                   20140:                                        C=sqrtrat(C);C0=sqrtrat(C0);C1=2*C*C0-mycoef(P,2,X);
                   20141:                                        if(C1>0){
                   20142:                                                FE=cons([C*(X+S)^2-C1^(1/2)*(X+S)+C0,car(FT)[1]],FE);
                   20143:                                                FE=cons([C*(X+S)^2+C1^(1/2)*(X+S)+C0,car(FT)[1]],FE);
                   20144:                                                RT=cons(C1,RT);
                   20145:                                                continue;
                   20146:                                        }
                   20147:                                }
                   20148:                        }
                   20149:                        FE=cons(car(FT),FE);
                   20150:                }
                   20151:                FC=reverse(FE);
                   20152:        }
                   20153:        N = Q = 0;
                   20154:        L = [];
                   20155:        for(I = length(FC)-1; I >= 0; I--){
                   20156:                if((D = mydeg(FC[I][0],X)) == 0)  continue;
                   20157:                for(K=1; K<=FC[I][1]; K++){
                   20158:                        for(J=P=0; J < D; J++){
                   20159:                                V = makev(["zz_",++N]);
                   20160:                                P = P*X + V;
                   20161:                                L = cons(V,L);
                   20162:                        }
                   20163:                        Q += P/(FC[I][0]^K);
                   20164:                        Q = red(Q);
                   20165:                }
                   20166:        }
                   20167:        L=reverse(L);
                   20168:        Q = nm(red(red(Q*FD)-FN));
                   20169:        Q = ptol(Q,X);
                   20170:        S = lsol(Q,L);
                   20171:        R = (R0==0)?[]:[[R0,1,1]];
                   20172:        for(N=0,I=length(FC)-1; I >= 0; I--){
                   20173:                if((D = mydeg(FC[I][0],X)) == 0)  continue;
                   20174:                for(K=1; K<=FC[I][1]; K++){
                   20175:                        for(P=J=0; J < D; N++,J++)
                   20176:                                P = P*X + S[N][1];
                   20177:                        if(P!=0) R = cons([P,FC[I][0],K],R);
                   20178:                }
                   20179:        }
                   20180:        for(;RT!=[];RT=cdr(RT)){
                   20181:                RTT=car(RT);
                   20182:                R=mtransbys(os_md.substblock,R,[RTT^(1/2),(RTT^(1/2))^2,RTT]);
                   20183:        }
                   20184:        TeX=getopt(TeX);
                   20185:        if((Dvi=getopt(dviout))==1||TeX==1){
                   20186:                V=strtov("0");
                   20187:                for(S=L=0,RR=R;RR!=[];RR=cdr(RR),L++){
                   20188:                        RT=car(RR);
                   20189:                        S+=(RT[0]/RT[1]^RT[2])*V^L;
                   20190:                }
                   20191:                if(TeX!=1) fctrtos(S|var=[V,""],dviout=1);
                   20192:                else return fctrtos(S|var=[V,""],TeX=3);
                   20193:        }
                   20194:        return reverse(R);
                   20195: }
                   20196:
                   20197: def cfrac(X,N)
                   20198: {
                   20199:        F=[floor(X)];
                   20200:        if(N<0){
                   20201:                Max=N=-N;
                   20202:        }
                   20203:        X-=F[0];
                   20204:        if(Max!=1)
                   20205:                M=mat([F[0],1],[1,0]);
                   20206:        for(;N>0 && X!=0;N--){
                   20207:                X=1/X;
                   20208:                F=cons(Y=floor(X),F);
                   20209:                X-=Y;
                   20210:                if(Max){
                   20211:                        M0=M[0][0];M1=M[1][0];
                   20212:                        M=M*mat([Y,1],[1,0]);
                   20213:                        if(M[0][0]>Max) return M0/M1;
                   20214:                }
                   20215:        }
                   20216:        return (Max==0)?reverse(F):M[0][0]/M[1][0];
                   20217: }
                   20218:
                   20219: def sqrt2rat(X)
                   20220: {
                   20221:        if(type(X)>3) return X;
                   20222:        X=red(X);
                   20223:        if(getopt(mult)==1){
                   20224:                for(V=vars(X);V!=[];V=cdr(V)){
                   20225:                        T=funargs(F=car(V));
                   20226:                        if(type(T)==4&&length(T)>1){
                   20227:                                Y=T[1];
                   20228:                                Z=sqrt2rat(Y);
                   20229:                                if(Y!=Z){
                   20230:                                        if(length(T)==2){
                   20231:                                                T0=T[0];
                   20232:                                                X=subst(X,F,T0(Z));
                   20233:                                        }else if(T[0]==pow)
                   20234:                                                X=subst(X,F,Y^T[2]);
                   20235:                                }
                   20236:                        }
                   20237:                }
                   20238:        }
                   20239:        for(V=vars(X);V!=[];V=cdr(V)){  /* r(x)^(1/2+n) -> r(x)^n*r(x)^(1/2) */
                   20240:                T=args(Y=car(V));
                   20241:                if(functor(Y)==pow&&T[1]!=1/2&&isint(T2=2*T[1])){
                   20242:                        if(iand(T2,1)){
                   20243:                                R=(T[0])^(1/2);T2--;
                   20244:                        }else R=1;
                   20245:                        R*=T[0]^(T2/2);
                   20246:                        X=red(subst(X,Y,R));
                   20247:                }
                   20248:        }
                   20249:        D=dn(X);N=nm(X);
                   20250:        if(imag(D)!=0){
                   20251:                N*=conj(D);
                   20252:                D*=conj(D);
                   20253:                return sqrt2rat(N/D);
                   20254:        }
                   20255:        for(V=vars(N);V!=[];V=cdr(V)){  /* (r(x)^(n/m))^k */
                   20256:                T=args(Y=car(V));
                   20257:                if(functor(Y)==pow&&(T[1]==0||(type(T[1])==1&&ntype(T[1])==0))){
                   20258:                        Dn=dn(T[1]);Nm=nm(T[1]);
                   20259:                        N=substblock(N,Y,Y^Dn,T[0]^Nm);
                   20260:                }
                   20261:        }
                   20262:        for(V=vars(D);V!=[];V=cdr(V)){
                   20263:                T=args(Y=car(V));
                   20264:                if(functor(Y)==pow&&(T[1]==0||(type(T[1])==1&&ntype(T[1])==0))){
                   20265:                        Dn=dn(T[1]);Nm=nm(T[1]);
                   20266:                        D=substblock(D,Y,Y^Dn,T[0]^Nm);
                   20267:                }
                   20268:        }
                   20269:        for(V=vars(D);V!=[];V=cdr(V)){
                   20270:                T=args(Y=car(V));
                   20271:                if(functor(Y)==pow&&T[1]==1/2&&mydeg(D,Y)==1){
                   20272:                        N*=mycoef(D,0,Y)-mycoef(D,1,Y)*Y;
                   20273:                        N=mycoef(N,0,Y)+mycoef(N,1,Y)*Y+mycoef(N,2,Y)*T[0];
                   20274:                        D=mycoef(D,0,Y)^2-mycoef(D,1,Y)^2*T[0];
                   20275:                        X=red(N/D);
                   20276:                        D=dn(X);N=nm(X);
                   20277:                        break;
                   20278:                }
                   20279:        }
                   20280:        X=red(N/D);
                   20281:        D=dn(X);N=nm(X);
                   20282:        for(V=vars(D);V!=[];V=cdr(V)){
                   20283:                T=args(Y=car(V));
                   20284:                if(functor(Y)==pow&&T[1]==1/2)
                   20285:                        D=substblock(D,T[0]^T[1],(T[0]^T[1])^2,T[0]);
                   20286:        }
                   20287:        for(V=vars(N);V!=[];V=cdr(V)){
                   20288:                T=args(Y=car(V));
                   20289:                if(functor(Y)==pow&&T[1]==1/2)
                   20290:                        N=substblock(N,T[0]^T[1],(T[0]^T[1])^2,T[0]);
                   20291:        }
                   20292:        for(V=vars(N);V!=[];V=cdr(V)){
                   20293:                T=args(Y=car(V));
                   20294:                if(functor(Y)==pow&&T[1]==1/2){
                   20295:                        Ag=T[0];
                   20296:                        R=S=1;
                   20297:                        An=fctr(nm(Ag));
                   20298:                        CA=An[0][0];
                   20299:                        if(CA<0){
                   20300:                                CA=-CA;R=-1;
                   20301:                        }
                   20302:                        if(type(I=sqrtrat(CA))<2) S=I;
                   20303:                        else R*=CA;
                   20304:                        for(An=cdr(An);An!=[];An=cdr(An)){
                   20305:                                Pw=car(An)[1];I=iand(Pw,1);
                   20306:                                if(I) R*=car(An)[0];
                   20307:                                if((Q=(Pw-I)/2)>0) S*=car(An)[0]^Q;
                   20308:                        }
                   20309:                        for(An=fctr(dn(Ag));An!=[];An=cdr(An)){
                   20310:                                Pw=car(An)[1];I=iand(Pw,1);
                   20311:                                if(I) R/=car(An)[0]^I;
                   20312:                                if((Q=(Pw-I)/2)>0) S/=car(An)[0]^Q;
                   20313:                        }
                   20314:                        if(S!=1) N=subst(N,Y,R^(1/2)*S);
                   20315:                }
                   20316:        }
                   20317:        for(V=vars(N);V!=[];V=cdr(V)){
                   20318:                T=args(Y=car(V));
                   20319:                if(functor(Y)==pow&&T[1]==1/2){
                   20320:                        C=mycoef(N,1,Y);
                   20321:                        for(VC=vars(C);VC!=[];VC=cdr(VC)){
                   20322:                                TC=args(YC=car(VC));
                   20323:                                if(functor(YC)==pow&&TC[1]==1/2){
                   20324:                                        Ag=red(T[0]*TC[0]);
                   20325:                                        R=S=1;
                   20326:                                        An=fctr(nm(Ag));
                   20327:                                        CA=An[0][0];
                   20328:                                        if(CA<0){
                   20329:                                                CA=-CA;R=-1;
                   20330:                                        }
                   20331:                                        if(type(I=sqrtrat(CA))<2) S=I;
                   20332:                                        else R*=CA;
                   20333:                                        for(An=cdr(An);An!=[];An=cdr(An)){
                   20334:                                                Pw=car(An)[1];I=iand(Pw,1);
                   20335:                                                if(I) R*=car(An)[0];
                   20336:                                                if((Q=(Pw-I)/2)>0) S*=car(An)[0]^Q;
                   20337:                                        }
                   20338:                                        for(An=fctr(dn(Ag));An!=[];An=cdr(An)){
                   20339:                                                Pw=car(An)[1];I=iand(Pw,1);
                   20340:                                                if(I) R/=car(An)[0]^I;
                   20341:                                                if((Q=(Pw-I)/2)>0) S/=car(An)[0]^Q;
                   20342:                                        }
                   20343:                                        CC=mycoef(C,1,YC);
                   20344:                                        N=N-CC*YC*Y+CC*R^(1/2)*S;
                   20345:                                }
                   20346:                        }
                   20347:                }
                   20348:        }
                   20349:        return red(N/D);
                   20350: }
                   20351:
                   20352: def cfrac2n(X)
                   20353: {
                   20354:        if(type(L=getopt(loop))==1&&L>0)
                   20355:                C=x;
                   20356:        else{
                   20357:                C=0;L=0;
                   20358:        }
                   20359:        if(L>1){
                   20360:                for(Y=[];L>1;L--){
                   20361:                        Y=cons(car(X),Y);
                   20362:                        X=cdr(X);
                   20363:                }
                   20364:                if(X!=[]){
                   20365:                        P=cfrac2n(X|loop=1);
                   20366:                        for(V=P,Y=reverse(Y);Y!=[];Y=cdr(Y))
                   20367:                                V=sqrt2rat(car(Y)+1/V);
                   20368:                        return V;
                   20369:                }else{
                   20370:                        C=0;X=reverse(Y);
                   20371:                }
                   20372:        }
                   20373:        for(V=C,X=reverse(X);X!=[];X=cdr(X)){
                   20374:                if(V!=0) V=1/V;
                   20375:                V+=car(X);
                   20376:        }
                   20377:        if(C!=0){
                   20378:                V=red(V);P=dn(V)*x-nm(V);
                   20379:                S=getroot(P,x|cpx=2);
                   20380:                T=map(eval,S);
                   20381:                V=(T[0]>0)?S[0]:S[1];
                   20382:        }
                   20383:        return V;
                   20384: }
                   20385:
                   20386: def s2sp(S)
                   20387: {
                   20388:        if(getopt(short)==1){
                   20389:                if(type(F=getopt(std))==1) S=s2sp(S|std=F);
                   20390:                if(type(S)!=7) S=s2sp(S);
                   20391:                L=strtoascii(S);
                   20392:                for(LS=[],F=C=0;L!=[];L=cdr(L)){
                   20393:                        if((G=car(L))!=F){
                   20394:                                LS=cons(G,LS);C=0;
                   20395:                        }else if(C<3){
                   20396:                                LS=cons(G,LS);
                   20397:                        }else if(C==3){
                   20398:                                LS=cdr(LS);LS=cdr(LS);
                   20399:                                LS=cons(94,LS);LS=cons(52,LS);
                   20400:                        }else if(C==9){
                   20401:                                LS=cdr(LS);LS=cons(97,LS);
                   20402:                        }else{
                   20403:                                K=car(LS);LS=cdr(LS);LS=cons(K+1,LS);
                   20404:                        }
                   20405:                        C++;F=G;
                   20406:                }
                   20407:                return asciitostr(reverse(LS));
                   20408:        }
                   20409:        if(type(F=getopt(std))==1){
                   20410:                F=(F>0)?1:-1;
                   20411:                if(type(S)==7) S=s2sp(S);
                   20412:                for(L=[];S!=[];S=cdr(S))
                   20413:                L=cons(os_md.msort(car(S),[-1,0]),L);
                   20414:                return os_md.msort(L,[F,2]);
                   20415:        }
                   20416:        if(type(S)==7){
                   20417:                S = strtoascii(S);
                   20418:                if(type(S) == 5) S = vtol(S);
                   20419:                for(N=0,R=TR=[]; S!=[]; S=cdr(S)){
                   20420:                        if(car(S)==45)      /* - */
                   20421:                                N=1;
                   20422:                        else if(car(S)==47) /* / */
                   20423:                                N=2;
                   20424:                        if(N>0){
                   20425:                                while(car(S)<48&&car(S)!=40) S=cdr(S);
                   20426:                        }
                   20427:                        if((T=car(S))>=48 && T<=57) TR=cons(T-48,TR);
                   20428:                        else if(T>=97) TR=cons(T-87,TR);
                   20429:                        else if(T>=65 && T<=90) TR=cons(T-29,TR);  /* A-Z */
                   20430:                        else if(T==44){
                   20431:                                R=cons(reverse(TR),R);
                   20432:                                TR=[];
                   20433:                        }else if(T==94){  /* ^ */
                   20434:                                S=cdr(S);
                   20435:                                if(car(S)==40){  /* ( */
                   20436:                                        S=cdr(S);
                   20437:                                        for(T=0; car(S)!=41 && S!=[]; S=cdr(S)){
                   20438:                                                V=car(S)-48;
                   20439:                                                if(V>=10) V-=39;
                   20440:                                                T=10*T+V;
                   20441:                                        }
                   20442:                                }else{
                   20443:                                        while(car(S)<48) S=cdr(S);
                   20444:                                        T=car(S)-48;
                   20445:                                        if(T>=10) T-=39;
                   20446:                                }
                   20447:                                while(--T>=1) TR=cons(car(TR),TR);
                   20448:                        }else if(T==40){   /* ( */
                   20449:                                S=cdr(S);
                   20450:                                if(N==1){
                   20451:                                        N=0; NN=1;
                   20452:                                }else NN=0;
                   20453:                                if(car(S)==45){  /* - */
                   20454:                                        S=cdr(S);
                   20455:                                        NN=1-NN;
                   20456:                                }
                   20457:                                for(I=0; I<2; I++){
                   20458:                                        for(V=0; (SS=car(S))!=41 && SS!=47 && S!=[]; S=cdr(S)){
                   20459:                                        T=SS-48;
                   20460:                                        if(T>=10) T-=39;
                   20461:                                                V=10*V+T;
                   20462:                                        }
                   20463:                                        if(NN==1){
                   20464:                                                V=-V; NN=0;
                   20465:                                        }
                   20466:                                        TR=cons(V,TR);
                   20467:                                        if(SS!=47) break;
                   20468:                                        else{
                   20469:                                                N=2; S=cdr(S);
                   20470:                                        }
                   20471:                                }
                   20472:                        }else if(T==60){
                   20473:                                for(V=[],S=cdr(S);S!=[]&&car(S)!=62;S=cdr(S))
                   20474:                                        V=cons(car(S),V);
                   20475:                                if(car(S)!=62) continue;
                   20476:                                TR=cons(eval_str(asciitostr(reverse(V))),TR);
                   20477:                        }else if(T<48) continue;
                   20478:                        if(N==1){
                   20479:                                T = car(TR);
                   20480:                                TR=cons(-T,cdr(TR));
                   20481:                                N=0;
                   20482:                        }else if(N==2){
                   20483:                                T=car(TR); TR=cdr(TR);
                   20484:                                TR=cons(car(TR)/T,cdr(TR));
                   20485:                                N=0;
                   20486:                        }
                   20487:                }
                   20488:                return reverse(cons(reverse(TR),R));
                   20489:        }else if(type(S)==4){
                   20490:                Num=getopt(num);
                   20491:                for(R=[]; ; ){
                   20492:                        if(type(TS=car(S))!=4) return;
                   20493:                        for(; TS!=[]; TS=cdr(TS)){
                   20494:                                V=car(TS);
                   20495:                                if(type(V)>1||(type(V)==1&&ntype(V)>0)){
                   20496:                                        V="<"+rtostr(V)+">";
                   20497:                                        R=append(reverse(strtoascii(V)),R);
                   20498:                                        continue;
                   20499:                                }
                   20500:                                if(dn(V)>1){
                   20501:                                        P=reverse(strtoascii(rtostr(V)));
                   20502:                                        R=append(P,cons(40,R));
                   20503:                                        R=cons(41,R);
                   20504:                                        continue;
                   20505:                                }
                   20506:                                if(V<0 && V>-10){
                   20507:                                        V=-V;
                   20508:                                        R=cons(45,R);
                   20509:                                }
                   20510:                                if(V<0 || V>35 || (V>9 && Num==1)){
                   20511:                                        P=reverse(strtoascii(rtostr(V)));
                   20512:                                        R=append(P,cons(40,R));
                   20513:                                        V=41;
                   20514:                                }else if(V<10) V+=48;
                   20515:                                else V+=87;
                   20516:                                R=cons(V,R);
                   20517:                        }
                   20518:                        if((S=cdr(S))==[]) break;
                   20519:                        R=cons(44,R);
                   20520:                }
                   20521:                return asciitostr(reverse(R));
                   20522:        }
                   20523:        return 0;
                   20524: }
                   20525:
                   20526: def sp2grs(M,A,L)
                   20527: {
                   20528:        MM = [];
                   20529:        T0 = 0;
                   20530:        Mat=getopt(mat);
                   20531:        if(Mat!=1) Mat=0;
                   20532:        if(type(M)==7) M=s2sp(M);
                   20533:        if((LM = length(M)) > 10 && type(A) < 4)
                   20534:                CK = 1;
                   20535:        Sft = (type(L)==1)?L:0;
                   20536:        if(type(L)==4 && length(L)>=3)
                   20537:                Sft = L[2];
                   20538:        if(Sft < 0){
                   20539:                T0 = 1;
                   20540:                Sft = -Sft-1;
                   20541:        }
                   20542:        for(I = LM-1; I >= 0; I--){
                   20543:                MI = M[I]; MN = [];
                   20544:                if(CK == 1 && length(MI) > 10){
                   20545:                        erno(1);
                   20546:                        return;
                   20547:                }
                   20548:                if(type(A) == 4)
                   20549:                        AA = rtostr(A[I]);
                   20550:                else
                   20551:                        AA = rtostr(A)+rtostr(I);
                   20552:                for(J = LM = length(MI)-1; J >= 0; J--){
                   20553:                        V = MI[J];
                   20554:                        if(type(V) > 3)
                   20555:                                V = V[0];
                   20556:                        if(T0 == 0 || I == 0)
                   20557:                                MN = cons([V, makev([AA,J+Sft])], MN);
                   20558:                        else{
                   20559:                                if(LM == 1)
                   20560:                                        MN = cons([V, (J==0)?0:makev([AA])], MN);
                   20561:                                else if(I == 1 && Mat == 0)
                   20562:                                        MN = cons([V, (J==length(MI)-1)?0:makev([AA,J+Sft])], MN);
                   20563:                                else
                   20564:                                        MN = cons([V, (J==0)?0:makev([AA,J])], MN);
                   20565:                        }
                   20566:                }
                   20567:                MM = cons(MN, MM);
                   20568:        }
                   20569:        if(type(L) == 4 && length(L) >= 2){
                   20570:                R = chkspt(MM|mat=Mat); /* R[3]: Fuchs */
                   20571:                AA = var(MM[L[0]-1][L[1]-1][1]);
                   20572:                if(AA==0)  AA=var(R[3]);
                   20573:                if(AA!=0 && (P = mycoef(R[3],1,AA))!=0){
                   20574:                         P = -mycoef(R[3], 0, AA)/P;
                   20575:                         MM = mysubst(MM,[AA,P]);
                   20576:                }
                   20577:        }
                   20578:        return MM;
                   20579: }
                   20580:
                   20581: def intpoly(F,X)
                   20582: {
                   20583:        if((T=ptype(F,X))<4){
                   20584:                if(T<3){        /* polynomial */
                   20585:                        if(type(C=getopt(cos))>0){
                   20586:                                V=vars(F);
                   20587:                                Z=makenewv(V);
                   20588:                                W=makenewv(cons(Z,V));
                   20589:                                Q=intpoly(F,X|exp=Z);
                   20590:                                Q=(subst(Q,Z,@i*C)*(Z+@i*W)+subst(Q,Z,-@i*C)*(Z-@i*W))/2;
                   20591:                                return [mycoef(Q,1,Z),mycoef(Q,1,W)];
                   20592:                        }
                   20593:                        if(type(C=getopt(sin))>0){
                   20594:                                Q=intpoly(F,X|cos=C);
                   20595:                                return [-Q[1],Q[0]];
                   20596:                        }
                   20597:                        if(type(C=getopt(log))>0){
                   20598:                                Q=intpoly(F,X);
                   20599:                                if(C[0]==0) return [Q,0];
                   20600:                                if(length(C)<3) C=[C[0],C[1],1];
                   20601:                                Q-=subst(Q,X,-C[1]/C[0]);
                   20602:                                if(iscoef(Q,os_md.israt)) Q=red(Q);
                   20603:                                if(C[2]==0) return [Q];
                   20604:                                S=subst(-Q*C[0]*C[2],X,X-C[1]/C[0]);
                   20605:                                for(R=0,D=mydeg(S,X);D>0;D--) R+=mycoef(S,D,X)*X^(D-1);
                   20606:                                R=subst(R,X,X+C[1]/C[0]);
                   20607:                                return cons(Q,intpoly(R,X|log=[C[0],C[1],C[2]-1]));
                   20608:                        }
                   20609:                        if(type(C=getopt(exp))>0){
                   20610:                                D = mydeg(F,X);
                   20611:                                for(P=Q=F/C;D>=0;D--){
                   20612:                                        Q=-mydiff(Q,X)/C;
                   20613:                                        P+=Q;
                   20614:                                }
                   20615:                                return P;
                   20616:                        }
                   20617:                        for(P=0,I=mydeg(F,X);I >= 0;I--)
                   20618:                                P += mycoef(F,I,X)*X^(I+1)/(I+1);
                   20619:                        return P;
                   20620:                }
                   20621:                R=pfrac(F,X|root=2);    /* rational */
                   20622:                for(P=0;R!=[];R=cdr(R)){
                   20623:                        if(type(V=getopt(dumb))==5){
                   20624:                                for(PF=[],RR=R;RR!=[];RR=cdr(RR))
                   20625:                                        PF=cons(RR[0][0]/RR[0][1]^RR[0][2],PF);
                   20626:                                PF=[cons(X,reverse(PF))];
                   20627:                                if(P) PF=cons([1,P],PF);
                   20628:                                V[0]=cons(PF,V[0]);
                   20629:                        }
                   20630:                        RT=car(R);
                   20631:                        if(mydeg(RT[1],X)==0) P+=intpoly(RT[0]*RT[2],X);
                   20632:                        else if((Deg=mydeg(RT[1],X))==1){
                   20633:                                if(RT[2]>1) P+=RT[0]*RT[1]^(1-RT[2])/(1-RT[2])/mycoef(RT[1],1,X);
                   20634:                                else P+=RT[0]*log(RT[1])/mycoef(RT[1],1,X);
                   20635:                                P=red(P);
                   20636:                        }else if(Deg==2){
                   20637:                                D1=diff(RT[1],X);C1=mycoef(D1,1,X);
                   20638:                                B=2*C1*mycoef(RT[1],0,X)-mycoef(RT[1],1,X)^2;  /* ax^2+bx+c => B=4ac-b^2 */
                   20639:                                B=sqrt2rat(B);
                   20640:                                N=RT[0];
                   20641:                                for(I=RT[2];I>0&&N!=0;I--){
                   20642:                                        C0=mycoef(N,1,X)/C1;N-=C0*D1;
                   20643:                                        if(C0){
                   20644:                                                if(I>1) P-=C0/RT[1]^(I-1)/(I-1);
                   20645:                                                else P+=C0*log(RT[1]);
                   20646:                                        }
                   20647:                                        if(I>1){
                   20648:                                                BB=B/C1;
                   20649:                                                P+=N*X/RT[1]^(I-1)/(I-1)/BB;
                   20650:                                                N*=(2*I-3)/(I-1)/BB;
                   20651:                                        }else{
                   20652:                                                if(type(BR=sqrtrat(B))>3){
                   20653:                                                        mycat(["Cannot obtain sqare root of ",B]);
                   20654:                                                        return [];
                   20655:                                                }
                   20656:                                                if(real(nm(BR))!=0){
                   20657:                                                        P+=(2*N/BR)*atan(sqrt2rat(D1/BR|mult=1));
                   20658:                                                }else{
                   20659:                                                        BR*=@i;BRI=sqrt2rat(1/BR);
                   20660:                                                        R1=(-mycoef(RT[1],1,X)+BR)/C1;
                   20661:                                                        R2=(-mycoef(RT[1],1,X)-BR)/C1;
                   20662:                                                        P+=N*BRI*log( /* sqrt2rat */((x-R1)/(x-R2)));
                   20663:                                                }
                   20664:                                        }
                   20665:                                        P=red(P);
                   20666:                                }
                   20667:                                P=sqrt2rat(P);
                   20668:                        }else{
                   20669:                                mycat(["Cannot get an indefinite integral of ",F]);
                   20670:                                return [];
                   20671:                        }
                   20672:                }
                   20673:                Q=simplog(P,X);
                   20674:                if(type(V)==5&&nmono(P)!=nmono(Q)) V[0]=cons([[1,red(P)]],V[0]);
                   20675:                return red(Q);
                   20676:        }
                   20677:        return [];
                   20678: }
                   20679:
                   20680: def fshorter(P,X)
                   20681: {
                   20682:        Q=sqrt2rat(P);
                   20683:        R=trig2exp(Q,X|inv=1);
                   20684:        if(str_len(fctrtos(R))<str_len(fctrtos(Q))) Q=R;
                   20685:        Var=pfargs(Q,X|level=1);
                   20686:        for(C=F=0,R=1,V=Var;V!=[];V=cdr(V)){
                   20687:                if(findin(car(V)[1],[cos,sin,tan])>=0){
                   20688:                        if(!C){
                   20689:                                F=car(V)[2];
                   20690:                        }else{
                   20691:                                R=red(car(V)[2]/F);
                   20692:                                if(type(R)!=1) break;
                   20693:                                F/=dn(R);
                   20694:                        }
                   20695:                        C++;
                   20696:                }
                   20697:        }
                   20698:        if(getopt(period)==1) return F;
                   20699:        if(!isint(Log=getopt(log))) Log=0;
                   20700:        if(V==[]&&F!=0){
                   20701:                if(iand(Log,1)){
                   20702:                        H=append(cdr(fctr(nm(Q))),cdr(fctr(dn(Q))));
                   20703:                        for(L=0;H!=[];H=cdr(H))
                   20704:                                L+=str_len(rtostr(car(H)[0]));
                   20705:                }else L=str_len(fctrtos(Q));
                   20706:                S=trig2exp(P,X);
                   20707:                for(T=[sin(F),tan(F),cos(F),sin(F/2),cos(F/2),tan(F/2)];T!=[];T=cdr(T)){
                   20708:                        R=trig2exp(S,X|inv=car(T));
                   20709:                        if(iand(Log,1)){
                   20710:                                H=append(cdr(fctr(nm(R))),cdr(fctr(dn(R))));
                   20711:                                for(K=0;H!=[];H=cdr(H))
                   20712:                                        K+=str_len(rtostr(car(H)[0]));
                   20713:                        }else K=str_len(fctrtos(R));
                   20714:                        if(K<L){
                   20715:                                Q=R;L=K;
                   20716:                        }
                   20717:                }
                   20718:        }
                   20719:        return Q;
                   20720: }
                   20721:
                   20722: def isshortneg(P)
                   20723: {
                   20724:        return(str_len(rtostr(P))>str_len(rtostr(-P)))?1:0;
                   20725: }
                   20726:
                   20727: def simplog(R,X)
                   20728: {
                   20729:        for(V=[],Var=pfargs(R,X);Var!=[];Var=cdr(Var)){
                   20730:                VT=car(Var);
                   20731:                if(VT[1]==log && ptype(R,VT[0])==2 && mydeg(R,VT[0])==1)
                   20732:                        V=cons([VT[0],VT[2],mycoef(R,1,VT[0])],V);
                   20733:        }
                   20734:        for(;V!=[];V=cdr(V)){
                   20735:                VT=car(V);
                   20736:                for(V2=cdr(V);V2!=[];V2=cdr(V2)){
                   20737:                        Dn=1;
                   20738:                        if((C=red(car(V2)[2]/VT[2]))!=1&&C!=-1){
                   20739:                                if(getopt(mult)==1&&type(C)==1&&ntype(C)==0){
                   20740:                                        Dn=dn(C);C*=Dn;
                   20741:                                }else continue;
                   20742:                        }
                   20743:                        Log=red(VT[1]^Dn*car(V2)[1]^(Dn*C));
                   20744:                        L=str_len(rtostr(dn(Log)))-str_len(rtostr(nm(Log)));
                   20745:                        if(L>0 || (L==0&&isshortneg(VT[2])) ){
                   20746:                                Dn=-Dn;Log=1/Log;
                   20747:                        }
                   20748:                        R=mycoef(R,0,VT[0]);R=mycoef(R,0,car(V2)[0]);
                   20749:                        return(R+VT[2]*log(Log)/Dn);
                   20750:                }
                   20751:        }
                   20752:        return R;
                   20753: }
                   20754:
                   20755: def integrate(P,X)
                   20756: {
                   20757:        Dvi=getopt(dviout);
                   20758:        if(type(I=getopt(I))==4){
                   20759:                if((R=integrate(P,X))==[]) II="?";
                   20760:                else if(type(I[0])>3||type(I[1])>3){
                   20761:                        R=subst(R,X,x);
                   20762:                        V=flim(R,I[0]);VV=flim(R,I[1]);
                   20763:                        if(V==""||VV=="") II="?";
                   20764:                        else if(type(V)==7||type(VV)==7){
                   20765:                                if(V==VV) II="?";
                   20766:                                else II=(VV=="+"||V=="-")?"\\infty":"-\\infty";
                   20767:                        }else{
                   20768:                                II=VV-V;
                   20769:                                if(II>10^10) II="\\infty";
                   20770:                                else if(II<-10^10) II="-\\infty";
                   20771:                        }
                   20772:                }else{
                   20773:                        V=subst(R,X,I[1])-subst(R,X,I[0]);
                   20774:                        VV=myval(V);
                   20775:                        II=(type(VV)>=2||ntype(VV)<1)?VV:evalred(V);
                   20776:                }
                   20777:                if(type(Dvi)!=1) return II;
                   20778:                I=ltov(I);
                   20779:                for(J=0;J<2;J++){
                   20780:                        if(type(I[J])>3){
                   20781:                                if(type(I[J])==4&&length(I[J])>1) I[J]=I[J][1];
                   20782:                                else I[J]=(J==0)?"-\\infty":"\\infty";
                   20783:                        }
                   20784:                        if(type(I[J])<4) I[J]=my_tex_form(I[J]);
                   20785:                }
                   20786:                S=(type(II)==7)?II:my_tex_form(II);
                   20787:                S="\\int_{"+I[0]+"}^{"+I[1]+"}"+monototex(P)+"\\,d"+my_tex_form(X)+"&="+S;
                   20788:                if(Dvi==1) dviout(texbegin("align",S));
                   20789:                return S;
                   20790:        }
                   20791:        if(isint(Dvi)==1){
                   20792:                if(Dvi==2||getopt(dumb)==-1){
                   20793:                        V=newvect(1);V[0]=[];
                   20794:                }else V=0;
                   20795:                if((RR=integrate(P,X|dumb=V))==[]) return R;
                   20796:                S=fshorter(RR,X);
                   20797:                VV=[X];
                   20798:                if(V!=0){
                   20799:                        R=cons([[1,RR]],V[0]);
                   20800:                        if(S!=RR) R=cons([[1,RR=S]],R);
                   20801:                        for(V=FR=[];R!=[];R=cdr(R))
                   20802:                                if(car(R)!=FR) V=cons(FR=car(R),V);
1.21      takayama 20803:                        Var=varargs(V|all=2);
1.6       takayama 20804:                        for(S0=[x0,x1,x2,x3],S=[t,s,u,v,w];S0!=[]&&S!=[];){
                   20805:                                if(findin(car(S0),Var)<0){
                   20806:                                        S0=cdr(S0); continue;
                   20807:                                }
                   20808:                                if(findin(car(S),Var)>=0){
                   20809:                                        S=cdr(S); continue;
                   20810:                                }
                   20811:                                V=subst(V,[car(S0),car(S)]);S0=cdr(S0);S=cdr(S);
                   20812:                        }
                   20813:                        if(Dvi==-2) return V;
                   20814:                        S1="\\,dx&";
                   20815:                }else{
                   20816:                        V=[[],[[1,RR=S]]];
                   20817:                        S1="\\,dx";
                   20818:                }
                   20819:                if(type(P)>2){
                   20820:                        if(type(nm(P))<2){
                   20821:                                P=P*dx;S1=V?"&":"";
                   20822:                        }
                   20823:                        S=fctrtos(P|TeX=2,lim=0);SV0=my_tex_form(P);
                   20824:                        if(str_len(SV0)<str_len(S)) S=SV0;
                   20825:                }else S=monototex(P);
                   20826:                if(Dvi!=-2) S="\\int "+S+S1;
                   20827:                else S="";
                   20828:                for(L=[],V=cdr(V);V!=[];V=cdr(V)){
                   20829:                        CL=car(V);S0=["="];     /* a line */
                   20830:                        for(FL=0;CL!=[];CL=cdr(CL),FL++){
                   20831:                                CT=car(CL);                     /* a term */
                   20832:                                if((Y=CT[0])==0){       /* a variable */
                   20833:                                        CT=cdr(CT);
                   20834:                                        if(length(CT)>2) CT=cdr(CT);
                   20835:                                        S0=["\\qquad(",CT[0],"=",CT[1],")"];
                   20836:                                        break;
                   20837:                                }else{
                   20838:                                        for(FT=0,S2=[],CT=cdr(CT);CT!=[];CT=cdr(CT),FT++){
                   20839:                                        SV=fctrtos(car(CT)|TeX=2,lim=0);SV0=my_tex_form(car(CT));
                   20840:                                                if(str_len(SV0)<str_len(SV)) SV=SV0;
                   20841:                                                if(FL||FT||(F&&type(Y)<2)) SV=minustos(SV);
                   20842:                                                S2=append(["+",SV],S2);
                   20843:                                        }
                   20844:                                        S2=reverse(cdr(S2));
                   20845:                                        if(type(Y)>1){
                   20846:                                                if(length(S2)>1){
                   20847:                                                        S1="\\int\\left(";S3="\\right)\\,d";
                   20848:                                                }else{
                   20849:                                                        S1="\\int";S3="\\,d";
                   20850:                                                }
                   20851:                                                S2=cons(S1,append(S2,[S3,Y]));
                   20852:                                                if(findin(Y,VV)<0) VV=cons(Y,VV);
                   20853:                                        }
                   20854:                                        if(FL) S0=append(S0,cons("+",S2));
                   20855:                                        else S0=append(S0,S2);
                   20856:                                }
                   20857:                        }
                   20858:                        L=append([S0],L);
                   20859:                };
                   20860:                V=pfargs(RR,X|level=1);
                   20861:                for(Var=[];V!=[];V=cdr(V)) Var=cons(car(V)[0],Var);
                   20862:                Var=reverse(Var);
                   20863:                if(!isint(J=getopt(frac))) J=0;;
                   20864:                if(!iand(J,4)&&(!iand(J,2)||length(Var)==1)&&(iand(J,8)==8||ptype(RR,Var)==2)){
                   20865:                        F=1;
                   20866:                        if(iand(J,1)){
                   20867:                                K=str_len(fctrtos(RR));
                   20868:                                I=str_len(fctrtos(RR|var=Var));
                   20869:                                if(I>=K) F=0;
                   20870:                        }
                   20871:                        if(F){
                   20872:                                V=[fctrtos(RR|var=Var,TeX=2)];
                   20873:                                if(Dvi!=-2) V=cons("=",V);
                   20874:                                if(length(L)>0) L=cdr(L);
                   20875:                                L=append([V],L);
                   20876:                        }
                   20877:                }else if(ptype(RR,X)==2){
                   20878:                        L=cdr(L);
                   20879:                        V=[fctrtos(RR|var=X,TeX=2)];
                   20880:                        if(Dvi!=-2) V=cons("=",V);
                   20881:                        L=append([V],L);
                   20882:                }
                   20883:                S=texket(S+ltotex(reverse(L)|opt=["cr","spts0"],str=1));
                   20884:                if(getopt(log)!=1){
                   20885:                        for(V=[];VV!=[];VV=cdr(VV))
                   20886:                                V=cons(strtoascii(my_tex_form(car(VV))),V);
                   20887:                        S1=strtoascii("\\log");
                   20888:                        for(F=1;F;){    /* log(log(x)) */
                   20889:                                F=FT=0;
                   20890:                                S0=strtoascii(S);       /* log(x)  ->  log|x| */
                   20891:                                L=length(S0);
                   20892:                                S2=str_tb(0,0);
                   20893:                                for(I=0;;){
                   20894:                                        if(I>=L||(J=str_str(S0,S1|top=I+FT))<0){
                   20895:                                                S=str_tb(0,S2)+str_cut(S0,I,100000);
                   20896:                                                break;
                   20897:                                        }
                   20898:                                        if((K=str_str(S0,40|top=J+4))<0
                   20899:                                                ||(K!=J+4&&K!=J+9)||(N=str_pair(S0,K+1,40,41))<0){
                   20900:                                                FT=J-I+4;continue;
                   20901:                                        }
                   20902:                                        FT=0;
                   20903:                                        if(str_str(S0,V|top=K+1,end=N-1)[0]<0) S2=str_tb(str_cut(S0,I,N),S2);
                   20904:                                        else{
                   20905:                                        /* log(a) -> log(a) */
                   20906:                                                F=1;
                   20907:                                                if(N<L-1&&S0[N+1]==94){         /* log(x)^2 -> (log|x|)^2 */
                   20908:                                                        S2=str_tb([str_cut(S0,I,J-1),"\\left(",str_cut(S0,J,K-1),
                   20909:                                                        "|",str_cut(S0,K+1,N-1),"|\\right)"],S2);
                   20910:                                                }
                   20911:                                                else S2=str_tb([str_cut(S0,I,K-1),"|",str_cut(S0,K+1,N-1),"|"],S2);
                   20912:                                        }
                   20913:                                        I=N+1;
                   20914:                                }
                   20915:                        }
                   20916:                }
                   20917:                if(Dvi>0){
                   20918:                        dviout(texbegin("align*",S));
                   20919:                        return 1;
                   20920:                }
                   20921:                return S;
                   20922:        }       /* end of dviout */
                   20923:        SM=["Cannot integrate",P,"at present"];
                   20924:        P=sqrt2rat(P|mult=1);
                   20925:        Dumb2=1;Dumb3=0;W=newvect(1);W[0]=[];
                   20926:        if(type(Dumb=getopt(dumb))==5){
                   20927:                Dumb2=Dumb3=Dumb;D2=W;
                   20928:        }else if(!isint(Dumb)) Dumb=0;
                   20929:        if(Dumb==-1){
                   20930:                Dumb2=Dumb3=-1;
                   20931:        }
                   20932:        if(type(Dumb)!=5) D2=Dumb2;
                   20933:        if(!isint(Mul=getopt(mult))) Mul=0;
                   20934:        else Mul++;
                   20935:        if(type(VAR=getopt(var))!=4) VAR=[];
                   20936:        if(type(P)>4) return [];
                   20937:        if(iand(T=ptype(P=red(P),X),63)>3||Mul>4){
                   20938:                if(Dumb!=1) mycat(SM);
                   20939:                return [];
                   20940:        }
                   20941:        if(Dumb==-1) mycat(["integrate", P]);
                   20942:        else if(type(Dumb)==5) Dumb[0]=cons([[X,P]],Dumb[0]);
                   20943:        if(T<4 && (T<3||iscoef(P,os_md.israt))){
                   20944:                if(Dumb==-1) mycat(["rational function",P]);
                   20945:                else if(type(Dumb)==5) Dumb[0]=cons([[X,P]],Dumb[0]);
                   20946:                return intpoly(P,X|dumb=Dumb);  /* rational function */
                   20947:        }
                   20948:        Var=pfargs(P,X);
                   20949:        for(F=0,VV=Var;VV!=[];VV=cdr(VV)){
                   20950:                        /* p(x)*log(x^2-1), @e^x,  a^x, f(x)^(m/n) etc.->simplify */
                   20951:                V=car(VV);
                   20952:                if(V[1]==log && (T=ptype(V[2],X))>1 && T<4){
                   20953:                        if(mydeg(dn(V[2]),X)>0||mydeg(nm(V[2]),X)>1){
                   20954:                                FC=pfctr(V[2],X);RV=1;
                   20955:                                if(length(FC)>2){
                   20956:                                        RR=0;RV=1;
                   20957:                                        if((F0=car(FC)[0])!=1){
                   20958:                                                if(type(F0)!=1 && F0<0){
                   20959:                                                        for(FT=cdr(FT);FT!=[];FT=cdr(FT)){
                   20960:                                                                if(iand(car(FT)[1],1)){
                   20961:                                                                        RV=-1;F0=-F0;break;
                   20962:                                                                }
                   20963:                                                        }
                   20964:                                                }
                   20965:                                        }
                   20966:                                        if(F0!=1) RR=log(F0);
                   20967:                                        for(FC=cdr(FC);FC!=[];FC=cdr(FC)){
                   20968:                                                if(RV==-1&&iand(car(FC)[1],1)==1){
                   20969:                                                        RR+=car(FC)[1]*log(-car(FC)[0]);
                   20970:                                                        RV=1;
                   20971:                                                }else
                   20972:                                                        RR+=car(FC)[1]*log(car(FC)[0]);
                   20973:                                        }
                   20974:                                        P=subst(P,V[0],RR);
                   20975:                                        F=1;
                   20976:                                }
                   20977:                        }
                   20978:                        F=1;
                   20979:                }else if(V[1]==pow){
                   20980:                        if(ptype(V[2],X)==1){
                   20981:                                F=1;
                   20982:                                if(V[2]==@e){   /* @e^(f(x)) */
                   20983:                                        P=subst(P,V[0],exp(V[3]));
                   20984:                                }else P=subst(P,V[0],exp(log(V[2])*V[3]));
                   20985:                        }else if(type(V[3])<=1 && ntype(V[3])==0){      /* r(x)^(m/n) */
                   20986:                                if((Pw=floor(V[3]))!=0){
                   20987:                                        R=V[2]^Pw;
                   20988:                                        if((PF=V[3]-Pw)!=0) R*=V[2]^PF;
                   20989:                                        P=subst(P,V[0],R);
                   20990:                                        F=1;
                   20991:                                        V=[V[2]^PF,V[1],V[2],PF];
                   20992:                                }
                   20993:                                if(ptype(nm(V[2]),X)<2&&V[3]>0){        /* (1/p(x))^(m/n) */
                   20994:                                        P=subst(P,V[0],V[2]*red(1/V[2])^(1-V[3]));
                   20995:                                        F=0;VV=cons(0,Var=pfargs(P,X));continue;
                   20996:                                }
                   20997:                                if(ptype(V[2],X)<4&&(K=dn(V[3]))>1){
                   20998:                                        V2=red(V[2]);
                   20999:                                        DN=mydeg(nm(V2),X);DD=mydeg(dn(V2),X);
                   21000:                                        if(DN+DD>1){
                   21001:                                                VF=pfctr(V2,X);
                   21002:                                                R=car(VF)[0]^(car(VF)[1]);RR=0;
                   21003:                                                for(VF=cdr(VF);VF!=[];VF=cdr(VF)){
                   21004:                                                        TV=car(VF);TM=TV[1];
                   21005:                                                        while(abs(TM)>=K){
                   21006:                                                                RR=1;
                   21007:                                                                if(TM>0){
                   21008:                                                                        TM-=K;
                   21009:                                                                        RR*=TV[0]^nm(V[3]);
                   21010:                                                                }else{
                   21011:                                                                        TM+=K;
                   21012:                                                                        RR/=TV[0]^nm(V[3]);
                   21013:                                                                }
                   21014:                                                        }
                   21015:                                                        if(TM!=0) R*=TV[0]^TM;
                   21016:                                                }
                   21017:                                                if(RR){
                   21018:                                                        P=subst(P,V[0],RR*red(R)^(V[3]));F=1;
                   21019:                                                        F=0;VV=cons(0,Var=pfargs(P,X));continue;
                   21020:                                                }
                   21021:                                        }
                   21022:                                }
                   21023:                        }
                   21024:                }
                   21025:        }
                   21026:        if(F){
                   21027:                P=sqrt2rat(P|mult=1);
                   21028:                Var=pfargs(P=red(P),X);T=ptype(P,X);
                   21029:                if(T<4 && (T<3||iscoef(P,os_md.israt))){
                   21030:                        if(Dumb==-1) mycat(["rational function",P]);
                   21031:                        else if(type(Dumb)==5){
                   21032:                                Dumb[0]=cons([[X,P]],Dumb[0]);
                   21033:                                return intpoly(P,X|dumb=Dumb3);
                   21034:                        }
                   21035:                        return intpoly(P,X);    /* rational function */
                   21036:                }
                   21037:        }
                   21038: #if 1
                   21039:        for(P0=P,V=pfargs(P,X|level=1);V!=[];V=cdr(V))  /* P:tan(x) -> P0:sin(x)/cos(x) */
                   21040:                if(car(V)[1]==tan) P0=red(subst(P0,car(V)[0],sin(car(V)[2])/cos(car(V)[2])));
                   21041:        if(iand(ptype(P0,X),128)){                                              /* (log f)'=f'/f */
                   21042:                for(Df=cdr(fctr(dn(P0)));Df!=[];Df=cdr(Df)){
                   21043:                        if(!iand(ptype(car(Df)[0],X),64)) continue;
                   21044:                        Q=car(Df)[0]^(car(Df)[1]);QQ=red(dn(P0)/Q);
                   21045:                        DQ=red(diff(Q,X)*QQ);
                   21046:                        if(type(C=DQ/nm(P0))<2&&C!=0){
                   21047:                                PP=0;DN=[1];
                   21048:                        }else for(DN=cdr(fctr(DQ));DN!=[];DN=cdr(DN)){
                   21049:                                Y=car(DN)[0];
                   21050:                                if(!iand(ptype(Y,X),64)||(I=mydeg(nm(P0),Y))!=mydeg(DQ,Y)
                   21051:                                  || ptype((C=red(mycoef(nm(P0),I,Y)/mycoef(DQ,I,Y))),X)>1||C==0) continue;
                   21052:                                PP=red(P0-C*diff(Q,X)/Q);
                   21053:                                if(nmono(P0)>nmono(PP)) break;
                   21054:                        }
                   21055:                        if(DN!=[]){
                   21056:                                R=C*log(Q);
                   21057:                                if(PP==0){
                   21058:                                        if(P!=P0&&type(Dumb)==5) Dumb[0]=cons([[X,P0]],Dumb[0]);
                   21059:                                        return R;
                   21060:                                }
                   21061:                                W[0]=[];
                   21062:                                S=integrate(PP,X|dumb=D2);
                   21063:                                if(S!=[]){
                   21064:                                        if(type(Dumb)==5){
                   21065:                                                Dumb[0]=cons([[X,red(P0-PP),PP]],Dumb[0]);
                   21066:                                                TD=W[0];
                   21067:                                                for(W0=[],TD=reverse(TD);TD!=[];TD=cdr(TD)){
                   21068:                                                        if(car(TD)[0][0]){
                   21069:                                                                WL=cons([1,R],car(TD));
                   21070:                                                                Dumb[0]=cons(WL,Dumb[0]);
                   21071:                                                        }
                   21072:                                                        else Dumb[0]=cons(car(TD),Dumb[0]);
                   21073:                                                }
                   21074:                                        }
                   21075:                                        return red(R+S);
                   21076:                                }
                   21077:                        }
                   21078:                }
                   21079:        }
                   21080: #endif
                   21081:        if((length(Var)==1||getopt(exe)==1) &&  /* p(x)*atan(q(x))^m+r(x), etc */
                   21082:          findin((VT=car(Var))[1],[atan,asin,acos,log])>=0 && ptype(P,VT[0])==2 &&
                   21083:                (VT[1]!=log||(T!=65&&T!=66)||mydeg(VT[2],X)!=1)){ /* exclude x*log(x+1)^2 */
                   21084:                for(R=0,D=mydeg(P,VT[0]);D>=0;D--){
                   21085:                        Q=S=mycoef(P,D,VT[0]);
                   21086:                        if(S){
                   21087:                                if(D>0){
                   21088:                                        if((Q=integrate(S,X|mult=Mul))==[]) return Q;
                   21089:                                }else{
                   21090:                                        W[0]=[];
                   21091:                                        if((Q=integrate(S,X|dumb=D2,var=VAR,mult=Mul))==[]) return Q;
                   21092:                                        if(type(Dumb)==5){
                   21093:                                                TD=W[0];
                   21094:                                                for(W0=[],TD=reverse(TD);TD!=[];TD=cdr(TD)){
                   21095:                                                        if(car(TD)[0][0]){
                   21096:                                                                WL=cons([1,R],car(TD));
                   21097:                                                                Dumb[0]=cons(WL,Dumb[0]);
                   21098:                                                        }
                   21099:                                                        else Dumb[0]=cons(car(TD),Dumb[0]);
                   21100:                                                }
                   21101:                                                if(car(Dumb[0])!=[[1,R],[1,Q]])
                   21102:                                                        Dumb[0]=cons([[1,R,Q]],Dumb[0]);
                   21103:                                        }
                   21104:                                        return red(R+Q);
                   21105:                                }
                   21106:                        }else if(D>0) continue;
                   21107:                        if(D==0){
                   21108:                                if(Q!=0&&type(Dumb)==5) Dumb[0]=cons([[1,R,Q]],Dumb[0]);
                   21109:                                return red(Q+R);
                   21110:                        }
                   21111:                        R0=Q*VT[0]^D;
                   21112:                        P=(P0=P)-S*VT[0]^D-Q*diff(VT[0]^D,X);
                   21113:                        if(mydeg(P,VT[0])>=D){          /* (x+1)*log(x)/x^2 */
                   21114:                                if(mydeg(P,VT[0])==D &&
                   21115:                                  ptype(C=red(mycoef(P,D,VT[0])/diff(VT[0],X)),VT[0])<2){
                   21116:                                        P=P0-(S*VT[0]^D+Q*diff(VT[0]^D,X)+C*diff(VT[0]^(D+1),X)/(D+1));
                   21117:                                        R0+=C*VT[0]^(D+1)/(D+1);
                   21118:                                }else{
                   21119:                                        P=P0;
                   21120:                                        if(Dumb!=1) mycat(SM);
                   21121:                                        return [];
                   21122:                                }
                   21123:                        }
                   21124:                        if(type(Dumb)==5){
                   21125:                                if(P) Dumb[0]=cons([R?[1,R,R0]:[1,R0],[X,P]],Dumb[0]);
                   21126:                                else if(R!=0) Dumb[0]=cons([[1,R,R0]],Dumb[0]);
                   21127:                        }
                   21128:                        R+=R0;
                   21129:                }
                   21130:        }
                   21131:        if(length(Var)==1 && (VT=car(Var))[1]==pow && mydeg(P,VT[0])==1 && (PT=ptype(VT[2],X))<4){
                   21132:                PR=mycoef(P,0,VT[0]);
                   21133:                if(RR!=0){
                   21134:                        RR=integrate(RR,X|dumb=Dumb3,var=Var);
                   21135:                        if(RR==[]) return RR;
                   21136:                }
                   21137:                PW=VT[3];
                   21138:                if((D=mydeg(nm(V2=VT[2]),X))==2&&PT==2){        /* f(x)*(ax^2+bx+c)^(m/2)+r(x) */
                   21139:                        if(isint(2*PW)){
                   21140:                                C2=mycoef(V20=V2,2,X);F=1;
                   21141:                                if((C21=sqrtrat(C2))==[]) return [];
                   21142:                                if(imag(C21)!=0){
                   21143:                                        if(real(C21)!=0) return [];
                   21144:                                        C21=C21/@i;F=-1;
                   21145:                                }
                   21146:                                if(type(C21)>3) return [];
                   21147:                                P=subst(P,X,X/C21);VT=mysubst(VT,[X,X/C21]);V2=VT[2];
                   21148:                                C1=mycoef(V2,1,X)/F/2;
                   21149:                                if(C1!=0){
                   21150:                                        P=subst(P,X,X-C1);VT=mysubst(VT,[X,X-C1]);V2=VT[2];
                   21151:                                }
                   21152:                                C0=mycoef(V2,0,X);
                   21153:                                if((C01=sqrtrat(C0))==[]) return [];
                   21154:                                if(imag(nm(C01))!=0){
                   21155:                                        if(real(nm(C01))!=0) return [];
                   21156:                                        C01=C01/@i;G=-1;
                   21157:                                }else G=1;
                   21158:                                if(type(C01)>3||(F==-1&&G==-1)) return [];
                   21159:                                Y=makenewv([P,VAR]|var=x);
                   21160:                                if(F==-1){                              /* (c^2-x^2)^(1/2) */
                   21161:                                        Q=subst(P,VT[0],(C01*cos(Y))^(2*PW),X,YX=C01*sin(Y))
                   21162:                                                *C01*cos(Y)/C21;
                   21163:                                        SY=(C21*X+C1);CY=V20;YY=asin(sqrt2rat((C21*X+C1)/C01|mult=1));
                   21164:                                }else if(G==-1){                /* (x^2-c^2)^(1/2) */
                   21165:                                        Q=subst(P,VT[0],(C01*sin(Y)/cos(Y))^(2*PW),X,YX=C01/cos(Y))
                   21166:                                                *C01*sin(Y)/cos(Y)^2/C21;
                   21167:                                        SY=V20;CY=1/(C21*X+C1);YY=acos(sqrt2rat(C01*(C21*X+C1)|mult=1));
                   21168:                                }else{  /* (x^2+c^2)^(1/2) */
                   21169:                                        Q=subst(P,VT[0],(C01/cos(Y))^(2*PW),X,YX=C01*sin(Y)/cos(Y))
                   21170:                                                *C01/cos(Y)^2/C21;
                   21171:                                        CY=V20; YY=atan(sqrt2rat((C21*X+C1)/C01|mult=1));
                   21172:                                }
                   21173:                                if(Dumb==-1) mycat([C21*X+C1,"=",YX]);
                   21174:                                else if(type(Dumb)==5) Dumb[0]=cons([[0,Y,C21*X+C1,YX]],Dumb[0]);
                   21175:                                Q=sqrt2rat(Q);
                   21176:                                QQ=red(substblock(nm(Q),sin(Y),sin(Y)^2,1-cos(Y)^2)
                   21177:                                        /substblock(dn(Q),sin(Y),sin(Y)^2,1-cos(Y)^2));
                   21178:                                if(cmpsimple(QQ,Q|comp=2)<0) Q=QQ;
                   21179:                                QQ=red(substblock(nm(Q),cos(Y),cos(Y)^2,1-sin(Y)^2)
                   21180:                                        /substblock(dn(Q),cos(Y),cos(Y)^2,1-sin(Y)^2));
                   21181:                                if(cmpsimple(QQ,Q|comp=2)<0) Q=QQ;
                   21182:                                if((Q=integrate(Q,Y|dumb=Dumb2,var=cons(X,Var)))==[]) return [];
                   21183:                                Q=trig2exp(Q,Y|inv=cos(Y));
                   21184:                                for(V=vars(Q);V!=[];V=cdr(V)){
                   21185:                                        FA=funargs(car(V));
                   21186:                                        if(type(FA)==4&&FA[0]==log){
                   21187:                                                QQ=trig2exp(FA[1],Y|inv=cos(Y));
                   21188:                                                Q=mycoef(Q,0,car(V))+mycoef(Q,1,car(V))*log(QQ);
                   21189:                                        }
                   21190:                                }
                   21191:                                if(type(Dumb)==5) Dumb[0]=cons([[1,Q]],Dumb[0]);
                   21192:                                if(F==-1) Q=subst(Q,sin(Y),SY/C01,cos(Y),CY^(1/2)/C01,Y,YY);
                   21193:                                else if(G==-1){
                   21194:                                        Q=red(subst(Q,sin(Y),SY^(1/2)*cos(Y)/C01));
                   21195:                                        Q=red(subst(Q,cos(Y),C01*CY,Y,YY));
                   21196:                                }else{
                   21197:                                        Q=red(subst(Q,sin(Y),(C21*X+C1)*cos(Y)/C01));
                   21198:                                        Nm=substblock(nm(Q),cos(Y),C01^2/CY,cos(Y)^2);
                   21199:                                        Nm=subst(Nm,cos(Y),C01/CY^(1/2));
                   21200:                                        Dn=substblock(dn(Q),cos(Y),C01^2/CY,cos(Y)^2);
                   21201:                                        Dn=subst(Dn,cos(Y),C01/CY^(1/2));
                   21202:                                        Q=red(subst(Nm/Dn,Y,YY));
                   21203:                                }
                   21204:                                if(findin(Y,vars(Q))>=0) return [];
                   21205:                                for(R=[],Var=vars(Q);Var!=[];Var=cdr(Var)){
                   21206:                                        VT=funargs(V=car(Var));
                   21207:                                        if(type(VT)==4&&VT[0]==log&&ptype(VT[1],X)>60&&mydeg(Q,V)==1)
                   21208:                                                R=cons([mycoef(Q,1,V),V],R);
                   21209:                                }
                   21210:                                if(length(R)==2 && (R[0][0]==R[1][0]||R[0][0]+R[1][0]==0)){
                   21211:                                        R0=args(R[0][1])[0];R1=args(R[1][1])[0];
                   21212:                                        if(R[0][0]==R[1][0]) S=R0*R1;
                   21213:                                        else S=R1/R0;
                   21214:                                        Q=mycoef(Q,0,R[0][1]);Q=mycoef(Q,0,R[1][1]);
                   21215:                                        Q+=R[1][0]*log(red(S));
                   21216:                                }
                   21217:                                for(Var=vars(Q);Var!=[];Var=cdr(Var)){
                   21218:                                        VT=funargs(car(Var));
                   21219:                                        if(type(VT)==4&&VT[0]==log&&ptype(VT[1],X)>60){
                   21220:                                                S=trig2exp(VT[1],X|inv=cos(X),arc=1);
                   21221:                                                if(ptype(dn(S),X)<2 && mydeg(Q,car(Var))==1
                   21222:                                                  && ptype(mycoef(Q,1,car(Var)),X)<2){
                   21223:                                                        S=nm(S);
                   21224:                                                        SF=fctr(S);
                   21225:                                                        S/=SF[0][0];
                   21226:                                                }
                   21227:                                                if(cmpsimple(S,-S)>0) S=-S;
                   21228:                                                Q=subst(Q,car(Var),log(S));
                   21229:                                        }
                   21230:                                }                                       /*  x/(1-x^2)^(1/2)  */
                   21231:                                if(type(Q=red(Q+RR))==2&&type(Dumb)!=5) Q-=cterm(Q);
                   21232:                                if(Dumb==-1) mycat(["->",Q]);
                   21233:                                else if(type(Dumb)==5) Dumb[0]=cons([[1,Q]],Dumb[0]);
                   21234:                                return Q;
                   21235:                        }
                   21236:                }else if(D==1 && mydeg(Dn=dn(V2),X)<2 && type(PW)==1 && ntype(PW)==0 &&
                   21237:                  (V2!=X||ptype(mycoef(P,1,VT[0]),X)>2)){  /* p(x)((ax+b)/(cx+d))^(m/n) */
                   21238:                        PN=nm(PW);PD=dn(PW);
                   21239:                        Y=makenewv([P,VAR]|var=x);Q=Y^PD*Dn-nm(V2);F=-mycoef(Q,0,X)/mycoef(Q,1,X);
                   21240:                        Q=red(subst(P,VT[0],Y^PN,X,F)*diff(F,Y));
                   21241:                        if(Dumb==-1) mycat([Y,"=",V2^(1/PD)]);
                   21242:                        else if(type(Dumb)==5) Dumb[0]=cons([[0,Y,V2^(1/PD)]],Dumb[0]);
                   21243:                        if((Q=integrate(Q,Y|dumb=Dumb3,var=cons(X,Var)))==[]) return [];
                   21244:                        Q=red(Q);
                   21245:                        QN=subst(substblock(nm(Q),Y,Y^PD,V2),Y,V2^(1/PD));
                   21246:                        QD=subst(substblock(dn(Q),Y,Y^PD,V2),Y,V2^(1/PD));
                   21247:                        Q=red(QN/QD+RR);
                   21248:                        if(Dumb==-1) mycat(["->",Q]);
                   21249:                        else if(type(Dumb)==5) Dumb[0]=cons([[1,Q]],Dumb[0]);
                   21250:                        return Q;
                   21251:                }
                   21252:        }else if(length(Var)==2 &&              /* r(x,(ax+b)^(1/2),(cx+d)^(1/2)) */
                   21253:                (VT=car(Var))[1]==pow && ptype(VT[2],X)==1 && mydeg(VT[2],X)==1 && VT[3]==1/2 &&
                   21254:          (VS=car(car(Var)))[1]==pow && ptype(VS[2],X)==1 && mydeg(VS[2],X)==1 && VS[3]==1/2){
                   21255:                Y=makenewv([P,VAR]|var=x);R=(Y^2-myceof(VS[0],0,X))/(C=mycoef(VS[0],1,X));
                   21256:                if(Dumb==-1) mycat([Y,"=",VS[0]]);
                   21257:                else if(type(Dumb)==5) Dumb[0]=cons([[0,Y,VD[0]]],Dumb[0]);
                   21258:                R=integrate(subst(P,VS[0],Y,X,R)*2*Y/C,Y|dumb=Dumb3,var=cons(X,Var));
                   21259:                if(R!=[]){
                   21260:                        R=subst(substblock(R,Y,VS[0],Y^2),Y,VS[0]);
                   21261:                        if(Dumb==-1) mycat(["->",R]);
                   21262:                        else if(type(Dumb)==5) Dumb[0]=cons([[1,R]],Dumb[0]);
                   21263:                }
                   21264:                return R;
                   21265:        }
                   21266:        if(T==65||T==66){       /* polynomial including sin, exp etc */
                   21267:                for(F=0,VT=Var;VT!=[];VT=cdr(VT)){
                   21268:                        VTT=car(VT);
                   21269:                        if(ptype(VTT[2],X)>2||mydeg(VTT[2],X)>1) F=ior(F,256); /* compos. or rat. or nonlin. */
                   21270:                        K=findin(VTT[1],[cos,sin,tan,exp,log,pow]);
                   21271:                        F=ior(F,2^(K+1)); /* 1:other,2:cos,4:sin,8:tan,16:exp,32:log,64:pow */
                   21272:                        if((Deg=mydeg(P,VTT[0]))>1&&K!=4) F=ior(F,1024);        /* nonlinear */
                   21273:                        if(K==5 && (ptype(VTT[3],X)!=0 || VTT[2]!=x||Deg>1)) F=ior(F,8192); /* pow */
                   21274:                        for(;Deg>0;Deg--){ /* coef */
                   21275:                                if(ptype(mycoef(P,Deg,VTT[0]),X)>2){
                   21276:                                        if(K==4||K==5) F=ior(F,2048);  /* exp, log */
                   21277:                                        else F=ior(F,4096);
                   21278:                                }
                   21279:                        }
                   21280:                }
                   21281:                if(!iand(F,1+8+64+256+512+2048+8192)){  /* cos,sin,exp,log^n,x^c */
                   21282:                        if(iand(F,1024+4096)&&!iand(F,32+64)){ /* cos,sin,exp */
                   21283:                                if(type(Dumb)==5){
                   21284:                                        S=trig2exp(P,X|inv=1);
                   21285:                                        if(P!=S) Dumb[0]=cons([[X,S]],Dumb[0]);
                   21286:                                }
                   21287:                                R=integrate(trig2exp(P,X),X);
                   21288:                                if(R!=[]) S=trig2exp(R,X|inv=1);
                   21289:                                R=fshorter(S,X);
                   21290:                                if(type(Dumb)==5&&R!=S){
                   21291:                                        Dumb[0]=cons([[1,S]],Dumb[0]);
                   21292:                                }
                   21293:                                return R;
                   21294:                        }
                   21295:                        for(R=0,VT=Var;VT!=[];VT=cdr(VT)){
                   21296:                                CV=car(VT);
                   21297:                                C0=mycoef(CV[2],0,X);C1=mycoef(CV[2],1,X);
                   21298:                                Q=mycoef(P,1,CV[0]);
                   21299:                                if(CV[1]==sin||CV[1]==cos){
                   21300:                                        TR=(CV[1]==sin)?intpoly(Q,X|sin=C1):intpoly(Q,X|cos=C1);
                   21301:                                        R+=TR[0]*cos(CV[2])+TR[1]*sin(CV[2]);
                   21302:                                }else if(CV[1]==exp){
                   21303:                                        QT=exp(CV[2]);
                   21304:                                        for(V2=vars(C1);V2!=[];V2=cdr(V2)){  /* exp(2*log(a)*x) => a^(2*x) */
                   21305:                                                if(vtype(VA=car(V2))==2&&functor(VA)==log){
                   21306:                                                        if(ptype(C1,VA)!=2||mydeg(C1,VA)==1&&mycoef(C1,0,VA)==0){
                   21307:                                                                QT=args(VA)[0]^(red(C1/VA)*X);
                   21308:                                                                if(C0!=0) QT*=exp(C0);
                   21309:                                                                break;
                   21310:                                                        }
                   21311:                                                }
                   21312:                                        }
                   21313:                                        R+=intpoly(Q,X|exp=C1)*QT;
                   21314:                                }else if(CV[1]==pow)
                   21315:                                        R+=intpoly(Q,X|pow=CV[2])*x^CV[2];
                   21316:                                else if(CV[1]==log){
                   21317:                                        for(Deg=mydeg(P,CV[0]);Deg>0; Deg--){
                   21318:                                                Q=mycoef(P,Deg,CV[0]);
                   21319:                                                TR=intpoly(Q,X|log=[C1,C0,Deg]);
                   21320:                                                for(I=0;TR!=[];I++,TR=cdr(TR)){
                   21321:                                                        if(I==Deg) R+=car(TR)-subst(car(TR),X,0);
                   21322:                                                        else R+=car(TR)*CV[0]^(Deg-I);
                   21323:                                                }
                   21324:                                        }
                   21325:                                }
                   21326:                                P=mycoef(P,0,CV[0]);
                   21327:                        }
                   21328:                        R+=intpoly(P,X);
                   21329:                        return R;
                   21330:                }
                   21331:        }
                   21332:        for(K=0,VX=[],VT=Var;VT!=[];VT=cdr(VT)){                /*  contain only both pow and trig */
                   21333:                VTT=car(VT);
                   21334:                if(findin(VTT[1],[cos,sin,tan])>=0){
                   21335:                        if(ptype(VTT[2],X)!=2||mydeg(VTT[2],X)!=1) break;
                   21336:                        VX=cons(VTT,VX);
                   21337:                }else if(VTT[1]==pow) K=1;
                   21338:                else break;
                   21339:        }
                   21340:        if(VT==[]&&K==1&&VX!=[]){
                   21341:                D=VX[0][2];
                   21342:                if(VX[0][1]==tan) D*=2;
                   21343:                for(VT=cdr(VX);VT!=[];VT=cdr(VT)){
                   21344:                        K=VT[0][2]/D;
                   21345:                        if(VT[0][1]==tan) K*=2;
                   21346:                        if(type(K)!=1||ntype(K)!=0) break;
                   21347:                        D/=dn(K);
                   21348:                }
                   21349:                if(VT==[]){
                   21350:                        Y=makenewv([P,VAR]|var=x);
                   21351:                        for(Q=P,VT=VX;VT!=[];VT=cdr(VT)){
                   21352:                                VTT=car(VT);
                   21353:                                if(VTT[1]==cos||VTT[1]==sin){
                   21354:                                        VV=trig2exp(VTT[0],X|inv=cos(D));
                   21355:                                        VV=subst(VV,cos(D),(1-Y^2)/(1+Y^2),sin(D),2*Y/(Y^2+1));
                   21356:                                }else if(VTT[1]==tan){
                   21357:                                        VV=trig2exp(VTT[0],X|inv=tan(D/2));
                   21358:                                        VV=subst(VV,tan(D),Y);
                   21359:                                }
                   21360:                                Q=subst(Q,VTT[0],VV);
                   21361:                        }
                   21362:                        Q*=2/(Y^2+1);
                   21363:                        if(diff(Q,X)==0){
                   21364:                                if(Dumb==-1) mycat([Y,"=",tan(D/2)]);
                   21365:                                else if(type(Dumb)==5) Dumb[0]=cons([[0,Y,tan(D/2)]],Dumb[0]);
                   21366:                                R=integrate(Q,Y|dumb=Dumb2,var=cons(X,Var));
                   21367:                                if(R!=[]){
                   21368:                                        if(Dumb==-1) mycat(["->",R]);
                   21369:                                        else if(type(Dumb)==5) Dumb[0]=cons([[1,R]],Dumb[0]);
                   21370:                                        return sqrt2rat(subst(R,Y,tan(D/2))|mult=1);
                   21371:                                }
                   21372:                        }
                   21373:                }
                   21374:        }
                   21375:        if(T>65||iand(F,8)){    /* rational for functions or tan */
                   21376:                if(findin(X,vars(P))<0){
                   21377:                        for(XV=XE=0,VT=Var;VT!=[];VT=cdr(VT)){
                   21378:                                VTT=car(VT);
                   21379:                                if(mydeg(VTT[2],X)!=1) break;
                   21380:                                if(VTT[1]==cos||VTT[1]==sin||VTT[1]==tan){
                   21381:                                        K=red(VTT[2]/X);
                   21382:                                        if(type(K)>1||ntype(K)>0) break;
                   21383:                                        if(XV==0) XV=K;
                   21384:                                        else XV/=dn(K/XV);
                   21385:                                        if(VTT[1]==tan) P=red(subst(P,VTT[0],sin(VTT[2])/cos(VTT[2])));
                   21386:                                }else if(VTT[1]==exp){
                   21387:                                        K=red(VTT[2]/X);
                   21388:                                        if(type(K)>1||ntype(K)>0) break;
                   21389:                                        if(XE==0) XE=K;
                   21390:                                        else XE/=dn(K/XE);
                   21391:                                }else break;
                   21392:                        }
                   21393:                        if(VT==[]&&XE*XV==0){
                   21394:                                if(XE){
                   21395:                                        if(XE<0) XE=-XE;
                   21396:                                        Y=makenewv([P,VAR]|var=x);
                   21397:                                        for(F=0,VT=Var;VT!=[];VT=cdr(VT),F++){
                   21398:                                                VTT=car(VT);C=red(VTT[2]/X/XE);
                   21399:                                                P=subst(P,VTT[0],Y^C);
                   21400:                                                if(!F){
                   21401:                                                        if(Dumb==-1) mycat([Y^C,"=",VTT[0]]);
                   21402:                                                        else if(type(Dumb)==5) Dumb[0]=cons([[0,Y^C,VTT[0]]],Dumb[0]);
                   21403:                                                }
                   21404:                                        }
                   21405:                                        P/=XE*Y;
                   21406:                                        Q=integrate(P,Y|dumb=Dumb3,var=cons(X,VAR));
                   21407:                                        if(Q==[]) return [];
                   21408:                                        Q=subst(Q,Y,exp(XE*X));
                   21409:                                        Q=trig2exp(Q,X);
                   21410:                                        if(Dumb==-1) mycat(["->",Q]);
                   21411:                                        else if(type(Dumb)==5) Dumb[0]=cons([[1,Q]],Dumb[0]);
                   21412:                                        return Q;
                   21413:                                }
                   21414:                                P=trig2exp(nm(P),X|inv=cos(XV*X))/trig2exp(dn(P),X|inv=cos(XV*X));
                   21415:                                Y=makenewv([P,VAR]|var=x);
                   21416:                                Q=red(subst(P,sin(XV*X),Y*cos(XV*X)));
                   21417:                                Q=substblock(nm(Q),cos(XV*X),cos(XV*X)^2,1/(Y^2+1))/
                   21418:                                  (substblock(dn(Q),cos(XV*X),cos(XV*X)^2,1/(Y^2+1))*(Y^2+1));
                   21419:                                Q=red(Q);
                   21420:                                if(ptype(Q,X)<2){
                   21421:                                        XV*=2;P=Q;
                   21422:                                }else{
                   21423:                                        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);
                   21424:                                        P=red(P);
                   21425:                                }
                   21426:                                if(Dumb==-1){
                   21427:                                        mycat([Y,"=",tan(XV*X/2)]);
                   21428:                                        mycat(["integrate",P]);
                   21429:                                }else if(type(Dumb)==5) Dumb[0]=cons([[Y,P]],cons([[0,Y,tan(XV*X/2)]],Dumb[0]));
                   21430:                                R=intpoly(P,Y|dumb=Dumb);
                   21431:                                if(R==[]) return R;
                   21432:                                if(Dumb==-1) mycat(["->",R]);
                   21433:                                else if(type(Dumb)==5) Dumb[0]=cons([[1,R]],Dumb[0]);
                   21434:                                for(Log=1,K=0,Var=pfargs(RR=R,Y);Var!=[];Var=cdr(Var)){
                   21435:                                        VTT=car(Var);
                   21436:                                        if(VTT[1]==log){
                   21437:                                                C=mycoef(R,1,VTT[0]);
                   21438:                                                VT2=VTT[2];
                   21439:                                                if(K==0){
                   21440:                                                        K=C;Log=VT2;
                   21441:                                                        if(K<0){
                   21442:                                                                K=-K;Log=1/Log;
                   21443:                                                        }
                   21444:                                                }else{
                   21445:                                                        if((V=red(C/K))<0){
                   21446:                                                                VT2=1/VT2;V=-V;
                   21447:                                                        }
                   21448:                                                        if(type(V)>1||ntype(V)>0){
                   21449:                                                                Log=1;break;
                   21450:                                                        }
                   21451:                                                        if(isint(V)) Log*=VT2^V;
                   21452:                                                        else{
                   21453:                                                                D=dn(V);K/=D;
                   21454:                                                                Log=Log^D*VT2^nm(V);
                   21455:                                                        }
                   21456:                                                }
                   21457:                                                RR=mycoef(RR,0,VTT[0]);
                   21458:                                        }
                   21459:                                }
                   21460:                                if(Log!=1){
                   21461:                                        R=RR;
                   21462:                                        if(type(Dumb)==5){
                   21463:                                                if(RR) Dumb[0]=cons([[1,K*log(Log),RR]],Dumb[0]);
                   21464:                                                else Dumb[0]=cons([[1,K*log(Log)]],Dumb[0]);
                   21465:                                        }
                   21466:                                        Log=red(subst(red(Log),Y,sin(XV*X/2)/cos(XV*X/2)));
                   21467:                                        Log=fshorter(Log,X|log=1);      /* log(cos(2*x)+1)=-2*log(cos(x)) */
                   21468:                                        Nm=fctr(nm(Log));
                   21469:                                        for(T=[];Nm!=[];Nm=cdr(Nm)){
                   21470:                                                if(ptype(car(Nm)[0],X)>1) T=cons(car(Nm),T);
                   21471:                                        }
                   21472:                                        Nm=fctr(dn(Log));
                   21473:                                        for(;Nm!=[];Nm=cdr(Nm)){
                   21474:                                                if(ptype(car(Nm)[0],X)>1) T=cons([car(Nm)[0],-car(Nm)[1]],T);
                   21475:                                        }
                   21476:                                        for(I=0,Nm=T;T!=[];T=cdr(T)){
                   21477:                                                if(I=0) I=abs(car(T)[1]);
                   21478:                                                else I=igcd(I,car(T)[1]);
                   21479:                                        }
                   21480:                                        for(Log=1;Nm!=[];Nm=cdr(Nm)) Log*=car(Nm)[0]^(car(Nm)[1]/I);
                   21481:                                        K*=I;
                   21482:                                        if(cmpsimple(nm(Log),dn(Log))<0){
                   21483:                                                K=-K;Log=red(1/Log);
                   21484:                                        }
                   21485:                                        Log=K*log(Log);
                   21486:                                        if(type(Dumb)==5){
                   21487:                                                if(RR) Dumb[0]=cons([[1,Log,RR]],Dumb[0]);
                   21488:                                                else Dumb[0]=cons([[1,Log]],Dumb[0]);
                   21489:                                        }
                   21490:                                }else Log=0;
                   21491:                                for(Atan=0,Var=pfargs(RR=R,Y);Var!=[];Var=cdr(Var)){
                   21492:                                        VTT=car(Var);
                   21493:                                        if(VTT[1]==atan){
                   21494:                                                W=subst(VTT[2],Y,sin(XV*X/2)/cos(XV*X/2));
                   21495:                                                W=trig2exp(W,X|inv=1);
                   21496:                                                V2=funargs(dn(W));
                   21497:                                                if(type(V2)==4&&length(V2)==2){
                   21498:                                                        V3=V2[1]*mycoef(R,1,VTT[0]);
                   21499:                                                        Z=0;
                   21500:                                                        if(V2[0]==cos)
                   21501:                                                                Z=red(W*cos(V2[1])/sin(V2[1]));
                   21502:                                                        else if(V2[0]==sin){
                   21503:                                                                Z=red(W*sin(V2[1])/cos(V2[1]));
                   21504:                                                                V3=-V3;
                   21505:                                                        }
                   21506:                                                        if(Z==1){
                   21507:                                                                Atan+=V3;W=0;
                   21508:                                                        }else if(Z==-1){
                   21509:                                                                Atan-=V3;W=0;
                   21510:                                                        }
                   21511:                                                }
                   21512:                                                R0=mycoef(R,0,VTT[0]);
                   21513:                                                if(W!=0) Atan+=subst(R-R0,VTT[0],atan(W));      /* atan(W); */
                   21514:                                                R=R0;
                   21515:                                        }
                   21516:                                }
                   21517:                                if(R!=0){
                   21518:                                        R=subst(R,Y,sin(XV*X/2)/cos(XV*X/2));
                   21519:                                        R=red(R);
                   21520:                                        R=trig2exp(nm(R),X|inv=1)/trig2exp(dn(R),X|inv=1);
                   21521:                                }
                   21522:                                if(type(Dumb)==5){
                   21523:                                        F=0;WL=[];
                   21524:                                        if(R){
                   21525:                                                WL=cons(R,WL);
                   21526:                                                F++;
                   21527:                                        }
                   21528:                                        if(Atan){
                   21529:                                                WL=cons(Atan,WL);
                   21530:                                                F++;
                   21531:                                        }
                   21532:                                        if(Log){
                   21533:                                                WL=cons(Log,WL);
                   21534:                                                F++;
                   21535:                                        }
                   21536:                                        WL=cons(1,WL);
                   21537:                                        if(F>1) Dumb[0]=cons([WL],Dumb[0]);
                   21538:                                }
                   21539:                                R=red(R+Log+Atan);
                   21540:                                if(Dumb==-1) mycat(["->",R]);
                   21541:                                else if(type(Dumb)==5) Dumb[0]=cons([[1,R]],Dumb[0]);
                   21542:                                return fshorter(R,X);
                   21543:                        }
                   21544:                }
                   21545:        }
                   21546:        VT=pfargs(Q=P,X|level=1);
                   21547:        V=(iand(ptype(P,X),7)<3)?[X]:[];
                   21548:        for(;VT!=[];VT=cdr(VT))
                   21549:                if(ptype(P,car(VT)[0])<3) V=cons(car(VT)[0],V);
                   21550:        if(length(V)>0){                /* 1/x+tan(x)+... etc.: sums */
                   21551:                for(R=0;V!=[];V=cdr(V)){
                   21552:                        T=mycoef(Q,0,car(V));
                   21553:                        W[0]=[];
                   21554:                        S=integrate(TD=red(Q-T),X|dumb=D2,mult=Mul,exe=1);
                   21555:                        if(S==[]) continue;
                   21556:                        if(type(Dumb)==5){
                   21557:                                WL=0;
                   21558:                                if(T!=0) WL=[[X,TD,T]];
                   21559:                                if(R!=0) WL=cons([1,R],WL);
                   21560:                                if(WL) Dumb[0]=cons(WL,Dumb[0]);
                   21561:                                TD=W[0];
                   21562:                                if(R!=0||T!=0){
                   21563:                                        for(W0=[],TD=reverse(TD);TD!=[];TD=cdr(TD)){
                   21564:                                                if(car(TD)[0][0]){
                   21565:                                                        WL=(!T)?[]:[[X,T]];
                   21566:                                                        WL=append(car(TD),WL);
                   21567:                                                        if(R!=0) WL=cons([1,R],WL);
                   21568:                                                }else WL=car(TD);
                   21569:                                                Dumb[0]=cons(WL,Dumb[0]);
                   21570:                                        }
                   21571:                                }else Dumb[0]=append(TD,Dumb[0]);
                   21572:                        }
                   21573:                        R+=S;Q=T;
                   21574:                        if(!Q) return red(R);
                   21575:                }
                   21576:                W[0]=[];
                   21577:                if(P!=Q&&type(S=integrate(Q,X|dumb=D2,mult=Mul))<4){
                   21578:                        RR=red(R+S);
                   21579:                        if(type(Dumb)==5){
                   21580:                                TD=W[0];
                   21581:                                for(W0=[],TD=reverse(TD);TD!=[];TD=cdr(TD)){
                   21582:                                        if(car(TD)[0][0]){
                   21583:                                                WL=cons([1,R],car(TD));
                   21584:                                                Dumb[0]=cons(WL,Dumb[0]);
                   21585:                                        }
                   21586:                                        else Dumb[0]=append(TD,Dumb[0]);
                   21587:                                }
                   21588:                                if(nmono(R)+nmono(S)!=nmono(RR)) Dumb[0]=cons([[1,R,S]],Dumb[0]);
                   21589:                        }
                   21590:                        return RR;
                   21591:                }
                   21592:        }
                   21593:        if(Dumb!=1) mycat(SM);
                   21594:        return [];
                   21595: }
                   21596:
                   21597: def fimag(P)
                   21598: {
                   21599:        for(V=vars(P);V!=[];V=cdr(V)){
                   21600:                Q=[];
                   21601:                if(vtype(VF=car(V))==2){
                   21602:                        VAA=args(VF);
                   21603:                        if(VAA==[]) continue;
                   21604:                        VA=sqrt2rat(VAA[0]);
                   21605:                        if(functor(VF)==exp){
                   21606:                                if(imag(VA)!=0){
                   21607:                                        R=(real(VA)!=0)?exp(real(VA)):1;
                   21608:                                        Q=subst(P,VF,R*(cos(imag(VA))+sin(imag(VA))*@i));
                   21609:                                }
                   21610:                        }else if(functor(VF)==pow){
                   21611:                                VA=sqrt2rat(VAA[1]);
                   21612:                                if(imag(VA)!=0){
                   21613:                                        R=(real(VA)!=0)?VAA[0]^(real(VA)):1;
                   21614:                                        L=(VAA[0]!=@e)?log(VAA[0]):1;
                   21615:                                        Q=subst(P,VAA[0]^(VAA[1]),R*(cos(L*imag(VA))+sin(L*imag(VA))*@i));
                   21616:                                }else if(VAA[1]!=(V0=fimag(VA)))
                   21617:                                        Q=subst(P,VAA[0]^(VAA[1]),VAA[0]^(V0));
                   21618:                        }
                   21619:                        V0=VA;
                   21620:                        if(length(VAA)==1&&(VAA[0]!=V0||VA!=(V0=fimag(VA))))
                   21621:                                Q=subst(P,VF,subst(VF,VAA[0],V0));
                   21622:                }
                   21623:                if(Q!=[]&&P!=Q){
                   21624:                        P=Q;V=cons(0,vars(P));
                   21625:                }
                   21626:        }
                   21627:        return P;
                   21628: }
                   21629:
                   21630:
                   21631: def trig2exp(P,X)
                   21632: {
                   21633:        if(iand(ptype(P,X),128)){
                   21634:                OL=getopt();
                   21635:                Nm=trig2exp(nm(P),X|option_list=OL);
                   21636:                Dn=trig2exp(dn(P),X|option_list=OL);
                   21637:                R=red(Nm/Dn);
                   21638:                if(getopt(arc)==1) return sqrt2rat(R);
                   21639:        }
                   21640:        if((Inv=getopt(inv))==1||type(Inv)==2){
                   21641:                for(VT=T=vars(P);T!=[];T=cdr(T)){
                   21642:                        if(findin(functor(car(T)),[cos,sin,tan])>=0){
                   21643:                                P=trig2exp(P,X);VT=vars(P);break;
                   21644:                        }
                   21645:                }
                   21646:                for(;VT!=[];VT=cdr(VT)){
                   21647:                        if(functor(CT=car(VT))==exp){
                   21648:                                if((Re=real(args(CT)[0]))!=0){
                   21649:                                        if(isint(Re)) S=@e^Re;
                   21650:                                        else S=exp(Re);
                   21651:                                }else S=1;
                   21652:                                if((Im=imag(args(CT)[0]))!=0){
                   21653:                                        Q=nm(Im);Q=mycoef(Q,mydeg(Q,X),X);
                   21654:                                        if(-Q>Q) S*=cos(-Im)-@i*sin(-Im);
                   21655:                                        else S*=cos(Im)+@i*sin(Im);
                   21656:                                }
                   21657:                                P=subst(P,CT,S);
                   21658:                        }
                   21659:                }
                   21660:                P=red(P);
                   21661:                U=vars(Inv);
                   21662:                if(length(U)!=1||((F=functor(car(U)))!=sin&&F!=cos&&F!=tan)) return P;
                   21663:                XX=args(car(U))[0];
                   21664:                if(mydeg(XX,X)!=1) return P;
                   21665:                if(!isvar(XX)) P=subst(P,X,(X-mycoef(XX,0,X))/mycoef(XX,1,X));
                   21666:                for(VT=vars(P);VT!=[];VT=cdr(VT)){
                   21667:                        if(vtype(CT=car(VT))<2) continue;
                   21668:                        TX=args(CT)[0];
                   21669:                        if(mydeg(TX,X)!=1) continue;
                   21670:                        if(!isint(C1=mycoef(TX,1,X))) continue;
                   21671:                        if((C0=mycoef(TX,0,X))==0){
                   21672:                                CC=1;CS=0;
                   21673:                        }else if(vars(C0)==[@pi]){
                   21674:                                CC=myval(cos(C0));
                   21675:                                if(CC!=0&&type(CC)==1&&ntype(CC)!=0){
                   21676:                                        CC=cos(C0);CS=sin(C0);
                   21677:                                }else CS=myval(sin(C0));
                   21678:                        }else{
                   21679:                                CC=cos(C0);CS=sin(C0);
                   21680:                        }
                   21681:                        K=C1;
                   21682:                        if(K<0) K=-K;
                   21683:                        for(CC1=0,I=K;I>=0;I-=2) CC1+=(-1)^((K-I)/2)*binom(K,I)*cos(X)^I*sin(X)^(K-I);
                   21684:                        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);
                   21685:                        if(C1<0) CS1=-CS1;
                   21686:                        if((TF=functor(CT))==cos) P=subst(P,cos(TX),CC1*CC-CS1*CS);
                   21687:                        else if(TF==sin) P=subst(P,sin(TX),CS1*CC+CC1*CS);
                   21688:                }
                   21689:                if(F==sin)
                   21690:                        P=substblock(P,cos(X),cos(X)^2,1-sin(X)^2);
                   21691:                else{
                   21692:                        P=substblock(P,sin(X),sin(X)^2,1-cos(X)^2);
                   21693:                        if(F==tan){
                   21694:                                P=subst(P,sin(X),cos(X)*tan(X));
                   21695:                                P=substblock(P,cos(X),cos(X)^2,1/(tan(X)^2+1));
                   21696:                        }
                   21697:                }
                   21698:                if(!isvar(XX)) P=subst(P,X,XX);
                   21699:
                   21700:                if(getopt(arc)==1){
                   21701:                        for(VT=vars(P);VT!=[];VT=cdr(VT)){
                   21702:                                FA=funargs(car(VT));
                   21703:                                if(type(FA)==4&&(FA[0]==cos||FA[0]==sin)&&ptype(FA[1],X)>60){
                   21704:                                        VTT=vars(FA[1]);
                   21705:                                        if(type(FA[1])!=2||length(VTT)!=1) break;
                   21706:                                        FB=funargs(VTT[0]);
                   21707:                                        if(type(FB)!=4||(FF=findin(FB[0],[asin,acos,atan]))<0) break;
                   21708:                                        if(!isint(2*(C=mycoef(FA[1],1,VTT[0])))||mycoef(FA[1],0,VTT[0])!=0) break;
                   21709:                                        if(C==1/2){
                   21710:                                                if(FF==1){
                   21711:                                                        U=(FA[0]==cos)?(1+FB[1])/2:(1-FB[1])/2;
                   21712:                                                        P=subst(P,car(VT),red(U)^(1/2));
                   21713:                                                }else if(FF==2){
                   21714:                                                        if(FA[0]==sin){
                   21715:                                                                FB1=red(FB[1]);
                   21716:                                                                Nm=nm(FB1);CC=fctr(Nm)[0][0];Dn=dn(FB1);
                   21717:                                                                if(CC<0) CC=-CC;
                   21718:                                                                Nm/=CC;Dn/=CC;
                   21719:                                                                NN=Nm^2+Dn^2;
                   21720:                                                                P=subst(P,car(VT),((NN)^(1/2)-Dn)/Nm*cos(FA[1]));
                   21721:                                                        }
                   21722:                                                }
                   21723:                                                P=red(P);
                   21724:                                        }else if(C==1){
                   21725:                                                if(FF==1){
                   21726:                                                        if(FA[0]==cos) P=subst(P,car(VT),FB[1]);
                   21727:                                                        else P=subst(P,car(VT),(1-FB[1])^(1/2));
                   21728:                                                }else if(FF==0){
                   21729:                                                        if(FA[0]==sin) P=subst(P,car(VT),FB[1]);
                   21730:                                                        else P=subst(P,car(VT),(1-FB[1])^(1/2));
                   21731:                                                }
                   21732:                                                P=red(P);
                   21733:                                        }
                   21734:                                }
                   21735:                        }
                   21736:                        P=sqrt2rat(P);
                   21737:                }
                   21738:                return red(P);
                   21739:        }
                   21740:        Var=pfargs(P,X);
                   21741:        for(VT=Var;VT!=[];VT=cdr(VT)){
                   21742:                CT=car(VT);
                   21743:                if(CT[1]==cos)
                   21744:                        P=subst(P,CT[0],exp(CT[2]*@i)/2+exp(-CT[2]*@i)/2);
                   21745:                else if(CT[1]==sin)
                   21746:                        P=subst(P,CT[0],exp(-CT[2]*@i)*@i/2-exp(CT[2]*@i)*@i/2);
                   21747:                else if (CT[1]==tan)
                   21748:                        P=subst(P,CT[0],(exp(-CT[2]*@i)*@i-exp(CT[2]*@i)*@i)/(exp(CT[2]*@i)+exp(-CT[2]*@i)));
                   21749:                else if(CT[1]==pow){
                   21750:                        if(ptype(CT[2],X)>1) continue;
                   21751:                        if(CT[2]==@e) P=subst(P,CT[0],exp(CT[3]));
                   21752:                        else P=subst(P,CT[0],exp(log(CT[2])*exp(CT[3])));
                   21753:                }
                   21754:        }
                   21755:        P=red(P);
                   21756:        for(PP=1,Lp=(dn(P)==1)?1:0;Lp<2;Lp++){
                   21757:                PP=1/PP;
                   21758:                U=(Lp==0)?dn(P):nm(P);
                   21759:                if(U==1) continue;
                   21760:                Var=vars(U);
                   21761:                for(R=[],VT=Var;VT!=[];VT=cdr(VT))
                   21762:                        if(functor(car(VT))==exp) R=cons(car(VT),R);
                   21763:                RR=os_md.terms(U,R);
                   21764:                for(Q=0,RRT=RR;RRT!=[];RRT=cdr(RRT)){
                   21765:                        for(S=0,CT=cdr(car(RRT)),CR=R,UT=U;CR!=[];CR=cdr(CR),CT=cdr(CT)){
                   21766:                                UT=mycoef(UT,car(CT),car(CR));S+=car(CT)*args(car(CR))[0];
                   21767:                        }
                   21768:                        if(S==0) Q+=UT;
                   21769:                        else Q+=UT*exp(S);
                   21770:                }
                   21771:                PP*=Q;
                   21772:        }
                   21773:        return PP;
                   21774: }
                   21775:
                   21776: def powsum(N)
                   21777: {
                   21778:        if (N < 0) return 0;
                   21779:        if (N == 0) return x;
                   21780:        P = intpoly(N*powsum(N-1),x);
                   21781:        C = subst(P,x,1);
                   21782:        return P+(1-C)*x;
                   21783: }
                   21784:
                   21785: def bernoulli(N)
                   21786: {
                   21787:        return mydiff(powsum(N),x) - N*x^(N-1);
                   21788: }
                   21789:
                   21790: /* linfrac01([x,y]) */
                   21791: /* linfrac01(newvect(10,[0,1,2,3,4,5,6,7,8,9]) */
                   21792: /* 0:x=0, 1:x=y, 2:x=1, 3:y=0, 4:y=1, 5:x=\infty, 6:y=\infty, 7:x=y=0, 8:x=y=1, 9:x=y=\infty
                   21793:         10:y_2=0, 11:y_2=x, 12:y_2=y, 13: y_2=1,   14: y_2=\infty
                   21794:         15:y_3=0, 16:y_3=x, 17:y_3=y, 18: y_3=y_2, 19: y_3=1, 20:y_3=\infty
                   21795:         X[0],X[11],X[2],X[10],X[13],X[5],X[14],X[7],X[8],X[9],
                   21796:         X[3],X[1],X[12],X[4],X[6]
                   21797:
                   21798:        T=0   (x_2,x_1,x_3,x_4,...)
                   21799:        T=-j  (x_1,x_2,..,x_{j-1},x_{j+1},x_j,x_{j+2},...)
                   21800:        T=1   (1-x_1,1-x_2,1-x_3,1-x_4,...)
                   21801:        T=2   (1/x_1,1/x_2,1/x_3,1/x_4,...)
                   21802:        T=3   (x_1,x_1/x_2,x_1/x_3,x_1/x_4,...)
                   21803: */
                   21804:
                   21805: def lft01(X,T)
                   21806: {
                   21807:        MX=getopt();
                   21808:        if(type(X)==4){
                   21809:                K=length(X);
                   21810:                if(K>=1) D=1;
                   21811:        }
                   21812:        if(type(X)==5){
                   21813:                K=length(X);
                   21814:                for(J=5, F=K-10; F>0; F-=J++);
                   21815:                if(F==0) D=2;
                   21816:        }
                   21817:        if(D==0) return 0;
                   21818:        if(T==0){  /* x <-> y */
                   21819:                if(D==1){
                   21820:                        R=cdr(X); R=cdr(R);
                   21821:                        R=cons(X[0],R);
                   21822:                        return cons(X[1],R);
                   21823:                }
                   21824:                R=newvect(K,[X[3],X[1],X[4],X[0],X[2],X[6],X[5]]);
                   21825:                for(I=7;I<K;I++) R[I]=X[I];
                   21826:                for(I=11,J=5; I<K; I+=J++){
                   21827:                        R[I]=X[I+1]; R[I+1]=X[I];
                   21828:                }
                   21829:                return R;
                   21830:        }
                   21831:        if(T==1){
                   21832:                if(D==1){
                   21833:                        for(R=[];X!=[];X=cdr(X)) R=cons(1-car(X),R);
                   21834:                        return reverse(R);
                   21835:                }
                   21836:                R=newvect(K,[X[2],X[1],X[0],X[4],X[3],X[5],X[6],X[8],X[7],X[9]]);
                   21837:                for(I=11;I<K;I++) R[I]=X[I];
                   21838:                for(I=10, J=5; I<K; I+=J++){
                   21839:                        R[I]=X[I+J-2]; R[I+J-2]=X[I];
                   21840:                }
                   21841:                return R;
                   21842:        }
                   21843:        if(T==2){
                   21844:                if(D==1){
                   21845:                        for(R=[]; X!=[]; X=cdr(X)) R=cons(red(1/car(X)),R);
                   21846:                        return reverse(R);
                   21847:                }
                   21848:                R=newvect(K,[X[5],X[1],X[2],X[6],X[4],X[0],X[3],X[9],X[8],X[7]]);
                   21849:                for(I=11;I<K;I++) R[I]=X[I];
                   21850:                for(I=10,J=5; I<K; I+=J++){
                   21851:                        R[I]=X[I+J-1]; R[I+J-1]=X[I];
                   21852:                }
                   21853:                return R;
                   21854:        }
                   21855:        if(T==3){
                   21856:                if(D==1){
                   21857:                        T=car(X);
                   21858:                        for(R=[T],X=cdr(X); X!=[]; X=cdr(X))
                   21859:                                R=cons(red(T/car(X)),R);
                   21860:                        return reverse(R);
                   21861:                }
                   21862:                R=newvect(K,[X[7],X[4],X[2],X[6],X[1],X[9],X[3],X[0],X[8],X[5]]);
                   21863:                for(I=10,J=5; I<K; I+=J++){
                   21864:                        R[I]=X[I+J-1]; R[I+1]=X[I+J-2]; R[I+J-2]=X[I+1]; R[I+J-1]=X[I];
                   21865:                }
                   21866:                return R;
                   21867:        }
                   21868:        if(T==-1){
                   21869:                if(D==1){
                   21870:                        return append([X[1],X[2],X[0]],cdr(cdr(cdr(X))));
                   21871:                }
                   21872:                R=newvect(K,[X[0],X[11],X[2],X[10],X[13],X[5],X[14],X[7],X[8],X[9],
                   21873:                         X[3],X[1],X[12],X[4],X[6]]);
                   21874:                for(I=11;I<K;I++) R[I]=X[I];
                   21875:                for(I=17,J=5; I<K; I+=J++){
                   21876:                        R[I]=X[I+1]; R[I+1]=X[I];
                   21877:                }
                   21878:                return R;
                   21879:        }
                   21880:        if(T<0){
                   21881:                if(D==1){
                   21882:                        for(R=[],I=0; X!=[]; X=cdr(X),I--){
                   21883:                                if(I==T){
                   21884:                                        R=cons(X[1],R);
                   21885:                                        R=cons(X[0],R);
                   21886:                                        X=cdr(X);
                   21887:                                }
                   21888:                                else R=cons(car(X),R);
                   21889:                        }
                   21890:                        return reverse(R);
                   21891:                }
                   21892:                T=3-T;
                   21893:                R=newvect(K);
                   21894:                for(I=0;I<K;I++) R[I]=X[I];
                   21895:                for(I=10,J=5;J<T;I+=J++);
                   21896:                for(II=0; II<J-2; II++){
                   21897:                        R[I]=X[I+J]; R[I+J]=R[I];
                   21898:                }
                   21899:                for( ; II<J; II++){
                   21900:                        R[I]=X[I+J+1]; R[I+J+1]=X[I];
                   21901:                }
                   21902:                return R;
                   21903:        }
                   21904:        return 0;
                   21905: }
                   21906:
                   21907: def linfrac01(X)
                   21908: {
                   21909:        if(type(X)==4) K=length(X)-2;
                   21910:        else if(type(X)==5){
                   21911:                L=length(X);
                   21912:                for(K=0,I=10,J=5; I<L; K++,I+=J++);
                   21913:                if(I!=L) return 0;
                   21914:        }
                   21915:        if(K>3 && getopt(over)!=1) return(-1);
                   21916:        II=(K==-1)?3:4;
                   21917:        for(CC=C=1,L=[X]; C!=0; CC+=C){
                   21918:                for(F=C,C=0,R=L; F>0; R=cdr(R), F--){
                   21919:                        P=car(R);
                   21920:                        for(I=-K; I<II; I++){
                   21921:                                S=lft01(P,I);
                   21922:                                if(findin(S,L) < 0){
                   21923:                                        C++; L=cons(S,L);
                   21924:                                }
                   21925:                        }
                   21926:                }
                   21927:        }
                   21928:        return L;
                   21929: }
                   21930:
                   21931:
                   21932: def varargs(P)
                   21933: {
1.21      takayama 21934:        if((All=getopt(all))!=1&&All!=2) All=0;
1.6       takayama 21935:        V=vars(P);
                   21936:        for(Arg=FC=[];V!=[];V=cdr(V)){
1.21      takayama 21937:                if(vtype(CV=car(V))==0&&All!=0){
1.6       takayama 21938:                        Arg=lsort([CV],Arg,0);
                   21939:                }
                   21940:                if(vtype(CV)!=2) continue;
                   21941:                if(findin(F=functor(CV),FC)<0) FC=cons(F,FC);
                   21942:                for(AT=vars(args(CV));AT!=[];AT=cdr(AT)){
                   21943:                        if(vtype(X=car(AT))<2){
                   21944:                                if(findin(X,Arg)<0) Arg=cons(X,Arg);
                   21945:                        }else if(vtype(X)==2){
                   21946:                                R=varargs(X);
                   21947:                                if(R[1]!=[]){
                   21948:                                        Arg=lsort(R[1],Arg,0);
                   21949:                                        FC=lsort(R[0],FC,0);
                   21950:                                }
                   21951:                        }
                   21952:                }
                   21953:        }
1.21      takayama 21954:        Arg=reverse(Arg);
                   21955:        return (All==2)?Arg:[reverse(FC),Arg];
1.6       takayama 21956: }
                   21957:
                   21958: def pfargs(P,X)
                   21959: {
                   21960:        if(type(L=getopt(level))!=1) L=0;
                   21961:        for(Var=[],V=vars(P);V!=[];V=cdr(V)){
                   21962:                if(vtype(car(V))==2){
                   21963:                        VT=funargs(car(V));
                   21964:                        if(length(VT)>1){
                   21965:                                if(L<2 &&(ptype(VT[1],X)>1 || (length(VT)>2 && ptype(VT[2],X)>1)))
                   21966:                                        Var=cons(cons(car(V),VT),Var);
                   21967:                                if(L!=1 && (R=pfargs(VT[1],X|level=L-1))!=[]) Var=append(R,Var);
                   21968:                        }
                   21969:                }
                   21970:        }
                   21971:        return reverse(Var);
                   21972: }
                   21973:
                   21974: def ptype(P,L)
                   21975: {
                   21976:        if((T=type(P))<2 || T>3) return T;
                   21977:        if(type(L)!=4)  L=[L];
                   21978:        F=0;
                   21979:        if(lsort(L,varargs(dn(P))[1],2)!=[]) F=128;
                   21980:        if(lsort(L,varargs(nm(P))[1],2)!=[]) F+=64;
                   21981:        if(lsort(L,vars(dn(P)),2)!=[]) return F+3;
                   21982:        return (lsort(L,vars(nm(P)),2)==[])?(F+1):(F+2);
                   21983: }
                   21984:
                   21985: def nthmodp(X,N,P)
                   21986: {
                   21987:        X=X%P;
                   21988:        for(Z=1;;){
                   21989:                if((W=iand(N,1))==1)    Z=(Z*X)%P;
                   21990:                if((N=(N-W)/2)<=0)      return Z;
                   21991:                X=irem(X*X,P);
                   21992:        }
                   21993: }
                   21994:
                   21995: def issquaremodp(X,P)
                   21996: {
                   21997:        N=getopt(power);
                   21998:        if(!isint(N)) N=2;
                   21999:        if(P<=1 || !isint(P) || !pari(ispsp,P) || !isint(X) || !isint(N) || N<1){
                   22000:                errno(0);
                   22001:                return -2;
                   22002:        }
                   22003:        M=(P-1)/igcd(N,P-1);
                   22004:        if((X%=P) == 0) return 0;
                   22005:     if(X==1 || M==P-1) return 1;
                   22006:        return (nthmodp(X,M,P)==1)?1:-1;
                   22007: }
                   22008:
                   22009: def iscoef(P,F)
                   22010: {
                   22011:        if(P==0) return 1;
                   22012:        if(type(P)==1) return F(P);
                   22013:        if(type(P)==2) {
                   22014:                X=var(P);
                   22015:                for(I=deg(P,X); I>=0; I--){
                   22016:                        if(!iscoef(mycoef(P,I,X),F)) return 0;
                   22017:                }
                   22018:        }else if(type(P)==3){
                   22019:                if(!iscoef(nm(P),F)||!iscoef(dn(P),F)) return 0;
                   22020:        }else if(type(P)==4){
                   22021:                for(;P!=[];P=cdr(P)) if(!iscoef(P,F)) return 0;
                   22022:        }else if(type(P)>4 && type(P)<7) return iscoef(m2l(PP),F);
                   22023:        else return 0;
                   22024:        return 1;
                   22025: }
                   22026:
                   22027: def rootmodp(X,P)
                   22028: {
                   22029:        X%=P;
                   22030:        if(X==0)        return [0];
                   22031:        N=getopt(power);
                   22032:        PP=pari(factor,P);
                   22033:        P0=PP[0][0]; P1=PP[0][1];
                   22034:        P2=pari(phi,P);
                   22035:        if(!isint(N)) N=2;
                   22036:        N%=P2;
                   22037:        if(P0==2 || size(PP)[0]>1){
                   22038:                for(I=1,R=[]; I<P2; I++)
                   22039:                        if(nthmodp(I,N,P)==X)   R=cons(I,R);
                   22040:                return qsort(R);
                   22041:        }
                   22042:        Y=primroot(P);
                   22043:        if(Y==0) return 0;
                   22044:        Z=nthmodp(Y,N,P);
                   22045:        G=igcd(N,P2);
                   22046:        P3=P2/G;
                   22047:        for(I=0, W=1; I<P3;I++){
                   22048:                if(W==X)        break;
                   22049:                W=(W*Z)%P;
                   22050:        }
                   22051:        if(I==P3) return [];
                   22052:        W=nthmodp(Y,I,P);
                   22053:        Z=nthmodp(Y,P3,P);
                   22054:        for(I=0,R=[];;){
                   22055:                R=cons(W,R);
                   22056:                if(++I>=G) break;
                   22057:                W=(W*Z)%P;
                   22058:        }
                   22059:        return qsort(R);
                   22060: }
                   22061:
                   22062: def primroot(P)
                   22063: {
                   22064:        PP=pari(factor,P);
                   22065:        P0=PP[0][0]; P1=PP[0][1];
                   22066:        S=size(PP);
                   22067:        if(S[0]>1 || !isint(P) || P0<=2){
                   22068:                print("Not odd prime(power)!");
                   22069:                return 0;
                   22070:        }
                   22071:        if(isint(Ind=getopt(ind))){
                   22072:                Ind %= P;
                   22073:                if(Ind<=0 || igcd(Ind,P)!=1 || (Z=primroot(P))==0){
                   22074:                        print("Not exist!");
                   22075:                        return 0;
                   22076:                }
                   22077:                P2=P0^(P1-1)*(P0-1);
                   22078:                for(I=1,S=1; I<P2; I++)
                   22079:                        if((S = (S*Z)%P) == Ind)        return I;
                   22080:                return 0;
                   22081:        }
                   22082:        if(getopt(all)==1){
                   22083:                I=primroot(P);
                   22084:                P2=P0^(P1-1)*(P0-1);
                   22085:                for(L=[],J=1; J<P2; J++){
                   22086:                        if(P1>1 && igcd(P0,J)!=1) continue;
                   22087:                        if(igcd(P0-1,J)!=1) continue;
                   22088:                        L=cons(nthmodp(I,J,P),L);
                   22089:                }
                   22090:                return qsort(L);
                   22091:        }
                   22092:        if(PP[0][1]>1){
                   22093:                I=primroot(P0);
                   22094:                P2=P0^(P1-2)*(P0-1);
                   22095:                if(nthmodp(I,P2,P)==1)  I+=P0;
                   22096:                return I;
                   22097:        }
                   22098:        F=pari(factor,P-1);
                   22099:        SF=size(F)[0];
                   22100:        for(I=2; I<P; I++){
                   22101:                for(J=0; J<SF; J++)
                   22102:                        if(nthmodp(I,(P-1)/F[J][0],P)==1) break;
                   22103:                if(J==SF) return I;
                   22104:        }
                   22105: }
                   22106:
                   22107: def rabin(P,X)
                   22108: {
                   22109:        for(M=0,Q=P-1;iand(Q,1)==0;M++,Q/=2);
                   22110:        Z=nthmodp(X,Q,P);
                   22111:        for(N=M;M>0&&Z!=1&&Z!=P-1;M--,Z=(Z*Z)%P);
                   22112:        return (M<N&&(M==0||Z==1))?0:1;
                   22113: }
                   22114:
                   22115: def powprimroot(P,N)
                   22116: {
                   22117:        if(P<3) P=3;
                   22118:        FE=getopt(exp);
                   22119:        if(FE!=1) FE=0;
                   22120:        if((Log=getopt(log))==1||Log==2) FE=-1;
                   22121:        else if(Log==3){
                   22122:                FE=-2;
                   22123:                for(PP=1, L0=["$r$","$p/a$"];;){
                   22124:                        PP=pari(nextprime,PP+1);
                   22125:                        if(PP>=P) break;
                   22126:                        L0=cons(PP, L0);
                   22127:                }
                   22128:                L0=reverse(L0);
                   22129:        }
                   22130:        if(FE==0) All=getopt(all);
                   22131:        for(I=0, PP=P, LL=[]; I<N; I++,PP++){
                   22132:                PP=pari(nextprime,PP);
                   22133:                if(All==1){
                   22134:                        PR=primroot(PP|all=1);
                   22135:                        LL=cons(cons(PP,PR),LL);
                   22136:                        continue;
                   22137:                }
                   22138:                PR=primroot(PP);
                   22139:                if(FE==-2){                                     /* log=3 */
                   22140:                        LT=cdr(L0);LT=cdr(L0);
                   22141:                        for(L=[PP];LT!=[];LT=cdr(LT))
                   22142:                                L=cons(primroot(PP|ind=car(LT)),L);
                   22143:                        LL=cons(reverse(L),LL);
                   22144:                        if(I<N-1) L0=append(L0,[PP]);
                   22145:                }else if(FE){
                   22146:                        for(J=1, L=[PP], K=1; J<PP; J++){
                   22147:                                if(FE==-1){                     /* log=1,2 */
                   22148:                                        K=primroot(PP|ind=J);
                   22149:                                        if(K==0 && Log==2) K=PP-1;
                   22150:                                }
                   22151:                                else K=(K*PR)%PP;       /* exp=1 */
                   22152:                                L=cons(K,L);
                   22153:                        }
                   22154:                        LL=cons(reverse(L),LL);
                   22155:                }else
                   22156:                        LL=cons([PP,PR],LL);    /* default */
                   22157:        }
                   22158:        LL=reverse(LL);
                   22159:        if(!FE) return LL;
                   22160:        PP--;
                   22161:        if(FE==-2)      return append(LL,[L0]);
                   22162:        for(I=1,L=["$p$"];I<PP; I++)    L=cons(I,L);
                   22163:        return cons(reverse(L),LL);
                   22164: }
                   22165:
                   22166: def ntable(F,II,D)
                   22167: {
                   22168:        F=f2df(F|opt=-1);
                   22169:        Df=getopt(dif);
1.16      takayama 22170:        Str=getopt(str);
1.6       takayama 22171:        if(Df!=1) Df=0;
1.16      takayama 22172:        L=[];
                   22173:        if(type(D)==4){
                   22174:                if(type(II[0])==4){
                   22175:                        T1=II[0][1]-II[0][0];T2=II[1][1]-II[1][0];
                   22176:                        for(L0=[],I=0;I<D[0];I++){
                   22177:                                for(R=[],J=0;J<D[1];J++)
                   22178:                                        R=cons(myf2eval(F,II[0][0]+I*T1/D[0],II[1][0]+J*T2/D[1]),R);
                   22179:                                L=cons(reverse(R),L);L0=cons(II[0][0]+I*T1/D[0],L0);
                   22180:                        }
                   22181:                }else{
                   22182:                        for(T=II[1]-II[0],L0=[],I=0;I<D[0];I++){
                   22183:                                for(R=[],J=0;J<D[1];J++)
                   22184:                                        R=cons(myfdeval(F,II[0]+I*T/D[0]+J*T/D[0]/D[1]),R);
                   22185:                                L=cons(reverse(R),L);L0=cons(II[0]+I*T/D[0],L0);
                   22186:                        }
                   22187:                }
                   22188:                L=reverse(L);L0=reverse(L0);
                   22189:                if(type(Str)==4){
                   22190:                        L0=mtransbys(os_md.sint,L0,[Str[0]]|str=1,zero=0);
                   22191:                        L=mtransbys(os_md.sint,L,[Str[1]]|str=1,zero=0);
                   22192:                        if(Df==1){
                   22193:                                for(DT=[],RT=L,I=0;RT!=[];){
                   22194:                                        for(LT=[],TT=car(RT);TT!=[];TT=cdr(TT)){
                   22195:                                                VV=car(TT);
                   22196:                                                if((J=str_char(VV,0,"."))>=0){
                   22197:                                                        if(J==0) VV=str_cut(VV,1,10000);
                   22198:                                                        else VV=str_cut(VV,0,J-1)+str_cut(VV,J+1,10000);
                   22199:                                                }
                   22200:                                                V1=eval_str(VV);
                   22201:                                                if(I++) LT=cons(V1-V0,LT);
                   22202:                                                V0=V1;
                   22203:                                        }
                   22204:                                        DT=cons(LT,DT);
                   22205:                                        if((RT=cdr(RT))==[]){
                   22206:                                                VE=rint(myfdeval(F,II[1])*10^Str[1]);
                   22207:                                                DT=cons([VE-V0],DT);
                   22208:                                        }
                   22209:                                }
                   22210:                                for(I=0,D=[],TT=DT;TT!=[];TT=cdr(TT)){
                   22211:                                        if(!I++) V=car(TT)[0];
                   22212:                                        else{
                   22213:                                                T1=reverse(cons(V,car(TT)));
                   22214:                                                V=car(T1);
                   22215:                                                if(length(TT)>1) T1=cdr(T1);
                   22216:                                                D=cons(T1,D);
                   22217:                                        }
                   22218:                                }
                   22219:                                for(DD=[],TT=D;TT!=[];TT=cdr(TT))
                   22220:                                DD=cons([os_md.lmin(car(TT)),os_md.lmax(car(TT))],DD);
                   22221:                                DD=reverse(DD);
                   22222:                                L=lsort(L,DD,"append");
                   22223:                        }
                   22224:                }
                   22225:                L=lsort(L,L0,"cons");
                   22226:                if(type(Top=getopt(top))==4||getopt(TeX)==1){
                   22227:                        if(type(Top)==4){
                   22228:                                K=length(L[0])-length(Top);
                   22229:                                if(K>0&&K<4){
                   22230:                                        if(K>1){
                   22231:                                                Top=append(Top,["",""]);
                   22232:                                                K-=2;
                   22233:                                        }
                   22234:                                        if(K) Top=cons("",Top);
                   22235:                                }
                   22236:                                L=cons(Top,L);
                   22237:                        }
                   22238:                        if(type(H=getopt(hline))!=4) H=[0,1,z];
                   22239:                        if(type(V=getopt(vline))!=4) V=[0,1,(DF)?z-2:z];
                   22240:                        if(type(T=getopt(title))!=7) Out=ltotex(L|opt="tab",hline=H,vline=V);
                   22241:                        else Out=ltotex(L|opt="tab",hline=H,vline=V,title=T);
                   22242:                        if(Df) Out=str_subst(Out,"\\hline","\\cline{1-"+rtostr(length(L[0])-2)+"}");
                   22243:                        return Out;
                   22244:                }
                   22245:                return L;
                   22246:        }
1.6       takayama 22247:        for(L=[],I=0;I<=D;I++){
                   22248:                X=II[0]+I*T/D;
                   22249:                L=cons([X,myfdeval(F,X)],L);
                   22250:        }
                   22251:        if(Df==1){
                   22252:                for(LD=[],LL=L;LL!=[];LL=cdr(LL)){
                   22253:                        if(LD==[]) LD=cons([car(LL)[0],car(LL)[1],0],LD);
                   22254:                        else LD=cons([car(LL)[0],car(LL)[1],abs(car(LL)[1]-car(LD)[1])],LD);
                   22255:                }
                   22256:                L=reverse(LD);
                   22257:        }
1.16      takayama 22258:        if(type(Str)==4){
1.6       takayama 22259:                if(length(Str)==1) Str=[Str[0],Str[0]];
1.16      takayama 22260:                if(Df==1 && length(Str)==2) Str=[Str[0],Str[1],Str[1]];
1.6       takayama 22261:                for(S=Str,Str=[];S!=[];S=cdr(S)){
                   22262:                        if(type(car(S))!=4) Str=cons([car(S),3],Str);
                   22263:                        else Str=cons(car(S),Str);
                   22264:                }
                   22265:                Str=reverse(Str);
                   22266:                for(LD=[],LL=L;LL!=[];LL=cdr(LL)){
                   22267:                        for(K=[],J=length(Str); --J>=0; )
                   22268:                                K=cons(sint(car(LL)[J],Str[J][0]|str=Str[J][1]),K);
                   22269:                        LD=cons(K,LD);
                   22270:                }
                   22271:                L=LD;
                   22272:        }else
                   22273:                L=reverse(L);
                   22274:        if(type(M=getopt(mult))==1){
                   22275:                Opt=[["opt","tab"],["vline",[[0,2+Df]]],["width",-M]];
                   22276:                if(type(T=getopt(title))==7)
                   22277:                        Opt=cons(["title",T],Opt);
                   22278:                if(type(Tp=getopt(top))==4)
                   22279:                        Opt=cons(["top",Tp],Opt);
                   22280:                L=ltotex(L|option_list=Opt);
                   22281:        }
                   22282:        return L;
                   22283: }
                   22284:
                   22285: def distpoint(L)
                   22286: {
                   22287:        L=m2l(L|flat=1);
                   22288:        if(getopt(div)==5) Div=5;
                   22289:        else Div=10;
                   22290:        V=newvect(100/Div);
                   22291:     for(LT=L,LL=[],N=0; LT!=[]; LT=cdr(LT)){
                   22292:                if(type(K=car(LT))>1||K<0){
                   22293:                        N++; continue;
                   22294:                }
                   22295:                LL=cons(K,LL);
                   22296:                T=idiv(K,Div);
                   22297:                if(Div==10 && T>=9) T=9;
                   22298:                else if(Div==5 && T>=19) T=19;
                   22299:                V[T]++;
                   22300:        }
                   22301:        V=vtol(V);
                   22302:        if((Opt=getopt(opt))=="data") return V;
                   22303:        Title=getopt(title);
                   22304:        OpList=[["opt","tab"]];
                   22305:        if(type(Title=getopt(title)) == 7)
                   22306:                        OpList=cons(["title",Title],OpList);
                   22307:        if(Opt=="average"){
                   22308:                T=isMs()?["平均点","標準偏差","最低点","最高点","受験人数"]:
                   22309:                ["average","deviation","min","max","examinees"];
                   22310:                L=average(LL);
                   22311:                L=[sint(L[0],1),sint(L[1],1),L[3],L[4],L[2]];
                   22312:                if(N>0){
                   22313:                        T=append(T,[isMs()?"欠席者":"absentees"]);L=append(L,[N]);
                   22314:                }
                   22315:                OpList=cons(["align","c"],OpList);
                   22316:                return ltotex([T,L]|option_list=OpList);
                   22317:        }
                   22318:
                   22319:        if(getopt(opt)=="graph"){
                   22320:                Mul=getopt(size);
                   22321:                if(Div==5){
                   22322:                        V0=["00","05","10","15","20","25","30","35","40","45","50","55",
                   22323:                        "60","65","70","75","80","85","90","95"];
                   22324:                        if(type(Mul)!=4){
                   22325:                                Size = (TikZ)?[12,3,1/2,0.2]:[120,30,1/2,2];
                   22326:                        }
                   22327:                }else{
                   22328:                        V0=["00-","10-","20-","30-","40-","50-","60-","70-","80-","90-"];
                   22329:                        if(type(Mul)!=4){
                   22330:                                Size = (TikZ)?[8,3,1/2,0.2]:[80,30,1/2,2];
                   22331:                        }
                   22332:                }
                   22333:                return ltotex([V,V0]|opt="graph",size=Size);
                   22334:        }
                   22335:        if(Div==5)
                   22336:                V0=["00--04","05--09","10--14","15--19", "20--24", "25--29", "30--34", "35-39",
                   22337:                "40--44", "45--49","50--54", "55--59","60--64", "65--69",
                   22338:                "70--74", "75--79","80--84", "85--89","90--94", "95--100"];
                   22339:        else
                   22340:                V0=["00--09","10--19","20--29","30--39","40--49","50--59","60--69",
                   22341:                "70--79","80--89","90--100"];
                   22342:        Title=getopt(title);
                   22343:        return ltotex([V0,V]|option_list=OpList);
                   22344: }
                   22345:
                   22346: def keyin(S)
                   22347: {
1.46      takayama 22348:        mycat0(S,0);
1.6       takayama 22349:        purge_stdin();
                   22350:        S=get_line();
                   22351:        L=length(S=strtoascii(S));
                   22352:        if(L==0) return "";
                   22353:        return str_cut(S,0,L-2);
                   22354: }
                   22355:
                   22356: def init() {
1.16      takayama 22357:        LS=["DIROUT","DVIOUTA","DVIOUTB","DVIOUTH","DVIOUTL","TeXLim","TeXEq","TikZ",
1.6       takayama 22358:                "XYPrec","XYcm","Canvas"];
                   22359:        if(!access(get_rootdir()+"/help/os_muldif.dvi")||!access(get_rootdir()+"/help/os_muldif.pdf"))
                   22360:                mycat(["Put os_muldif.dvi and os_muldif.pdf in", get_rootdir()+(isMs()?"\\help.":"/help.")]);
                   22361:        if(!isMs()){
                   22362:                DIROUT="%HOME%/asir/tex";
                   22363:                DVIOUTA=str_subst(DVIOUTA,[["\\","/"],[".bat",".sh"]],0);
                   22364:                DVIOUTB=str_subst(DVIOUTB,[["\\","/"],[".bat",".sh"]],0);
                   22365:                DVIOUTL=str_subst(DVIOUTL,[["\\","/"],[".bat",".sh"]],0);
                   22366:                DVIOUTH="%ASIRROOT%/help/os_muldif.pdf";
                   22367:        }
                   22368:        Home=getenv("HOME");
                   22369:        if(type(Home)!=7)       Home="";
                   22370:        for(Id=-7, F=Home; Id<-1;){
                   22371:                G = F+"/.muldif";
                   22372:                if(access(G)) Id = open_file(G);
                   22373:                else Id++;
                   22374:                if(Id==-6)              F+="/asir";
                   22375:                else if(Id==-5) F=get_rootdir();
                   22376:                else if(Id==-4) F+="/bin";
                   22377:                else if(Id==-3) F=get_rootdir()+"/lib-asir-contrib";
                   22378:        }
                   22379:        if(Id>=0){
                   22380:                while((S=get_line(Id))!=0){
1.18      takayama 22381:                        if(type(P=str_str(S,LS))==4 && (P0=str_char(S,P[1]+4,"="))>0){
1.6       takayama 22382:                                if(P[0]<5){
                   22383:                                        P0=str_chr(S,P0+1,"\"");
                   22384:                                        if(P0>0){
                   22385:                                                for(P1=P0;(P2=str_char(S,P1+1,"\""))>0; P1=P2);
                   22386:                                                if(P1>P0+1){
                   22387:                                                        SS=str_cut(S,P0+1,P1-1);
                   22388:                                                        SS=str_subst(SS,["\\\\","\\\""],["\\","\""]);
                   22389:                                                        if(P[0]==0)                     DIROUT=SS;
                   22390:                                                        else if(P[0]==1)        DVIOUTA=SS;
                   22391:                                                        else if(P[0]==2)        DVIOUTB=SS;
                   22392:                                                        else if(P[0]==3)        DVIOUTH=SS;
                   22393:                                                        else if(P[0]==4)        DVIOUTL=SS;
                   22394:                                                }
                   22395:                                        }
                   22396:                                        if(P0<0 || P1<P0+2) mycat(["Error!  Definiton of", LS[P[0]],
                   22397:                                                "in .muldif"]);
                   22398:                                }else{
                   22399:                                        SV=eval_str(str_cut(S,P0+1,str_len(S)-1));
1.16      takayama 22400:                                        if(P[0]==5)                     TeXLim=SV;
                   22401:                                        else if(P[0]==6)        TeXEq=SV;
                   22402:                                        else if(P[0]==7)        TikZ=SV;
                   22403:                                        else if(P[0]==8)        XYPrec=SV;
                   22404:                                        else if(P[0]==9)        XYcm=SV;
1.18      takayama 22405:                                        else if(P[0]==10)       Canvas=SV;
1.6       takayama 22406:                                }
                   22407:                        }
                   22408:                }
                   22409:                close_file(Id);
                   22410:        }
                   22411:        chkfun(1,0);
                   22412: }
                   22413:
                   22414: #ifdef USEMODULE
                   22415: endmodule;
                   22416: os_md.init()$
                   22417: #else
                   22418: init()$
                   22419: #endif
                   22420:
                   22421: end$

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