Annotation of OpenXM/src/asir-contrib/packages/src/os_muldif.rr, Revision 1.4
1.4 ! takayama 1: /* $OpenXM: OpenXM/src/asir-contrib/packages/src/os_muldif.rr,v 1.3 2015/08/27 11:02:20 takayama Exp $ */
1.1 takayama 2: /* The latest version will be at ftp://akagi.ms.u-tokyo.ac.jp/pub/math/muldif
3: scp os_muldif.[dp]* ${USER}@lemon.math.kobe-u.ac.jp:/home/web/OpenXM/Current/doc/other-docs
4: */
5: #define USEMODULE 1
6: /* #undef USEMODULE */
7:
8: /* os_muldif.rr (Library for Risa/Asir)
1.4 ! takayama 9: * Toshio Oshima (Nov. 2007 - May. 2016)
1.1 takayama 10: *
11: * For polynomials and differential operators with coefficients
12: * in rational funtions (See os_muldif.pdf)
13: *
14: * "Tab = 4 column" is best
15: */
16:
17: ord([zz,dz,dy,dx])$
18:
19: #ifdef USEMODULE
20: module os_md;
21: static Muldif.rr$
22: static TeXEq$
23: static TeXLim$
24: static DIROUT$
25: static DVIOUTL$
26: static DVIOUTA$
1.3 takayama 27: static DVIOUTB$
1.1 takayama 28: static DVIOUTH$
1.3 takayama 29: static DVIOUTF$
30: static LCOPT$
31: static COLOPT$
32: static LPOPT$
33: static LFOPT$
1.1 takayama 34: static ErMsg$
35: static FLIST$
36: static IsYes$
1.3 takayama 37: static XYPrec$
38: static XYcm$
39: static TikZ$
40: static XYLim$
1.4 ! takayama 41: static Canvas$
1.3 takayama 42: static ID_PLOT$
1.4 ! takayama 43: static Rand$
! 44: localf spType2$
1.1 takayama 45: localf erno$
46: localf chkfun$
47: localf makev$
1.4 ! takayama 48: localf makenewv$
1.1 takayama 49: localf vweyl$
50: localf mycat$
51: localf mycat0$
52: localf findin$
53: localf countin$
54: localf mycoef$
55: localf mydiff$
56: localf myediff$
57: localf m2l$
58: localf m2ll$
59: localf mydeg$
1.4 ! takayama 60: localf pfctr$
1.1 takayama 61: localf mymindeg$
62: localf m1div$
63: localf mulsubst$
64: localf cmpsimple$
65: localf simplify$
66: localf monotos$
1.4 ! takayama 67: localf minustos$
1.1 takayama 68: localf monototex$
69: localf vnext$
70: localf ldict$
71: localf ndict$
72: localf nextsub$
73: localf nextpart$
74: localf transpart$
75: localf trpos$
76: localf sprod$
77: localf sinv$
78: localf slen$
79: localf sord$
80: localf vprod$
1.3 takayama 81: localf dvangle$
82: localf dvprod$
83: localf dnorm$
1.1 takayama 84: localf mulseries$
85: localf pluspower$
86: localf vtozv$
87: localf dupmat$
88: localf matrtop$
1.3 takayama 89: localf mytrace$
1.1 takayama 90: localf mydet$
91: localf mperm$
92: localf mtranspose$
93: localf mtoupper$
94: localf mydet2$
95: localf myrank$
96: localf meigen$
1.3 takayama 97: localf transm$
1.1 takayama 98: localf vgen$
99: localf mmc$
100: localf lpgcd$
101: localf mdivisor$
102: localf mdsimplify$
103: localf m2mc$
104: localf easierpol$
105: localf mykernel$
106: localf myimage$
107: localf mymod$
108: localf mmod$
1.3 takayama 109: localf ladd$
1.4 ! takayama 110: localf lchange$
1.3 takayama 111: localf llsize$
1.1 takayama 112: localf llbase$
113: localf lsort$
1.3 takayama 114: localf lmax$
115: localf lmin$
1.4 ! takayama 116: localf lgcd$
! 117: localf ldev$
1.1 takayama 118: localf lsol$
119: localf lnsol$
1.3 takayama 120: /* localf psol$ */
1.1 takayama 121: localf m2v$
122: localf lv2m$
123: localf m2lv$
124: localf s2m$
1.3 takayama 125: localf c2m$
1.1 takayama 126: localf m2diag$
127: localf myinv$
128: localf madjust$
129: localf mpower$
1.3 takayama 130: localf mrot$
1.1 takayama 131: localf texlen$
132: localf isdif$
133: localf fctrtos$
134: localf texlim$
135: localf fmult$
136: localf radd$
137: localf getel$
138: localf ptol$
139: localf rmul$
140: localf mtransbys$
1.3 takayama 141: localf drawopt$
142: localf execdraw$
143: localf execproc$
1.1 takayama 144: localf mysubst$
1.3 takayama 145: localf evals$
1.4 ! takayama 146: localf myval$
1.3 takayama 147: localf myeval$
148: localf mydeval$
149: localf myfeval$
150: localf myf2eval$
151: localf myf3eval$
152: localf myfdeval$
153: localf myf2deval$
154: localf myf3deval$
155: localf myexp$
156: localf mycos$
157: localf mysin$
158: localf mytan$
159: localf myarg$
160: localf myasin$
161: localf myacos$
162: localf myatan$
163: localf mylog$
1.4 ! takayama 164: localf mypow$
! 165: localf arg$
! 166: localf sqrt$
1.3 takayama 167: localf gamma$
168: localf lngamma$
169: localf digamma$
170: localf dilog$
171: localf zeta$
172: localf eta$
173: localf jell$
1.4 ! takayama 174: localf frac$
1.3 takayama 175: localf erfc$
1.4 ! takayama 176: localf fouriers$
! 177: localf todf$
1.3 takayama 178: localf f2df$
1.4 ! takayama 179: localf df2big$
1.3 takayama 180: localf compdf$
181: localf fzero$
182: localf fmmx$
1.4 ! takayama 183: localf flim$
1.3 takayama 184: localf fcont$
1.4 ! takayama 185: localf fresidue$
1.1 takayama 186: localf mmulbys$
187: localf appldo$
188: localf appledo$
189: localf muldo$
190: localf adj$
191: localf laplace1$
192: localf laplace$
193: localf mce$
194: localf mc$
195: localf rede$
196: localf ad$
197: localf add$
198: localf vadd$
199: localf addl$
200: localf cotr$
201: localf rcotr$
202: localf muledo$
203: localf mulpdo$
204: localf transpdosub$
205: localf transpdo$
206: localf translpdo$
207: localf rpdiv$
208: localf mygcd$
209: localf mylcm$
210: localf sftpexp$
211: localf applpdo$
212: localf tranlpdo$
213: localf divdo$
214: localf qdo$
215: localf sqrtdo$
216: localf ghg$
217: localf ev4s$
218: localf b2e$
219: localf sftpow$
220: localf sftpowext$
221: localf polinsft$
222: localf pol2sft$
1.3 takayama 223: localf polroots$
1.4 ! takayama 224: localf fctri$
1.1 takayama 225: localf binom$
226: localf expower$
227: localf seriesHG$
1.3 takayama 228: localf seriesMc$
229: localf seriesTaylor$
230: localf evalred$
1.1 takayama 231: localf toeul$
232: localf fromeul$
233: localf sftexp$
234: localf fractrans$
235: localf soldif$
236: localf chkexp$
1.4 ! takayama 237: localf sqrtrat$
1.1 takayama 238: localf getroot$
239: localf expat$
240: localf polbyroot$
241: localf polbyvalue$
242: localf pcoef$
243: localf prehombf$
244: localf prehombfold$
245: localf sub3e$
246: localf fuchs3e$
247: localf okubo3e$
248: localf eosub$
249: localf even4e$
250: localf odd5e$
251: localf extra6e$
252: localf rigid211$
253: localf solpokuboe$
254: localf stoe$
255: localf dform$
256: localf polinvsym$
257: localf polinsym$
258: localf tohomog$
259: localf substblock$
260: localf okuboetos$
261: localf heun$
262: localf fspt$
263: localf abs$
264: localf calc$
265: localf isint$
1.3 takayama 266: localf israt$
1.4 ! takayama 267: localf iscrat$
1.1 takayama 268: localf isalpha$
269: localf isnum$
270: localf isalphanum$
271: localf isvar$
272: localf isyes$
273: localf isall$
1.3 takayama 274: localf iscoef$
275: localf iscombox$
1.1 takayama 276: localf sproot$
277: localf spgen$
278: localf chkspt$
279: localf cterm$
280: localf terms$
281: localf polcut$
282: localf redgrs$
283: localf cutgrs$
284: localf mcgrs$
1.4 ! takayama 285: localf mc2grs$
! 286: localf add2grs$
! 287: localf sub2grs$
! 288: localf join2grs$
1.3 takayama 289: localf delopt$
1.1 takayama 290: localf str_char$
291: localf str_pair$
292: localf str_cut$
293: localf str_str$
1.3 takayama 294: localf str_subst$
295: localf str_times$
296: localf str_tb$
1.4 ! takayama 297: localf strip$
1.3 takayama 298: localf i2hex$
299: localf sjis2jis$
300: localf jis2sjis$
301: localf s2os$
302: localf l2os$
303: localf r2os$
304: localf s2euc$
305: localf s2sjis$
306: localf r2ma$
307: localf evalma$
1.1 takayama 308: localf ssubgrs$
309: localf verb_tex_form$
1.4 ! takayama 310: localf tex_cuteq$
1.1 takayama 311: localf my_tex_form$
1.4 ! takayama 312: localf texket$
1.1 takayama 313: localf smallmattex$
314: localf dviout0$
315: localf myhelp$
316: localf isMs$
317: localf showbyshell$
1.3 takayama 318: localf readcsv$
319: localf tocsv$
1.1 takayama 320: localf getbyshell$
321: localf show$
322: localf dviout$
323: localf rtotex$
324: localf mtotex$
325: localf ltotex$
1.3 takayama 326: localf texbegin$
327: localf texcr$
1.4 ! takayama 328: localf texsp$
1.1 takayama 329: localf getbygrs$
1.4 ! takayama 330: localf mcop$
1.1 takayama 331: localf shiftop$
332: localf conf1sp$
333: localf pgen$
1.3 takayama 334: localf diagm$
1.1 takayama 335: localf mgen$
336: localf madj$
337: localf newbmat$
1.4 ! takayama 338: localf unim$
1.1 takayama 339: localf pfrac$
340: localf cfrac$
341: localf cfrac2n$
1.4 ! takayama 342: localf sqrt2rat$
1.1 takayama 343: localf s2sp$
344: localf sp2grs$
1.4 ! takayama 345: localf fimag$
! 346: localf trig2exp$
1.1 takayama 347: localf intpoly$
1.4 ! takayama 348: localf integrate$
! 349: localf simplog$
! 350: localf fshorter$
! 351: localf isshortneg$
! 352: localf intrat$
1.1 takayama 353: localf powsum$
354: localf bernoulli$
355: localf lft01$
356: localf linfrac01$
357: localf nthmodp$
358: localf issquaremodp$
359: localf rootmodp$
360: localf rabin$
361: localf primroot$
1.4 ! takayama 362: localf varargs$
1.1 takayama 363: localf ptype$
1.4 ! takayama 364: localf pfargs$
1.1 takayama 365: localf average$
366: localf sint$
1.3 takayama 367: localf frac2n$
1.1 takayama 368: localf xyproc$
369: localf xypos$
370: localf xyput$
371: localf xybox$
372: localf xyline$
373: localf xylines$
374: localf xycirc$
375: localf xybezier$
1.3 takayama 376: localf lbezier$
377: localf draw_bezier$
378: localf tobezier$
379: localf velbezier$
1.4 ! takayama 380: localf ptbezier$
! 381: localf cutf$
! 382: localf fsum$
! 383: localf fint$
! 384: localf periodicf$
! 385: localf cmpf$
! 386: localf areabezier$
1.3 takayama 387: localf saveproc$
1.1 takayama 388: localf xygraph$
389: localf xy2graph$
390: localf xyarrow$
1.3 takayama 391: localf xyang$
392: localf xyoval$
393: localf ptcommon$
1.1 takayama 394: localf ptcopy$
395: localf ptaffine$
396: localf ptlattice$
397: localf ptpolygon$
398: localf ptwindow$
1.3 takayama 399: localf ptbbox$
400: localf lninbox$
401: localf ptcombezier$
402: localf ptcombz$
1.1 takayama 403: localf lchange$
404: localf init$
1.3 takayama 405: localf powprimroot$
406: localf distpoint$
407: localf ntable$
408: localf keyin$
1.1 takayama 409: #else
410: extern Muldif.rr$
411: extern TeXEq$
412: extern TeXLim$
413: extern DIROUT$
414: extern DVIOUTL$
415: extern DVIOUTA$
1.3 takayama 416: extern DVIOUTB$
1.1 takayama 417: extern DVIOUTH$
1.3 takayama 418: extern DVIOUTF$
419: static LCOPT$
420: static COLOPT$
421: static LPOPT$
422: static LFOPT$
423: extern TikZ$
1.1 takayama 424: extern ErMsg$
425: extern FLIST$
426: extern IsYes$
1.3 takayama 427: extern XYPrec$
428: extern XYcm$
429: extern TikZ$
430: extern XYLim$
1.4 ! takayama 431: extern Canvas$
1.3 takayama 432: extern ID_PLOT$
1.4 ! takayama 433: extern Rand$
1.1 takayama 434: #endif
1.4 ! takayama 435: static S_Fc,S_Dc,S_Ic,S_Ec,S_EC,S_Lc$
! 436: static S_FDot;
1.1 takayama 437: extern AMSTeX$
1.4 ! takayama 438: Muldif.rr="00160601"$
1.1 takayama 439: AMSTeX=1$
440: TeXEq=5$
441: TeXLim=80$
1.3 takayama 442: TikZ=0$
443: XYcm=0$
444: XYPrec=3$
445: XYLim=4$
1.4 ! takayama 446: Rand=0$
1.1 takayama 447: DIROUT="%HOME%\\tex"$
448: DVIOUTL="%ASIRROOT%\\bin\\risatex0.bat"$
449: DVIOUTA="%ASIRROOT%\\bin\\risatex.bat"$
1.3 takayama 450: DVIOUTB="%ASIRROOT%\\bin\\risatex1%TikZ%.bat"$
1.1 takayama 451: DVIOUTH="start dviout -2 -hyper=0x90 \"%ASIRROOT%\\help\\os_muldif.dvi\" #%LABEL%"$
1.3 takayama 452: DVIOUTF=0$
453: LCOPT=["red","green","blue","yellow","cyan","magenta","black","white","gray"]$
454: COLOPT=[0xff,0xff00,0xff0000,0xffff,0xffff00,0xff00ff,0,0xffffff,0xc0c0c0]$
455: LPOPT=["above","below","left","right"]$
456: LFOPT=["very thin","thin","dotted","dashed"]$
1.4 ! takayama 457: Canvas=[400,400]$
1.3 takayama 458:
1.1 takayama 459: ErMsg = newvect(3,[
460: "irregal argument", /* 0 */
461: "too big size", /* 1 */
462: "irregal option" /* 2 */
463: ])$
464: FLIST=0$
465: IsYes=[]$
1.3 takayama 466: ID_PLOT=-1$
1.1 takayama 467:
468: def erno(N)
469: {
470: /* extern ErMsg; */
471: print(ErMsg[N]);
472: }
473:
474: def chkfun(Fu, Fi)
475: {
476: /* extern FLIST; */
477: /* extern Muldif.rr; */
478:
479: if(type(Fu) <= 1){
480: if(Fu==1)
481: mycat(["Loaded os_muldif Ver.", Muldif.rr, "(Toshio Oshima)"]);
482: else
483: mycat(["Risa/Asir Ver.", version()]);
484: return 1;
485: }
486: if(type(FLIST) < 4)
487: FLIST = flist();
488: if(type(Fu) == 4){
489: for(; Fu != [] ;Fu = cdr(Fu))
490: if(chkfun(car(Fu),Fi) == 0) return 0;
491: return 1;
492: }
493: if(findin(Fu, FLIST) >= 0)
494: return 1;
495: FLIST = flist();
496: if(findin(Fu, FLIST) >= 0)
497: return 1;
498: if(type(Fi)==7){
499: mycat0(["load(\"", Fi,"\") -> try again!\n"],1);
500: load(Fi);
501: }
502: return 0;
503: /*
504: if(type(Fi) == 7)
505: Fi = [Fi];
506: for( ; Fi != []; Fi = cdr(Fi))
507: load(car(Fi));
508: FLIST = flist();
509: return (findin(Fu,FLIST)>=0)?1:0;
510: */
511: }
512:
513: def makev(L)
514: {
515: S = "";
516: Num=getopt(num);
517: while(length(L) > 0){
518: VL = car(L); L = cdr(L);
519: if(type(VL) == 7)
520: S = S+VL;
521: else if(type(VL) == 2 || VL < 10)
522: S = S+rtostr(VL);
523: else if(VL<46 && Num!=1)
524: S = S+asciitostr([VL+87]);
525: else
526: S = S+rtostr(VL);
527: }
528: return strtov(S);
529: }
530:
1.4 ! takayama 531: def makenewv(L)
! 532: {
! 533: if((V=getopt(var))<2) V="z_";
! 534: else if(isvar(V)) V=rtostr(V);
! 535: if(type(N=getopt(num))!=1) N=0;
! 536: Var=vars(L);
! 537: for(Va=Var;Va!=[];Va=cdr(Va))
! 538: if(vtype(car(Va))==2) Var=append(vars(args(car(Va))),Var);
! 539: for(XX=[],I=J=0;;I++){
! 540: X=strtov(V+rtostr(I));
! 541: if(findin(X,Var)<0){
! 542: XX=cons(X,XX);
! 543: if(++J>N) return X;
! 544: else if(J==N) return reverse(XX);
! 545: }
! 546: }
! 547: }
! 548:
1.1 takayama 549: def vweyl(L)
550: {
551: if(type(L) == 4){
552: if(length(L) == 2)
553: return L;
554: else
555: return [L[0],makev(["d",L[0]])];
1.3 takayama 556: }
557: /* else if(type(L)<2) return L; */
558: return [L,makev(["d", L])];
1.1 takayama 559: }
560:
561: def mycat(L)
562: {
563: if(type(L) != 4){
564: print(L);
565: return;
566: }
567: Opt = getopt(delim);
568: Del = (type(Opt) >= 0)?Opt:" ";
569: Opt = getopt(cr);
570: CR = (type(Opt) >= 0)?0:1;
571: while(L != []){
572: if(Do==1)
573: print(Del,0);
574: print(car(L),0);
575: L=cdr(L);
576: Do = 1;
577: }
578: if(CR) print("");
579: }
580:
581: def mycat0(L,T)
582: {
583: Opt = getopt(delim);
584: Del = (type(Opt) >= 0)?Opt:"";
585: while(L != []){
586: if(Do==1)
587: print(Del,0);
588: print(car(L),0);
589: L=cdr(L);
590: Do = 1;
591: }
592: if(T) print("");
593: }
594:
595: def findin(M,L)
596: {
597: if(type(L)==4){
598: for(I = 0; L != []; L = cdr(L), I++)
599: if(car(L) == M) return I;
600: }else if(type(L)==5){
601: K=length(L);
602: for(I = 0; I < K; I++)
603: if(L[I] == M) return I;
604: }else return -2;
605: return -1;
606: }
607:
608: def countin(S,M,L)
609: {
610: if(type(L)==4){
611: for(N=0; L!=[]; L=cdr(L))
612: if(car(L)>=S && car(L)<=M) N++;
613: }else if(type(L)==5){
614: K=length(L);
615: for(I = 0; I < K; I++)
616: if(L[I]>=S && L[I]<=M) N++;
617: }else return -2;
618: return N;
619: }
620:
621: def mycoef(P,N,X)
622: {
623: if(type(P) < 3)
624: return coef(P,N,X);
625: if(type(P) >= 4)
1.3 takayama 626: #ifdef USEMODULE
627: return map(os_md.mycoef,P,N,X);
628: #else
1.1 takayama 629: return map(mycoef,P,N,X);
1.3 takayama 630: #endif
1.1 takayama 631: if(deg(dn(P), X) > 0){
632: P = red(P);
633: if(deg(dn(P), X) > 0)
634: return 0;
635: }
636: return red(coef(nm(P),N,X)/dn(P));
637: }
638:
639: def mydiff(P,X)
640: {
641: if(X == 0)
642: return 0;
643: if(type(P) < 3)
644: return diff(P,X);
645: if(type(P) >= 4)
1.3 takayama 646: #ifdef USEMODULE
647: return map(os_md.mydiff,P,X);
648: #else
1.1 takayama 649: return map(mydiff,P,X);
1.3 takayama 650: #endif
1.1 takayama 651: if(deg(dn(P),X) == 0)
652: return red(diff(nm(P),X)/dn(P));
653: return red(diff(P,X));
654: }
655:
656: def myediff(P,X)
657: {
658: if(X == 0)
659: return 0;
660: if(type(P) < 3)
661: return ediff(P,X);
662: if(type(P) >= 4)
1.3 takayama 663: #ifdef USEMODULE
664: return map(os_md.myediff,P,X);
665: #else
1.1 takayama 666: return map(myediff,P,X);
1.3 takayama 667: #endif
1.1 takayama 668: if(deg(dn(P),X) == 0)
669: return red(ediff(nm(P),X)/dn(P));
670: return red(X*diff(P,X));
671: }
672:
673: def m2l(M)
674: {
675: if(type(M) < 4)
676: return [M];
677: if(type(M) == 4){
678: if(type(car(M))==4 && getopt(flat)==1){
679: for(MM = []; M!=[]; M=cdr(M))
680: MM = append(MM,car(M));
681: return MM;
682: }
683: return M;
684: }
685: if(type(M) == 5)
686: return vtol(M);
687: S = size(M);
688: for(MM = [], I = S[0]-1; I >= 0; I--)
689: MM = append(vtol(M[I]), MM);
690: return MM;
691: }
692:
693: def mydeg(P,X)
694: {
695: if(type(P) < 3)
696: return deg(P,X);
697: II = -1;
698: Opt = getopt(opt);
699: if(type(P) >= 4){
700: S=(type(P) == 6)?size(P)[0]:0;
701: P = m2l(P);
702: for(I = 0, Deg = -3; P != []; P = cdr(P), I++){
703: if( (DT = mydeg(car(P),X)) == -2)
704: return -2;
705: if(DT > Deg){
706: Deg = DT;
707: II = I;
708: }
709: }
710: return (Opt==1)?([Deg,(S==0)?II:[idiv(II,S),irem(II,S)]]):Deg;
711: }
712: P = red(P);
713: if(deg(dn(P),X) == 0)
714: return deg(nm(P),X);
715: return -2;
716: }
717:
1.4 ! takayama 718: def pfctr(P,X)
! 719: {
! 720: P=red(P);
! 721: if((T=ptype(P,X))>3) return [];
! 722: if(T==3){
! 723: G=pfctr(dn(P),X);
! 724: F=pfctr(nm(P),X);
! 725: R=[[car(F)[0]/car(G)[0],1]];
! 726: for(F=cdr(F);F!=[];F=cdr(F)) R=cons(car(F),R);
! 727: for(G=cdr(G);G!=[];G=cdr(G)) R=cons([car(G)[0],-car(G)[1]],R);
! 728: return reverse(R);
! 729: }
! 730: F=fctr(nm(P));
! 731: for(R=[],C=1/dn(P);F!=[];F=cdr(F))
! 732: if(mydeg(car(F)[0],X)>0) R=cons(car(F),R);
! 733: else C*=car(F)[0]^car(F)[1];
! 734: return cons([C,1],reverse(R));
! 735: }
! 736:
1.1 takayama 737: def mymindeg(P,X)
738: {
739: if(type(P) < 3)
740: return mindeg(P,X);
1.3 takayama 741: II = -1;T=60;
1.1 takayama 742: Opt = getopt(opt);
743: if(type(P) >= 4){
744: S=(type(P) == 6)?size(P)[0]:0;
745: P = m2l(P);
746: for(I = 0, Deg = -3; P != []; P = cdr(P), I++){
747: if(car(P) == 0)
748: continue;
749: if( (DT = mydeg(car(P),X)) == -2)
750: return -2;
751: if(DT < Deg || Deg == -3){
1.3 takayama 752: if(DT==0){
753: if(type(car(P))>=T) continue;
754: T=type(car(P));
755: }
1.1 takayama 756: Deg = DT;
757: II = I;
758: }
759: }
760: return (Opt==1)?([Deg,(S==0)?II:[idiv(II,S),irem(II,S)]]):Deg;
761: }
762: P = red(P);
763: if(deg(dn(P),X) == 0)
764: return mindeg(nm(P),X);
765: return -2;
766: }
767:
768: def m1div(M,N,L)
769: {
770: L = (type(L) <= 3)?[0,L]:vweyl[L];
771: DX = L[1]; X = L[0];
772: if(mydeg(N,DX) != 0)
773: return 0;
774: DD = mydeg(M,DX);
775: MM = M;
776: while( (Deg=mydeg(MM,DX)) > 0){
777: MC = mycoef(MM,Deg,DX)*DX^(Deg-1);
778: MS = radd(MC, MS);
779: MM = radd(MM, muldo(MC,radd(-DX,N),L));
780: }
781: return [MM, MS];
782: }
783:
784:
785: def mulsubst(F,L)
786: {
787: N = length(L);
788: if(N == 0)
789: return F;
790: if(type(L[0])!=4) L=[L];
1.4 ! takayama 791: if(getopt(inv)==1){
! 792: for(R=[];L!=[];L=cdr(L)) R=cons([car(L)[1],car(L)[0]],R);
! 793: L=reverse(R);
! 794: }
1.1 takayama 795: if(length(L)==1) return mysubst(F,L);
796: L1 = newvect(N);
797: for(J = 0; J < N ; J++)
798: L1[J] = uc();
799: L2 = newvect(N);
800: for(J = 0; J < N; J++){
801: S = L[J][1];
802: for(I = 0; I < N; I++)
803: S = mysubst(S,[L[I][0],L1[I]]);
804: L2[J] = S;
805: }
806: for(J = 0; J < N; J++)
807: F = mysubst(F, [L[J][0],L2[J]]);
808: for(J = 0; J < N; J++)
809: F = mysubst(F, [L1[J],L[J][0]]);
810: return F;
811: }
812:
813: def cmpsimple(P,Q)
814: {
815: T = getopt(comp);
816: if(P == Q)
817: return 0;
818: D = 0;
819: if(type(T) < 0)
820: T = 7;
821: if(iand(T,1))
822: D = length(vars(P)) - length(vars(Q));
823: if(!D && iand(T,2))
824: D = nmono(P) - nmono(Q);
825: if(!D && iand(T,4))
826: D = str_len(rtostr(P)) - str_len(rtostr(Q));
827: if(!D){
828: if(P > Q) D++;
829: else D--;
830: }
831: return D;
832: }
833:
834: def simplify(P,L,T)
835: {
836: if(type(P) > 3)
1.3 takayama 837: #ifdef USEMODULE
838: return map(os_md.simplify,P,L,T);
839: #else
1.1 takayama 840: return map(simplify,P,L,T);
1.3 takayama 841: #endif
1.1 takayama 842: if(type(L[0]) == 4){
843: if(length(L[0]) > 1)
1.3 takayama 844: #if USEMODULE
845: return fmult(os_md.simplify,P,L,[T]);
846: #else
1.1 takayama 847: return fmult(simplify,P,L,[T]);
1.3 takayama 848: #endif
1.1 takayama 849: L = L[0];
850: }
851: if(type(Var=getopt(var)) == 4 && Var!=[]){
852: if(type(P) == 3)
853: return simplify(nm(P),P,L,T|var=Var)/simplify(dn(P),P,L,T|var=Var);
854: V = car(Var);
855: if((I = mydeg(P,V)) > 0){
856: Var = cdr(Var);
857: for(Q=0; I>=0 ; I--)
858: Q += simplify(mycoef(P,I,V), L, T|var=Var)*V^I;
859: return Q;
860: }
861: }
862: if(length(L) == 1){
863: L = car(L);
864: for(V = vars(L); V != []; V = cdr(V)){
865: VT = car(V);
866: if(deg(L,VT) != 1) continue;
867: P = simplify(P, [VT, -red(coef(L,0,VT)/coef(L,1,VT))], T);
868: }
869: return P;
870: }
871: Q = mysubst(P,[L[0],L[1]]);
872: return (cmpsimple(P,Q|comp=T) <= 0)?P:Q;
873: }
874:
875: def monotos(P)
876: {
877: if(nmono(P) <= 1)
878: return rtostr(P);
879: return "("+rtostr(P)+")";
880: }
881:
1.4 ! takayama 882:
1.1 takayama 883: def monototex(P)
884: {
1.4 ! takayama 885: Q=my_tex_form(P);
! 886: if(nmono(P)<2 && (getopt(minus)!=1 || str_str(Q,"-"|top=0,end=0)<0))
! 887: return Q;
! 888: return "("+Q+")";
! 889: }
! 890:
! 891: def minustos(S)
! 892: {
! 893: if(str_str(S,"-"|top=0,end=0)<0) return S;
! 894: return "("+S+")";
1.1 takayama 895: }
896:
897: def vnext(V)
898: {
899: S = length(V);
900: for(I = S-1; I > 0; I--){
901: if(V[I-1] < V[I]){
902: V0 = V[I-1];
903: for(J = I+1; J < S; J++)
904: if(V0 >= V[J]) break;
905: V[I-1] = V[--J];
906: V[J] = V0;
907: for(J = S-1; I < J; I++, J--){
908: V0 = V[I];
909: V[I] = V[J];
910: V[J] = V0;
911: }
912: return 1;
913: }
914: }
915: return 0;
916: }
917:
918: def ldict(N, M)
919: {
920: Opt = getopt(opt);
921: R = S = [];
922: for(I = 2; N > 0; I++){
923: R = cons(irem(N,I), R);
924: N = idiv(N,I);
925: }
926: L = LL = length(R);
927: T=newvect(LL+1);
928: while(L-- > 0){
929: V = car(R); R = cdr(R);
930: for(I = J = 0; J <= V ; I++){
931: if(T[I] == 0)
932: J++;
933: }
934: T[I-1] = 1;
935: S = cons(LL-I+1, S);
936: }
937: for(I = 0; I <= LL; I++){
938: if(T[I] == 0){
939: S = cons(LL-I, S);
940: break;
941: }
942: }
943: if(M == 0)
944: return S;
945: if(M <= LL){
946: print("too small size");
947: return 0;
948: }
949: T = [];
950: for(I = --M; I > LL; I--)
951: T = cons(I,T);
952: S = append(S,T);
953: if(Opt == 2 || Opt == 3)
954: S = reverse(S);
955: if(Opt != 1 && Opt != 3)
956: return S;
957: for(T = []; S != []; S = cdr(S))
958: T = cons(M-car(S),T);
959: return T;
960: }
961:
962: def ndict(L)
963: {
964: Opt = getopt(opt);
965: R = [];
966: if(Opt != 1 && Opt != 2)
967: L = reverse(L);
968: T = (Opt == 1 || Opt == 3)?1:0;
969: for( ; L != []; L = cdr(L)){
970: for(I = 0, V = car(L), LT = cdr(L); LT != []; LT = cdr(LT))
971: if(T == 0){
972: if(V < car(LT)) I++;
973: }else if (V > car(LT)) I++;
974: R = cons(I, R);
975: }
976: R = reverse(R);
977: for(V = 0, I = length(R); I > 0; R = cdr(R), I--)
978: V = V*I + car(R);
979: return V;
980: }
981:
982:
983: def nextsub(L,N)
984: {
985: if(type(L) == 1){
986: for(LL = [], I = L-1; I >= 0; I--)
987: LL = cons(I,LL);
988: return LL;
989: }
990: M = length(L = ltov(L));
991: K = N-M;
992: for(I = M-1; I >= 0; I--)
993: if(L[I] < I+K) break;
994: if(I < 0)
995: return 0;
996: for(J = L[I]+1; I < M; I++, J++)
997: L[I] = J;
998: return vtol(L);
999: }
1000:
1001: def nextpart(L)
1002: {
1003: if(car(L) <= 1)
1004: return 0;
1005: for(I = 0, L = reverse(L); car(L) == 1; L=cdr(L))
1006: I++;
1007: I += (K = car(L));
1008: R = irem(I,--K);
1009: R = (R==0)?[]:[R];
1010: for(J = idiv(I,K); J > 0; J--)
1011: R = cons(K,R);
1012: L = cdr(L);
1013: while(L!=[]){
1014: R = cons(car(L), R);
1015: L = cdr(L);
1016: }
1017: return R;
1018: }
1019:
1020: def transpart(L)
1021: {
1022: L = reverse(L);
1023: for(I=1, R=[]; L!= []; I++){
1024: R = cons(length(L), R);
1025: while(L != [] && car(L) <= I)
1026: L = cdr(L);
1027: }
1028: return reverse(R);
1029: }
1030:
1031: def trpos(A,B,N)
1032: {
1033: S = newvect(N);
1034: for(I = 0; I < N; I++)
1035: S[I]=(I==A)?B:((I==B)?A:I);
1036: return S;
1037: }
1038:
1039: def sprod(S,T)
1040: {
1041: L = length(S);
1042: V = newvect(L);
1043: while(--L >= 0)
1044: V[L] = S[T[L]];
1045: return V;
1046: }
1047:
1048: def sinv(S)
1049: {
1050: L = length(S);
1051: V = newvect(L);
1052: while(--L >= 0)
1053: V[S[L]] = L;
1054: return V;
1055: }
1056:
1057: def slen(S)
1058: {
1059: L = length(S);
1060: for(V = 0, J = 2; J < L; i++){
1061: for(I = 0; I < J; I++)
1062: if(S[I] > S[J]) V++;
1063: }
1064: return V;
1065: }
1066:
1067: def sord(W,V)
1068: {
1069: L = length(W);
1070: W0 = nevect(L);
1071: V0 = newvect(L);
1072: for(I = F = C = 0; I < L; I++){
1073: C = 0;
1074: if( (W1 = W[I]) > (V1 = V[I]) ){
1075: if(F < 0) C = 1;
1076: else if(F==0) F = 1;
1077: }else if(W1 < V1){
1078: if(F > 0) C = 1;
1079: else if(F==0) F = -1;
1080: }
1081: for(J = I;--J >= 0 && W0[J] > W1; ) W0[J+1] = W0[J];
1082: W0[J+1] = W1;
1083: for(J = I;--J >= 0 && V0[J] > V1; ) V0[J+1] = V0[J];
1084: V0[J+1] = V1;
1085: if(C){
1086: for(J = I; J >= 0; J--){
1087: if((W1=W0[J]) == (V1=V0[J])) continue;
1088: if(W1 > V1){
1089: if(F < 0) return 2;
1090: }
1091: else if(F > 0) return 2;
1092: }
1093: }
1094: }
1095: return F;
1096: }
1097:
1098: def vprod(V1,V2)
1099: {
1100: for(R = 0, I = length(V1)-1; I >= 0; I--)
1101: R = radd(R, rmul(V1[I], V2[I]));
1102: return R;
1103: }
1104:
1.3 takayama 1105: def dnorm(V)
1106: {
1107: if(type(V)<2) return dabs(V);
1108: R=0;
1109: if(type(V)!=4)
1110: for (I = length(V)-1; I >= 0; I--) R+= V[I]^2;
1111: else{
1112: if(type(V[0])>3){
1113: V=ltov(V[0])-ltov(V[1]);
1114: return dnorm(V);
1115: }
1116: for(;V!=[]; V=cdr(V)) R+=car(V)^2;
1117: }
1118: return dsqrt(R);
1119: }
1120:
1121: def dvprod(V1,V2)
1122: {
1123: if(type(V1)<2) return V1*V2;
1124: R=0;
1125: if(type(V1)!=4)
1126: for(I = length(V1)-1; I >= 0; I--)
1127: R += V1[I]*V2[I];
1128: else{
1129: for(; V1!=[]; V1=cdr(V1),V2=cdr(V2))
1130: R+=car(V1)*car(V2);
1131: }
1132: return R;
1133: }
1134:
1135: def dvangle(V1,V2)
1136: {
1137: if(V2==0 && type(V1)==4 && length(V1)==3 &&
1138: (type(V1[0])==4 || type(V1[0])==5 || type(V1[1])==4 || type(V1[1])==5 ||
1139: type(V1[2])==4 || type(V1[2])==5) ){
1140: if(V1[0]==0 || V1[1]==0 || V1[2]==0) return 1;
1141: PV2=V1[1];
1142: if(type(PV2)==4){
1143: PV2=ltov(PV2);
1144: return dvangle(PV2-ltov(V1[0]),ltov(V1[2])-PV2);
1145: }else
1146: return dvangle(PV2-V1[0],V1[2]-PV2);
1147: }
1148: if((L1=dnorm(V1))==0 || (L2=dnorm(V2))==0) return 1;
1149: return dvprod(V1,V2)/(L1*L2);
1150: }
1151:
1.1 takayama 1152: def mulseries(V1,V2)
1153: {
1154: L = length(V1);
1155: if(size(V2) < L)
1156: L = size(V2);
1157: VV = newvect(L);
1158: for(J = 0; J < L; J++){
1159: for(K = R = 0; K <= J; K++)
1160: R = radd(R,rmul(V1[K],V2[J-K]));
1161: VV[J] = R;
1162: }
1163: return VV;
1164: }
1165:
1166: def pluspower(P,V,N,M)
1167: {
1168: RR = 1;
1169: for(K = R = 1; K < M-1; I++){
1170: R = R*(N-K+1)*P/K;
1171: RR = radd(RR,R);
1172: }
1173: VV = newvect(M);
1174: for(K = 0; K < M-1; K++)
1175: VV[K] = red(mycoef(RR,K,V));
1176: }
1177:
1178: def vtozv(V)
1179: {
1180: if(type(V)<4) V=newvect(1,[V]);
1181: S = length(V);
1182: VV = newvect(S);
1183: Lcm = 1;
1184: for(K = 0; K < S; K++){
1185: VV[K] = red(V[K]);
1186: Lcm = lcm(Lcm,dn(VV[K]));
1187: C = ptozp(nm(VV[K])|factor=0);
1188: if(K == 0){
1189: Dn = dn(C[1]);
1190: Nm = nm(C[1]);
1191: PNm = nm(C[0]);
1192: }else{
1193: Dn = ilcm(Dn,dn(C[1]));
1194: Nm = igcd(Nm,nm(C[1]));
1195: PNm = gcd(PNm,nm(C[0]));
1196: }
1197: }
1.4 ! takayama 1198: if(!(M=Nm*PNm)) return [VV,0];
! 1199: Mul = (Lcm*Dn)/M;
1.1 takayama 1200: for(K = 0; K < S; K++)
1201: VV[K] = rmul(VV[K],Mul);
1202: return [VV,Mul];
1203: }
1204:
1205: def dupmat(M)
1206: {
1207: if(type(M) == 6){
1208: Size = size(M);
1209: MM = newmat(Size[0],Size[1]);
1210: for(I = 0; I < Size[0]; I++){
1211: for(J = 0; J < Size[1]; J++)
1212: MM[I][J] = M[I][J];
1213: }
1214: return MM;
1215: }
1216: if(type(M) == 5)
1217: return ltov(vtol(M));
1218: return M;
1219: }
1220:
1221: def matrtop(M)
1222: {
1223: S = size(M);
1224: MM = dupmat(M);
1225: Lcm = newvect(S[0]);
1226: for(J = 0; J < S[0]; J++){
1227: U = vtozv(M[J]);
1228: for(K = -1, I = 0; I < S[1]; I++)
1229: MM[J][I] = U[0][I];
1230: Lcm[J] = U[1];
1231: }
1232: return [MM,Lcm];
1233: }
1234:
1.3 takayama 1235: def mytrace(M)
1236: {
1237: S=size(M);
1238: if(S[0]!=S[1]) return 0;
1239: for(I=V=0; I<S[0]; I++){
1240: V+=M[I][I];
1241: }
1242: return V;
1243: }
1244:
1.1 takayama 1245: def mydet(M)
1246: {
1247: MM = matrtop(M);
1248: if(type(MM[0]) == 6){
1249: S = size(M);
1250: for(Dn = 1, I = 0; I < S[0]; I++)
1251: Dn *= MM[1][I];
1.4 ! takayama 1252: return (!Dn)?0:red(det(MM[0])/Dn);
1.1 takayama 1253: }
1254: }
1255:
1256: def mperm(M,P,Q)
1257: {
1258: if(type(M) == 6){
1259: S = size(M);
1260: if(type(P) <= 1)
1261: P=(P==1)?Q:trpos(0,0,S[0]);
1262: if(type(P) > 3 && type(P[0]) >= 4)
1263: P = trpos(P[0][0],P[0][1],S[0]);
1264: else if(type(P) == 4){
1265: if(length(P)==2 && type(P[1])==4){
1266: P0=P[0];P1=car(P[1]);P=newvect(P1);
1267: for(I=0;I<P1;I++) P[I]=P0+I;
1268: }else P = ltov(P);
1269: }
1270: if(type(Q) <= 1)
1271: Q=(Q==1)?P:trpos(0,0,S[1]);
1272: if(type(Q) > 3 && type(Q[0]) >= 4)
1273: Q = trpos(Q[0][0],Q[0][1],S[1]);
1274: if(type(Q) == 4){
1275: if(length(Q)==2 && type(Q[1])==4){
1276: P0=Q[0];P1=car(Q[1]);Q=newvect(P1);
1277: for(I=0;I<P1;I++) Q[I]=P0+I;
1278: }else Q = ltov(Q);
1279: }
1280: MM = newmat(S0=length(P),S1=length(Q));
1281: for(I = 0; I < S0; I++){
1282: MMI = MM[I]; MPI = M[P[I]];
1283: for(J = 0; J < S1; J++)
1284: MMI[J] = MPI[Q[J]];
1285: }
1286: return MM;
1287: }
1288: if((type(M) == 5 || type(M) == 4) && type(P) >= 4){
1289: if(length(P) == 1 && type(car(P)) == 4)
1290: P = trpos(car(P)[0],car(P)[1],length(M));
1291: MM = newvect(S = length(P));
1292: for(I = 0; I < S; I++)
1293: MM[I] = M[P[I]];
1294: if(type(M) == 4)
1295: MM = vtol(MM);
1296: return MM;
1297: }
1298: return M;
1299: }
1300:
1301: def mtranspose(M)
1302: {
1303: if(type(M)==4){
1304: MV=ltov(M);
1305: II=length(MV);
1306: for(I=L=0; I<II; I++){
1307: if(type(MV[I])!=4) return M;
1308: MV[I]=ltov(MV[I]);
1309: }
1310: for(R=[],J=0; ;J++){
1311: for(T=[],I=F=0; I<II; I++){
1312: if(length(MV[I])>J){
1313: F=1;
1314: T=cons(MV[I][J],T);
1315: }
1316: }
1317: if(F==0) return reverse(R);
1318: if(F==1) R=cons(reverse(T),R);
1319: }
1320: }
1321: if(type(M) != 6)
1322: return M;
1323: S = size(M);
1324: MM = newmat(S[1],S[0]);
1325: for(I = 0; I < S[0]; I++){
1326: for(J = 0; J < S[1]; J++)
1327: MM[J][I] = M[I][J];
1328: }
1329: return MM;
1330: }
1331:
1332: def mtoupper(MM, F)
1333: {
1.3 takayama 1334: TeXs=["\\ -=\\ ","\\ +=\\ "];
1335: Lins=[" -= line"," += line"];
1336: Assume=["If","Assume"];
1337: if(type(St = getopt(step))!=1) St=0;
1.1 takayama 1338: Opt = getopt(opt);
1339: if(type(Opt)!=1) Opt=0;
1340: TeX=getopt(dviout);
1.3 takayama 1341: if(type(Tab=getopt(tab))!=1 && Tab!=0) Tab=2;
1.1 takayama 1342: Line="\\text{line}";
1.3 takayama 1343: if(type(TeX)!=1 || !St) TeX=0;
1.1 takayama 1344: Size = size(MM);
1.3 takayama 1345: if(F==-1){
1.1 takayama 1346: M = newmat(Size[0], Size[1]+1);
1347: for(I = 0; I < Size[0]; I++){
1348: for(J = 0; J < Size[1]; J++)
1349: M[I][J] = MM[I][J];
1350: M[I][Size[1]] = zz^I;
1351: }
1352: Size = size(M);
1353: F = 1;
1354: }else if(F<0){
1355: F=Size[0];
1356: M = newbmat(1,2,[[MM,mgen(F,0,[1],0)]]);
1357: Size=[Size[0],F+Size[1]];
1358: }else
1359: M = dupmat(MM);
1.3 takayama 1360: if(St){
1.1 takayama 1361: if(TeX) Lout=[[dupmat(M)]];
1362: else mycat0([M,"\n\n"],0);
1363: }
1364: Top="";
1365: if(Opt>3){
1366: for(I=Opt; I>4; I--)
1.3 takayama 1367: Top+=(TeX)?"\\ ":" ";
1.1 takayama 1368: }
1.3 takayama 1369: PC=IF=1;
1.1 takayama 1370: for(K = JJ = 0; K < Size[1] - F; K++){
1371: for(J = JJ; J < Size[0]; J++){
1.3 takayama 1372: if(M[J][K] != 0){ /* search simpler element */
1.1 takayama 1373: if(Opt>2 && (Mul=M[J][K])!=1){
1374: for(FF=0,JT=J; JT<Size[0]; JT++){
1.3 takayama 1375: if((Val=M[JT][K])==1){ /* 1 */
1376: Mul=1;J=JT; break;
1.1 takayama 1377: }
1378: if(Val==0 || type(Val)>type(Mul)) continue;
1379: if(type(Val)<type(Mul) || (Val==-1 && Mul!=-1)){
1.3 takayama 1380: Mul=Val; J=JT; /* smaller type */
1.1 takayama 1381: }
1.3 takayama 1382: else if(Opt>3){
1383: if(isint(Val)==1){ /* integer elememt */
1384: if(isint(Mul)!=1){
1385: Mul=Val; J=JT; /* integer */
1386: }
1387: if(FF<3||(FF==3&&Val>0)){
1388: for(JK=K+1;;){
1389: if(JK>=Size[1]-F){
1390: J=JT;
1391: FF=((Mul=Val)>0)?4:3;
1392: break; /* divisible int => 4: pos_int 3: neg_int */
1393: }
1394: if(isint(M[JT][JK++]/Val)!=1) break;
1395: }
1396: }
1397: }else if(!FF){
1398: for(JK=K+1; JK<Size[1]-F; JK++){
1399: if(isint(M[JT][JK]/Val)!=1) break;
1400: J=JT; FF=1; /* divisible => 1: non integer */
1.1 takayama 1401: }
1402: }
1403: }
1404: }
1.3 takayama 1405: if(FF==0 && Opt>3 && Mul!=1 && Mul!=-1){ /* FF > 0 => divisible */
1406: for(FF=0,J0=J; J0<Size[0]-1 && FF!=9; J0++){
1.1 takayama 1407: VV0=M[J0][K];
1408: if(VV0==0 || isint(VV0)==0) continue;
1.3 takayama 1409: for(J1=J0+1;J1<Size[0] && FF!=9; J1++){
1.1 takayama 1410: VV1=M[J1][K];
1411: if(VV1==0 || isint(VV1)==0) continue;
1.3 takayama 1412: for(C=FT=0,V0=VV0,V1=VV1; C<2 && FF!=10; C++,V1=V0,V0=VV1){
1.1 takayama 1413: for(CC=0,RC=ceil(V0/V1);CC<2;CC++,RC--){
1414: if((CD=V0-RC*V1)==0 && (RC==1 || RC==-1)){
1.3 takayama 1415: FT=1; FF=10; /* 10: vanish by +- */
1.1 takayama 1416: }else if(CD==1){
1.3 takayama 1417: FV=(vars(M[J0])==[]&&vars(M[J1])==[])?1:0;
1418: if((RC==1 || RC==-1) && FF<8+FV){
1419: FT=1; FF=8+FV; /* 8/9: 1 by +- */
1420: }else if(FF<6+VF){
1421: FT=1; FF=6+FV; /* 6/7: 1 by times */
1.1 takayama 1422: }
1423: }else if(CD==-1){
1.3 takayama 1424: FV=(vars(M[J0])==[]&&vars(M[J1])==[])?1:0;
1425: if((RC==1 || RC==-1) && FF<4+FV){
1426: FT=1; FF=4+FV; /* 4/5: 1 by +- */
1427: }else if(FF<2+VF){
1428: FT=1; FF=2+FV; /* 2/3: 1 by times */
1.1 takayama 1429: }
1430: }
1431: if(FT==1){
1432: FT=0; KRC=RC;
1433: if(C==0){
1434: KJ0=J0; KJ1=J1;
1435: }else{
1436: KJ0=J1; KJ1=J0;
1437: }
1438: }
1439: }
1440: }
1441: }
1442: }
1443: if(FF>0){
1444: for(I=K;I<Size[1];I++)
1445: M[KJ0][I]=radd(M[KJ0][I],rmul(M[KJ1][I],-KRC));
1.3 takayama 1446: if(KRS<0){
1447: KRS=-KRS;Sgn=1;
1448: }else
1449: Sgn=0;
1450: if(St){
1.1 takayama 1451: if(TeX){
1452: if(KRC==1)
1.3 takayama 1453: Lout=cons([Top+"\\xrightarrow{", Line,KJ0+1,TeXs[Sgn],
1.1 takayama 1454: Line,KJ1+1,"}",dupmat(M)],Lout);
1455: else
1.3 takayama 1456: Lout=cons([Top+"\\xrightarrow{", Line,KJ0+1,TeXs[Sgn],
1457: Line,KJ1+1,"\\times\\left(",KRC,"\\right)}",
1.1 takayama 1458: dupmat(M)],Lout);
1.3 takayama 1459:
1.1 takayama 1460: }else{
1461: if(KRC==1)
1.3 takayama 1462: mycat([Top+"line",KJ0+1,Lins[Sgn],KJ1+1,"\n",M,"\n"]); else
1463: mycat([Top+"line",KJ0+1,Lins[Sgn],KJ1+1," * (",KRC,")\n",M,"\n"]);
1.1 takayama 1464: }
1465: }
1466: Mul=M[KJ0][K]; J=KJ0;
1.3 takayama 1467: if(FF==10){
1.1 takayama 1468: J--; continue;
1469: }
1470: }
1471: }
1.3 takayama 1472: }
1473: /* a parameter Var */
1474: Var=0;
1475: if(St && Opt>4 && length(Var=vars(nm(M[J][K])))==1){
1476: J0=J;Jv=mydeg(nm(M[J0][K]),car(Var));
1477: for(I=JJ;I<Size[0]; I++){
1478: if((MIK=M[I][K])==0) continue;
1479: if((T=vars(MIK=nm(MIK)))==[]){ /* 1/poly */
1480: J=I;Var=[]; break;
1481: }
1482: if(length(T)>1) continue;
1483: if(mydeg(MIK,T[0])<Jv){
1484: J0=I;Jv=mydeg(MIK);Var=T; /* search minimal degree */
1485: }
1486: }
1487: if(length(Var)==1){
1488: Var=car(Var);
1489: Q=nm(M[J0][K]);
1490: for(I=JJ; I<Size[0]; I++){
1491: if(I==J0 || mydeg(nm(M[I][K]),Var)<0) continue;
1492: T=rpdiv(nm(M[I][K]),Q,Var);
1493: if(T[0]!=0 && (vars(T)==[] || vars(T)==[Var])) break; /* dec. deg */
1494: }
1495: }
1496: }
1497: if(type(Var)==2){ /* 1 variable */
1498: if(I==Size[0]){
1499: for(QF=0,Q0=1,QR=getroot(Q,Var|mult=1);QR!=[];QR=cdr(QR)){
1500: if(deg(T=QR[0][1],Var)>0){
1501: QF=1;Q0*=T; continue;
1502: }
1503: if(subst(PC,Var,T)==0) continue;
1504: Q0*=(Var-(T=QR[0][1]));
1505: if(type(T)<2){
1506: M0=subst(M,Var,T);
1507: if(TeX){
1508: Lout=cons(["\\hspace{",Tab*(St-3)-1,"mm}\\text{If }",
1509: Var,"=",T,","] ,Lout);
1510: Lout=append(mtoupper(M0,F|step=St+1,opt=Opt,dviout=-2,tab=Tab),Lout);
1511: }else{
1512: mycat([str_times(" ",St-1)+"If",Var,"=",T,","]);
1513: mtoupper(M0,F|step=St+1,opt=Opt);
1.1 takayama 1514: }
1515: }
1516: }
1.3 takayama 1517: if(Q0!=1){
1518: if(TeX)
1519: Lout=cons(["\\hspace{",Tab*(St-3)-1,"mm}\\text{"+Assume[QF]+" }",
1520: Q0/=fctr(Q0)[0][0],"\\ne0,"],Lout);
1521: else
1522: mycat([str_times(" ",St-1)+Assume[QF],Q0,"!=0,"]);
1523: PC*=Q0;
1.1 takayama 1524: }
1.3 takayama 1525: IF=0;St++;
1526: }else{
1527: KRC=-red((T[2]*dn(M[J0][K]))/(T[1]*dn(M[I][K])));
1528: for(II=K;II<Size[1];II++)
1529: M[I][II]=radd(M[I][II],rmul(M[J0][II],KRC));
1530: if(TeX)
1531: Lout=cons([Top+"\\xrightarrow{", Line,I+1,"\\ +=\\ ",Line,
1532: J0+1,"\\times\\left(",KRC,"\\right)}",dupmat(M)],Lout);
1533: else
1534: mycat([Top+"line",I+1,"+=",Line,J0+1," * (",KRC,")\n",M,"\n"]);
1535: J=JJ-1;
1536: continue;
1.1 takayama 1537: }
1538: }
1539: if(J != JJ){
1540: for(I = K; I < Size[1]; I++){
1541: Temp = M[JJ][I];
1542: M[JJ][I] = M[J][I];
1543: M[J][I] = (Opt>=2)?Temp:-Temp;
1544: }
1.3 takayama 1545: if(St){
1.1 takayama 1546: if(TeX)
1.3 takayama 1547: Lout=cons([Top+"\\xrightarrow{",Line,JJ+1,"\\ \\leftrightarrow\\ ",
1548: Line,J+1,"}",dupmat(M)],Lout);
1.1 takayama 1549: else
1550: mycat0([Top+"line",JJ+1," <-> line",J+1,"\n",M,"\n\n"],0);
1551: }
1552: }
1.3 takayama 1553: /* Assume PC != 0 */
1.1 takayama 1554: if(Opt>1){
1.3 takayama 1555: Mul = M[JJ][K];
1556: if(Opt > 5 && St && IF && (Var=vars(MIK=nm(Mul)))!=[]){
1557: TF=fctr(MIK);
1558: for(FF=0,Q0=1,TP=cdr(TF);TP!=[];TP=cdr(TP)){
1559: if(type(dn(red(PC/(TP0=car(car(TP))))))<2) continue; /* divisible */
1560: Q0*=TP0;
1561: for(Var=vars(TP0);Var!=[];Var=cdr(Var)){
1562: if(mydeg(TP0,X=car(Var))==1 && type(dn(red(PC/mycoef(TP0,1,X))))<2){
1563: /* TP0=A*X+B with non-vanishing A */
1564: T=red(-mycoef(TP0,0,X)/mycoef(TP0,1,X));
1565: M0=mysubst(M,[X,T]);
1566: if(TeX){
1567: Lout=cons(["\\hspace{",Tab*(St-3)-1,"mm}\\text{If }",
1568: X,"=",T,","] ,Lout);
1569: Lout=append(mtoupper(M0,F|step=St+1,opt=Opt,dviout=-2,tab=Tab),
1570: Lout);
1571: }else{
1572: mycat([str_times(" ",St-1)+"If",X,"=",T,","]);
1573: mtoupper(M0,F|step=St+1,opt=Opt);
1574: }
1575: break;
1576: }
1577: }
1578: if(Var==[] && Opt>6){
1579: for(Var=vars(TP0);Var!=[];Var=cdr(Var)){
1580: if(mydeg(TP0,X=car(Var))==1){
1581: /* TP0=A*X+B, A is a poly of X0 with rational funct */
1582: T=nm(mycoef(TP0,1,X));
1583: for(Var0=vars(T);Var0!=[]; Var0=cdr(Var0)){
1584: X0=car(Var0);
1585: if(type(dn(red(PC/type(mycoef(T,mydeg(T,X0),X0)))))>1) continue;
1586: TR=getroot(T,X0|mult=1);
1587: if(findin(X0,vars(TR))<0) break;
1588: }
1589: if(Var0==[]) continue;
1590: for(;TR!=[0];TR=cdr(TR)){
1591: if(TR==[]){
1592: TR=[0,0];
1593: T0=-mycoef(TP0,0,X)/mycoef(TP0,1,X);
1594: X0=X;
1595: }else T0=car(TR)[1];
1596: M0=mysubst(M,[X0,T0]);
1597: if(TeX){
1598: Lout=cons(["\\hspace{",Tab*(St-3)-1,"mm}\\text{If }",
1599: X0,"=",T0,","] ,Lout);
1600: Lout=append(mtoupper(M0,F|step=St+1,opt=Opt,dviout=-2,tab=Tab),
1601: Lout);
1602: }else{
1603: mycat([str_times(" ",St-1)+"If",X0,"=",T0,","]);
1604: mtoupper(M0,F|step=St+1,opt=Opt);
1605: }
1606: }
1607:
1608: }
1609: break;
1610: }
1611: }
1612: if(Var==[]){
1613: /* mycat([PC,TF,TP0,vars(TP0)]); */
1614: FF=1;
1615: }
1616: }
1617: if(Q0!=1){
1618: if(FF) FF=1;
1619: if(TeX) Lout=cons(["\\hspace{",Tab*(St-3)-1,"mm}\\text{"+Assume[FF]+" }",Q0/=fctr(Q0)[0][0],"\\ne0,"],
1620: Lout);
1621: else mycat([str_times(" ",St-1)+Assume[FF],Q0,"!=0,"]);
1622: PC*=Q0;St++;
1623: }
1624: }
1625: IF=M[JJ][K]=1;
1.1 takayama 1626: if(Mul!=1){
1627: for(L=K+1; L<Size[1]; L++)
1628: M[JJ][L]=red(M[JJ][L]/Mul);
1.3 takayama 1629: if(St){
1.1 takayama 1630: if(TeX)
1.3 takayama 1631: Lout=cons([Top+"\\xrightarrow{",Line,JJ+1,
1632: "\\ \\times=\\ \\left(",red(1/Mul),"\\right)}",
1.1 takayama 1633: dupmat(M)],Lout);
1634: else
1.3 takayama 1635: mycat0([Top+"line",JJ+1, " *= (",red(1/Mul), ")\n",M,"\n\n"],0);
1.1 takayama 1636: }
1637: }
1.3 takayama 1638:
1.1 takayama 1639: }
1640: for(J = (Opt>0)?0:(JJ+1); J < Size[0]; J++){
1641: if(J == JJ)
1642: continue;
1643: Mul = -M[J][K];
1644: if(Mul!=0){
1645: if(Opt!=2) Mul=rmul(Mul,1/M[JJ][K]);
1646: for(I = K+1; I < Size[1]; I++)
1647: M[J][I] = radd(M[J][I],rmul(M[JJ][I],Mul));
1648: M[J][K] = 0;
1.3 takayama 1649: if(St){
1650: if(Mul<0){
1651: Mul=-Mul;Sgn=0;
1652: }else Sgn=1;
1.1 takayama 1653: if(TeX){
1654: if(Mul==1)
1.3 takayama 1655: Lout=cons([Top+"\\xrightarrow{", Line,J+1,TeXs[Sgn],Line,JJ+1,
1.1 takayama 1656: "}",dupmat(M)],Lout);
1.3 takayama 1657: else Lout=cons([Top+"\\xrightarrow{", Line,J+1,TeXs[Sgn],Line,JJ+1,
1.1 takayama 1658: "\\times\\left(",Mul,"\\right)}",dupmat(M)],Lout);
1659: }else{
1660: if(Mul==1)
1.3 takayama 1661: mycat0([Top+"line",J+1, Lins[Sgn],JJ+1,"\n",M,"\n\n"],0);
1.1 takayama 1662: else
1.3 takayama 1663: mycat0([Top+"line",J+1, Lins[Sgn],JJ+1," * (",Mul,")\n",M,"\n\n"],0);
1.1 takayama 1664: }
1665: }
1666: }
1667: }
1668: JJ++;
1669: }
1670: }
1671: }
1672: if(TeX){
1.3 takayama 1673: if(TeX==-2) return Lout;
1.1 takayama 1674: Lout=reverse(Lout);
1.3 takayama 1675: Br="\\allowdisplaybreaks";
1676: Cr="\\\\\n &";
1677: if(getopt(pages)==1) Cr=Br+Cr;
1678: if(type(S=getopt(cr))==7) Cr=S;
1.4 ! takayama 1679: if(type(Lim=getopt(lim))==1){
! 1680: if(Lim>0){
! 1681: if(Lim<30) Lim=TeXLim;
! 1682: Lim*=2;
! 1683: }
! 1684: }else Lim=0;
! 1685: Out = ltotex(Lout|opt=["cr","spts0"],str=1,cr=Cr,lim=Lim);
1.3 takayama 1686: if(TeX<0) return Out;
1687: dviout(Out|eq=(str_str(Cr,Br)>=0)?6:5,keep=(TeX==1)?0:1);
1.1 takayama 1688: }
1689: return M;
1690: }
1691:
1692: def mydet2(M)
1693: {
1694: S = size(M);
1695: Det = 1;
1696: MM = mtoupper(M,0);
1697: for(I = 0; I < S[0]; I++)
1698: Det = rmul(Det,MM[I][I]);
1699: return Det;
1700: }
1701:
1702: def myrank(MM)
1703: {
1704: S = size(MM);
1705: M = dupmat(MM);
1706: M = mtoupper(M,0);
1707: C = 0;
1708: for(I = K = 0; I < S[0]; I++){
1709: for(J = K; J < S[1]; J++){
1710: if(M[I][J] != 0){
1711: C++; K++;
1712: break;
1713: }
1714: }
1715: }
1716: return C;
1717: }
1718:
1719: def meigen(M)
1720: {
1721: F = getopt(mult);
1722: if(type(M)==4 || type(M)==5){
1723: II=length(M);
1724: for(R=[],I=II-1; I>=0; I--){
1725: if(F==1)
1726: R=cons(meigen(M[I]|mult=1),R);
1727: else
1728: R=cons(meigen(M[I]),R);
1729: }
1730: return R;
1731: }
1732: S = size(M)[0];
1733: P = mydet2(mgen(S,0,[zz],0)-M);
1734: return (F==1)?getroot(P,zz|mult=1):getroot(P,zz);
1735: }
1736:
1.3 takayama 1737: def transm(M)
1738: {
1.4 ! takayama 1739: if(type(M)!=6) M=s2m(M);
! 1740: if(type(M)!=6){
! 1741: errno(0);
! 1742: return 0;
! 1743: }
1.3 takayama 1744: L=[M];TeX="";
1745: Line=["\\text{line}","\\text{col}"];
1746: if((DVI=getopt(dviout)) !=1) DVI=0;
1747: else dviout(M);
1748: for(;;){
1749: print(L0=dupmat(car(L)));
1750: Sz=size(L0);
1751: S=keyin("? ");
1752: N=0;
1753: if(str_len(S)<=1){
1754: if(S=="q") return L;
1755: if(S=="t"){
1756: N=mtranspose(L0);
1757: TeX=["\\text{transpose}"];
1758: }
1759: else if(S=="f"){
1760: if(length(L)>1){
1761: if(LF!=0) TeX="";
1762: L=cdr(L);LF=L0;
1.4 ! takayama 1763: if(DVI){
! 1764: dviout0(-1);
! 1765: dviout(" ");
! 1766: }
1.3 takayama 1767: }
1768: }else if(S=="g"){
1769: if(LF!=0) N=LF;
1770: }else if(S=="0"){
1771: N=M;L=[];TeX=[];
1772: }else if(S=="a"||S=="A"){
1773: if(DVI&&S=="A") mtoupper(L0,0|step=1,opt=10,dviout=1);
1774: else mtoupper(L0,0|step=1,opt=10);
1775: }else{
1776: mycat0([
1777: "2,5 : line2 <-> line5",
1778: "2,5,-2 ; line2 += (-2)*line5",
1779: "2,2,-2 : line2 *= -2",
1780: "2,5,0 : line2 += (?)*line5 for reduction",
1781: "r,2,5 : raw2 <-> raw5 (r,2,5,-2 etc.)",
1782: "s,x,2 : subst(*,x,2)",
1783: "t : transpose",
1784: "0 : first matrix",
1785: "f : previous matrix",
1786: "g : next matrix (only after f)",
1787: "A : auto (a : without TeX)",
1788: "q : quit"
1789: ],1|delim="\n");
1790: }
1791: }else{
1792: FR=0;
1793: S=evals(S|del=",");
1794: if(S[0]==r){
1795: FR=1; S=cdr(S);
1796: }
1797: if((LL=length(S))>=2){
1798: S0=S[0]-1;S1=S[1]-1;
1799: if(S[0]==s){
1800: if(length(S)==3) N=subst(L0,S[1],S[2]);
1801: if(DVI) TeX=[S[1],"\\mapsto",S[2]];
1.4 ! takayama 1802: }else if(FR==0){
! 1803: if(S0<0 || S0>=Sz[0] || S1<0 || S1>=Sz[0]) continue;
1.3 takayama 1804: if(LL==2){
1805: N=rowx(L0,S0,S1);
1806: if(DVI) TeX=[Line[0],S[0],"\\ \\leftrightarrow\\ ",Line[0],S[1]];
1807: }else{
1808: S2=S[2];
1809: if(S0==S1){
1810: N=rowm(L0,S0,S2);
1811: if(DVI) TeX=[Line[0],S[0],"\\ \\times=\\ ",S2];
1812: }else{
1813: if(S2==0){
1814: for(J=0;J<Sz[1] && L0[S1][J]==0;J++);
1815: if(J<Sz[1]) S2=-L0[S0][J]/L0[S1][J];
1816: }
1817: if(S2!=0){
1818: N=rowa(L0,S0,S1,S2);
1819: if(DVI) TeX=[Line[0],S[0],"\\ +=\\ ",Line[0],
1820: S[1],"\\ \\times\\ (",S2,")"];
1821: }
1822: }
1823: }
1.4 ! takayama 1824: }else{
! 1825: if(S0<0 || S0>=Sz[1] || S1<0 && S1>=Sz[1]) continue;
1.3 takayama 1826: if(LL==2){
1827: N=colx(L0,S0,S1);
1828: if(DVI) TeX=[Line[1],S[0],"\\ \\leftrightarrow\\ ",Line[1],S[1]];
1829: }else{
1830: S2=S[2];
1831: if(S0==S1){
1832: N=colm(L0,S0,S2);
1833: if(DVI) TeX=[Line[1],S[0],"\\ \\times=\\ ",S[2]];
1834: }else{
1835: if(S2!=0){
1836: for(J=0; I1<Sz[0] && L0[I1][J]==0; J++);
1837: if(J<Sz[0]) S2=-L0[J][S0]/L0[J][S1];
1838: }if(S2!=0){
1839: N=cola(L0,S0,S1,S2);
1840: if(DVI) TeX=[Line[1],S[0],"\\ +=\\ ",Line[1],
1841: S[1],"\\ \\times\\ (",S2,")"];
1842: }
1843: }
1844: }
1845: }
1846: }
1847: }
1848: if(N!=0){
1849: LF=0;L=cons(N,L);
1850: if(DVI) dviout("\\xrightarrow{"+ltotex(TeX|opt="spts0",str=1)+"}"+mtotex(N)|eq=8);
1851: }
1852: }
1853: }
1854:
1.1 takayama 1855: def vgen(V,W,S)
1856: {
1857: IM=length(V);
1858: I=(getopt(opt)==0)?IM:0;
1859: for(SS=0; I<IM && (SS==0 || V[I]<=W[I]); I++)
1860: SS += W[I];
1861: if(I<IM){
1862: W[I]++;
1863: SS--;
1864: }else
1865: SS=S;
1866: for(J=0;J<I;J++){
1867: W[J] = (SS<=V[J])?SS:V[J];
1868: SS -= W[J];
1869: }
1870: if(SS>0)
1871: return -1;
1872: return(I==IM)?0:I;
1873: }
1874:
1875: def mmc(M,X)
1876: {
1877: L=length(M);
1878: if(getopt(mult)==1){
1879: for(SS=I=2; I<L; I+=(++SS));
1880: if(I!=L) return -1;
1881: }else SS=L;
1882: N=newvect(L);
1883: for(I=0;I<L;I++)
1884: N[I]=M[I];
1885: S=size(N[0])[0];
1886: if(type(X)==4){
1887: for(I=0;I<SS;I++){
1888: if(X[I] != 0)
1889: N[I] = radd(N[I],X[I]);
1890: }
1891: X=X[SS];
1892: }
1893: MZ = newmat(S,S);
1894: ME = mgen(S,0,[X],0);
1895: MM = newvect(L);
1896: for(J=0; J<SS; J++){
1897: for(R=[],I=SS-1; I>=0; I--){
1898: if(I==J){
1899: for(RR=[],K=SS-1; K>=0; K--)
1900: RR=cons((K==I)?N[K]+ME:N[K],RR);
1901: R=cons(RR,R);
1902: }else R=cons([MZ],R);
1903: }
1904: MM[J]=newbmat(SS,SS,R);
1905: }
1906: for( ;J<L; J++){
1907: for(R=[],I=SS-1; I>=0; I--){
1908: for(RR=[N[J]],K=0;K<I;K++)
1909: RR=cons(MZ,RR);
1910: R=cons(RR,R);
1911: }
1912: MM[J]=newbmat(SS,SS,R);
1913: }
1914: for(II=JJ=1,J=SS; J<L; J++){
1915: JI=(II==JJ)?0:II;
1916: IS=JI*S;JS=JJ*S;
1917: for(P=0; P<S; P++){
1918: for(Q=0; Q<S; Q++){
1919: MM[J][JS+P][JS+Q] += N[JI][P][Q];
1920: MM[J][JS+P][IS+Q] -= N[JI][P][Q];
1921: MM[J][IS+P][IS+Q] += N[JJ][P][Q];
1922: MM[J][IS+P][JS+Q] -= N[JJ][P][Q];
1923: }
1924: }
1925: if(++II>=SS) II=++JJ;
1926: }
1927: for(R=[],I=SS-1; I>=0; I--){
1928: for(RR=[N[I]],J=0; J<I; J++) RR=cons(MZ,RR);
1929: R=cons(RR,R);
1930: }
1931: M0 = newbmat(SS,SS,R);
1932: for(M1=MM[0], J=1; J<SS; J++) M1=radd(M1,MM[J]);
1933: KE = append(mykernel(M0|opt=1),mykernel(M1|opt=1));
1934: if(length(KE) == 0) return MM;
1935: KK = mtoupper(lv2m(KE),0);
1936: for(I=0;I<L;I++)
1937: MM[I] = mmod(MM[I],KK);
1938: return MM;
1939: }
1940:
1941: def lpgcd(L)
1942: {
1943: for(F=[]; L!=[]; L=cdr(L)){
1944: if((P=car(L))==0) continue;
1945: if(F==[]){
1946: F=fctr(P);
1947: S=length(F);
1948: S--;
1949: V=newvect(S);
1950: M=newvect(S);
1951: for(I=0; I<S; I++){
1952: M[I] = F[I+1][1];
1953: V[I] = F[I+1][0];
1954: }
1955: N=nm(ptozp(P|factor=1)[1]);
1956: continue;
1957: }
1958: N=igcd(ptozp(P|factor=1)[1],N);
1959: for(I=0; I<S; I++){
1960: for(Q=P,CT=0; CT<M[I]; CT++)
1961: if((Q=tdiv(Q,V[I])) == 0) break;
1962: if(CT<M[I]) M[I]=CT;
1963: }
1964: }
1965: if(F==[]) return 0;
1966: for(Q=N,I=0;I<S; I++){
1967: while(M[I]>0){
1968: Q *= V[I];
1969: M[I]--;
1970: }
1971: }
1972: return Q;
1973: }
1974:
1975: def mdivisor(M,X)
1976: {
1.3 takayama 1977: S=size(M=dupmat(M));
1978: XX=(type(X)==4||X==0)?X:[0,X];
1.1 takayama 1979: S0=S[0]; S1=S[1];
1.3 takayama 1980: if((Tr=getopt(trans))==1||Tr==2){
1981: Tr0=1;
1.1 takayama 1982: GR=mgen(S0,0,1,0); GC=mgen(S1,0,1,0);
1.3 takayama 1983: }else Tr=Tr0=0;
1984: /* 0,a,b : (a,b)->(1,1)
1985: 1 : (1,1) invertible
1986: 2,i,M : line 0,i by M
1987: 3,j,M : col 0,j by M
1988: 4,j : col 1 += col j
1989: 5,j,T : line j by T
1990: 6,j,T : col 1 += col j by T (non-com)
1991: 7,j : line 2<->j (non-com)
1992: */
1993: if(type(V=getopt(dviout))==1){
1994: if(type(XX)==4 && type(XX[0])>1) Var=[XX[1],"\\partial"];
1995: else Var=0;
1996: Tr=(abs(V)==3)?0:1;
1997: MM=dupmat(M);
1998: II=((S[0]>S[1])?S[1]:S[0])+1;
1999: if(abs(V)>1){
2000: Is1=Js1=S[0]+S[1];
2001: Is=Js=[0,[Is1]];
2002: }else{
2003: Is=[0,[Is1=S[0]]];Js=[0,[Js1=S[1]]];
2004: }
2005: VV=V;
2006: V=newvect(II);
2007: for(I=0;I<II;I++) V[I]=[];
2008: N=newbmat(2,2,[[M,mgen(S[0],0,[1],0)],[mgen(S[1],0,[1],0)]]);
2009: mdivisor(M,X|step=1,dviout=V);
2010: L=S[0]+S[1];
2011: if(Tr){
2012: NN=mperm(N,Is1,Js1);
2013: for(K=S[0];K<Is1;K++){
2014: for(L=S[1];L<Js1;L++)
2015: NN[K][L]=" ";
2016: }
2017: Out=[[mperm(NN,Is,Js)]];
2018: }
2019: for(I=1;I<II;I++){
2020: I0=I-1;
2021: if(V[I]==[]) continue;
2022: for(T=reverse(V[I]);T!=[];T=cdr(T)){
2023: St=[];
2024: C=car(R=car(T));
2025: if(C==0){
2026: N=mperm(N,(R[1]==0)?0:[[R[1]+I0,I0]],(R[2]==0)?0:[[R[2]+I0,I0]]);
2027:
2028: if(Tr){
2029: if(R[2]!=0) St=append(["C",I,"\\leftrightarrow C",R[2]+I],St);
2030: if(R[1]!=0){
2031: if(R[2]!=0) St=cons(",\\ ",St);
2032: St=append(["L",I,"\\leftrightarrow L",R[1]+I],St);
2033: }
2034: Out=cons(St,Out);
2035: }
2036: }else if(C==1){
2037: P=1/N[I0][I0];N[I0][I0]=1;
2038: if(P!=1){
2039: for(J=I;J<L;J++)
2040: N[I0][J]=muldo(P,N[I0][J],XX);
2041:
2042: if(Tr){
2043: St=append(["L",I,"\\leftarrow(",P,")","\\times L",I],St);
2044: Out=cons(St,Out);
2045: NN=mperm(N,Is1,Js1);
2046: for(K=S[0];K<Is1;K++){
2047: for(L=S[1];L<Js1;L++)
2048: NN[K][L]=" ";
2049: }
2050: Out=cons(["\\to",mperm(NN,Is,Js)],Out);
2051: }
2052: }
2053: for(F=0,J=I;J<S[0];J++){
2054: if((P=N[J][I0])==0) continue;
2055: F++;
2056: N[J][I0]=0;
2057: for(K=I;K<L;K++)
2058: N[J][K]=red(N[J][K]-muldo(P,N[I0][K],XX));
2059:
2060: }
2061: if(F){
2062: if(Tr){
2063: Out=cons(["Li\\ -\\!=\\ \\circ\\times L",I,"\\quad(i>",I,")"],Out);
2064: NN=mperm(N,Is1,Js1);
2065: for(K=S[0];K<Is1;K++){
2066: for(L=S[1];L<Js1;L++)
2067: NN[K][L]=" ";
2068: }
2069: Out=cons(["\\to",mperm(NN,Is,Js)],Out);
2070: }
2071: }
2072: for(F=0,J=I;J<S[1];J++){
2073: if((P=N[I0][J])==0) continue;
2074: F++;
2075: N[I0][J]=0;
2076: for(K=I;K<L;K++)
2077: N[K][J]=red(N[K][J]-muldo(N[K][I0],P,XX));
2078: }
2079: if(F&&Tr) Out=cons(["Cj\\ -\\!=\\ C",I,"\\times\\circ\\quad(j>",I,")"],Out);
2080: else continue;
2081: }else if(C==2){
2082: C=mat(N[I0],N[R[1]+I0]);C=muldo(R[2],C,XX);
2083: for(J=0;J<L;J++){
2084: N[I0][J]=C[0][J];N[R[1]+I0][J]=C[1][J];
2085: }
2086: if(Tr) Out=cons([dupmat(R[2]),"\\begin{pmatrix}L",I,"\\\\L",R[1]+I,
2087: "\\end{pmatrix}"],Out);
2088: }else if(C==3){
2089: C=newmat(L,2);
2090: for(J=0;J<L;J++){
2091: C[J][0]=N[J][I0];C[J][1]=N[J][R[1]+I0];
2092: }
2093: C=muldo(C,R[2],XX);
2094: for(J=0;J<L;J++){
2095: N[J][I0]=C[J][0];N[J][R[1]+I0]=C[J][1];
2096: }
2097: if(Tr) Out=cons(["\\begin{pmatrix}C",I,"&C",R[1]+I,"\\end{pmatrix}",
2098: dupmat(R[2])],Out);
2099: }else if(C==4){
2100: for(J=0;J<L;J++)
2101: N[J][I0]=red(N[J][I0]+N[J][R[1]+I0]);
2102: if(Tr) Out=cons(["C",I,"\\ +\\!=\\ C",R[1]+I],Out);
2103: }else if(C==5){
2104: for(J=0;J<L;J++)
2105: N[I0+R[1]][J]=red(R[2]*N[I0+R[1]][J]);
2106: if(Tr) Out=cons(["L",I+R[1],"\\leftarrow(", R[2],")\\times L",I+R[1]],
2107: Out);
2108: }else if(C==6){
2109: for(J=0;J<L;J++)
2110: N[J][I0]=N[J][I0]+muldo(N[J][I0+R[1]],R[2],XX);
2111: if(Tr) Out=cons(["C",I,"\\ +\\!=\\ C",I+R[1],"\\times(", R[2],")"],
2112: Out);
2113: }else if(C==7){
2114: mycat(["line",I+1,"\\leftrightarrow",R[1]+I]);
2115: for(J=0;J<L;J++){
2116: C=N[I][J];N[I][J]=N[R[1]+I0][J];N[R[1]+I0][J]=C;
2117: }
2118: if(Tr) Out=cons(["L",I+1,"\\leftrightarrow L",R[1]+I],Out);
2119: }
2120: if(Tr){
2121: NN=mperm(N,Is,Js);
2122: for(K=S[0];K<Is1;K++){
2123: for(L=S[1];L<Js1;L++)
2124: NN[K][L]=" ";
2125: }
2126: Out=cons(["\\to",NN],Out);
2127: }
2128: }
2129: }
2130: if(!Tr){
2131: NN=mperm(N,Is,Js);
2132: Out=[];
2133: }
2134: if(S[0]+S[1]==Is1){
2135: N1=mperm(NN,[0,[S[0]]],[S[1],[S[0]]]);
2136: N2=mperm(NN,[S[0],[S[1]]],[0,[S[1]]]);
2137: N3=mperm(NN,[0,[S[0]]],[0,[S[1]]]);
2138: R1=mdivisor(N1,X|trans=1)[1];
2139: R2=mdivisor(N2,X|trans=1)[1];
2140: if(Tr){
2141: Out=cons(["\\text{As a result,}"],Out);
2142: Out=cons([N3,"=",N1,MM,N2],Out);
2143: if(S[0]==S[1] && N3==mgen(S[0],0,1,0)){
2144: Out=cons(["=",muldo(N2,N1,XX),MM,"."],Out);
2145: }else{
2146: Out=cons([N1,"^{-1}=",R1,","],Out);
2147: Out=cons([N2,"^{-1}=",R2,"."],Out);
2148: }
2149: }else{
2150: Out=cons([N3,"=P",MM,"Q,"],Out);
2151: Out=cons(["P=",N1,"=",R1,"^{-1},"],Out);
2152: Out=cons(["Q=",N2,"=",R2,"^{-1}."],Out);
2153: }
2154: }
2155: Out = ltotex(reverse(Out)|opt=["cr","spts0"],str=1,cr=15,var=Var);
2156: if(S[0]+S[1]==Is1)
2157: Out=str_subst(Out,"\\texttt{ }","");
2158: if(VV>0){
2159: dviout(Out|eq=6);
2160: return NN;
2161: }
2162: return Out;
2163: }else if(type(V)!=5) V=0;
2164:
1.1 takayama 2165: if(type(St=getopt(step))!=1) St=0;
2166: for(FF=": start";;){
1.3 takayama 2167: if(St && V==0){
1.1 takayama 2168: if(Tr){
2169: mycat0([St,FF,"\n"],0);
2170: mycat([GR,"\n"]);mycat([M,"\n"]);mycat([GC,"\n"]);
2171: }
2172: else mycat0([St,FF,"\n",M,"\n"],0);
2173: }
2174: /* if(Tr==1){ mycat(GR); mycat([GC,"\n\n"]);} */
1.3 takayama 2175: if(X==0||X==[0,0]){ /* search minimal non-zero element */
1.1 takayama 2176: for(K=F=I=0; I<S0; I++){
2177: for(J=0; J<S1; J++){
2178: if((P=abs(M[I][J]))!=0 && (K>P || K==0)){
2179: K=P; R=[I,J];
2180: }
2181: }
2182: }
2183: R=cons(K-1,[R]);
2184: }
2185: else R=mymindeg(M,XX[1]|opt=1);
2186: if(R[0]<0){ /*zero matrix */
1.3 takayama 2187: if(Tr) return [[],mgen(S0,0,1,0),mgen(S1,0,1,0)];
1.1 takayama 2188: return [];
2189: }
2190: R0=R[1][0];R1=R[1][1];
2191: if(R0!=0){
2192: M=rowx(M,0,R0);
1.3 takayama 2193: if(Tr) GR=rowx(GR,0,R0);
1.1 takayama 2194: }
2195: if(R1!=0){
2196: M=colx(M,0,R1);
1.3 takayama 2197: if(Tr) GC=colx(GC,0,R1);
1.1 takayama 2198: }
2199: if(St>0 && (R0!=0 || R1!=0))
1.3 takayama 2200: if(type(V)==5) V[St]=cons([0,R0,R1],V[St]);
2201: else if(Tr){
1.1 takayama 2202: mycat0([St,": (",R0+1,",",R1+1,") -> (1,1)\n"],0);
2203: mycat([GR,"\n"]);mycat([M,"\n"]);mycat([GC,"\n"]);
2204: }else mycat0([St,": (",R0+1,",",R1+1,") -> (1,1)\n",M,"\n"],0);
2205: /* if(Tr==1){ mycat(GR); mycat([GC,"\n\n"]);} */
2206: if(R[0]==0){ /* (1,1) : invertible */
1.3 takayama 2207: if(type(V)==5) V[St]=cons([1],V[St]);
1.1 takayama 2208: P=M[0][0]; M[0][0]=1;
2209: for(J=0;J<S1;J++){ /* (1,1) -> 1 */
2210: if(J>0) M[0][J]= red(M[0][J]/P);
1.3 takayama 2211: if(Tr) GR[0][J]=red(GR[0][J]/P);
1.1 takayama 2212: }
2213: /* if(Tr==1){ mycat(GR); mycat([GC,"\n\n"]);} */
2214: if(S0>1 && S1>1) N=newmat(S0-1,S1-1);
2215: else N=0;
2216: for(I=1;I<S0;I++){
2217: P=M[I][0]; M[I][0]=0;
2218: for(J=1;J<S1;J++)
2219: N[I-1][J-1]=M[I][J]=red(M[I][J] - muldo(P,M[0][J],XX));
1.3 takayama 2220: if(Tr){
1.1 takayama 2221: for(J=0;J<S0;J++)
2222: GR[I][J] = red(GR[I][J] -muldo(P,GR[0][J],XX));
2223: }
2224: }
2225: /* if(Tr==1){ mycat(GR); mycat([GC,"\n\n"]);} */
1.3 takayama 2226: if(Tr){
1.1 takayama 2227: for(J=1;J<S1; J++){
1.3 takayama 2228: for(I=0;I<S1;I++) GC[I][J]=red(GC[I][J]-muldo(GC[I][0],M[0][J],XX));
1.1 takayama 2229: M[0][J]=0;
2230: }
2231: }
1.3 takayama 2232: if(St>0 && V==0){
2233: if(Tr){
1.1 takayama 2234: mycat0([St,": unit\n"],0);
2235: mycat([GR,"\n"]);mycat([M,"\n"]);mycat([GC,"\n"]);
2236: }
2237: else mycat0([St,": unit\n",M,"\n"],0);
2238: }
2239: /* if(Tr==1){ mycat(GR); mycat([GC,"\n\n"]);} */
2240: if(N==0){
1.3 takayama 2241: if(!Tr) return [1];
2242: if(Tr==2){
2243: GR0=mdivisor(GR,X|trans=1)[1];
2244: GC0=mdivisor(GC,X|trans=1)[1];
2245: return [[1],GR,GC,GR0,GC0];
2246: }
1.1 takayama 2247: return [[1],GR,GC];
2248: }
1.3 takayama 2249: R=mdivisor(N,XX|dviout=V,trans=Tr0,step=(St>0)?St+1:St);
2250: if(!Tr) return cons(1,R);
1.1 takayama 2251: /* mycat(["Ret",R]); */
2252: GR=muldo(newbmat(2,2,[[1],[0,R[1]]]),GR,XX);
2253: GC=muldo(GC,newbmat(2,2,[[1],[0,R[2]]]),XX);
2254: if(S0==S1 && countin(1,1,R[0])==S0-1){
1.3 takayama 2255: /* mycat(GR);mycat(GC); */
2256: GR=muldo(GC,GR,XX); GC=mgen(S0,0,1,0);
2257: /* mycat(GR);mycat("#");*/
2258: }
2259: if(Tr==2){
2260: GR0=mdivisor(GR,X|trans=1)[1];
2261: GC0=mdivisor(GC,X|trans=1)[1];
2262: return [cons(1,R[0]),GR,GC,GR0,GC0];
1.1 takayama 2263: }
2264: return [cons(1,R[0]),GR,GC];
2265: }
2266: for(I=1;I<S0;I++){
2267: if(M[I][0]!=0){
1.3 takayama 2268: /* Error! when mygcd(A,B,0) with A<=0 or B<=0 */
1.1 takayama 2269: R=mygcd(M[I][0],M[0][0],XX); /* R[0]=R[1]*M[I][0]+R[2]*M[0][0] */
2270: M[0][0]=R[0]; M[I][0]=0; /* 0=R[3]*M[I][0]+R[4]*M[0][0] */
2271: for(J=1;J<S1;J++){
2272: T=red(muldo(R[1],M[I][J],XX)+muldo(R[2],M[0][J],XX));
2273: M[I][J]=red(muldo(R[3],M[I][J],XX)+muldo(R[4],M[0][J],XX));
2274: M[0][J]=T;
2275: }
1.3 takayama 2276: if(Tr){
1.1 takayama 2277: for(J=0;J<S0;J++){
2278: T=red(muldo(R[1],GR[I][J],XX)+muldo(R[2],GR[0][J],XX));
2279: GR[I][J]=red(muldo(R[3],GR[I][J],XX)+muldo(R[4],GR[0][J],XX));
2280: GR[0][J]=T;
2281: }
2282: }
1.3 takayama 2283: if(St && V==0){
1.1 takayama 2284: mycat([" [",R[2],R[1],"]*"]);
2285: mycat([" [",R[4],R[3],"]"]);
2286: }
1.3 takayama 2287: if(type(V)==5) V[St]=cons([2,I,mat([R[2],R[1]],[R[4],R[3]])],V[St]);
2288: FF=": line 1 & "+rtostr(I+1); I=S0;
1.1 takayama 2289: }
2290: }
2291: if(I>S0) continue;
2292: for(J=1;J<S1;J++){
2293: if(M[0][J]!=0){
2294: R=mygcd(M[0][J],M[0][0],XX|rev=1); /* R[0]=M[0][J]*R[1]+M[0][0]*R[2] */
2295: M[0][0]=R[0]; M[0][J]=0; /* 0=M[0][J]*R[3]+M[0][0]*R[4] */
2296: for(I=1;I<S0;I++){
2297: T=red(muldo(M[I][J],R[1],XX)+muldo(M[I][0],R[2],XX));
2298: M[I][J]=red(muldo(M[I][J],R[3],XX)+muldo(M[I][0],R[4],XX));
2299: M[I][0]=T;
2300: }
1.3 takayama 2301: if(Tr){
1.1 takayama 2302: for(I=0;I<S1;I++){
2303: T=red(muldo(GC[I][J],R[1],XX)+muldo(GC[I][0],R[2],XX));
2304: GC[I][J]=red(muldo(GC[I][J],R[3],XX)+muldo(GC[I][0],R[4],XX));
2305: GC[I][0]=T;
2306: }
2307: }
1.3 takayama 2308: if(type(V)==5) V[St]=cons([3,J,mat([R[2],R[4]],[R[1],R[3]])],V[St]);
1.1 takayama 2309: FF=": column 1 & "+rtostr(J+1);J=S1;
1.3 takayama 2310: if(St && V==0){
1.1 takayama 2311: mycat([" *[",R[2],R[4],"]"]);
2312: mycat([" [",R[1],R[3],"]"]);
2313: }
2314: }
2315: }
2316: if(J>S1) continue;
2317: if(S0==1 || S1==1){
2318: P=M[0][0];
2319: if(X==0){
1.3 takayama 2320: if(P<0){
2321: P=-P;
2322: if(Tr) for(J=0;J<S0;J++) GR[0][J]=-GR[0][J];
2323: if(type(V)==5) V[St]=cons([5,0,-1],V[St]);
2324: }
1.1 takayama 2325: }else{
2326: P=nm(P);
1.3 takayama 2327: if((R=fctr(P)[0][0])!=1){
2328: P/=R;
2329: if(Tr) for(J=0;J<S0;J++) GR[0][J]/=R;
2330: if(type(V)==5) V[St]=cons([5,0,1/R],V[St]);
2331: }
2332: }
2333: if(!Tr) return [P];
2334: if(Tr==2){
2335: GR0=mdivisor(GR,X|trans=1)[1];
2336: GC0=mdivisor(GC,X|trans=1)[1];
2337: return [[P],GR,GC,GR0,GC0];
1.1 takayama 2338: }
2339: return [[P],GR,GC];
2340: }
1.3 takayama 2341: if(XX==0 || (type(XX)==4 && XX[0]==0)){ /* commutative case */
1.1 takayama 2342: P=M[0][0];
2343: for(I=1; I<S0; I++){
2344: for(J=1; J<S1; J++)
2345: if(divdo(M[I][J],P,XX)[1]!=0) break;
2346: if(J<S1){
1.3 takayama 2347: if(type(V)==5) V[St]=cons([4,J],V[St]);
1.1 takayama 2348: FF=": column 1 += col"+rtostr(J+1);
2349: for(I=1;I<S0;I++) M[I][0]=M[I][J];
1.3 takayama 2350: if(Tr) for(I=0;I<S1;I++) GC[I][0]=red(GC[I][0]+GC[I][J]);
1.1 takayama 2351: break;
2352: }
2353: }
2354: if(J<S1) continue;
2355: N=newmat(S0-1,S1-1);
2356: for(I=1;I<S0;I++)
2357: for(J=1;J<S1;J++) N[I-1][J-1]=red(M[I][J]/P);
2358: if(X==0){
2359: if(P<0) P=-P;
1.3 takayama 2360: if(Tr) for(J=0;J<S0;J++) GR[0][J]=-GR[0][J];
1.1 takayama 2361: }else{
2362: P=M[0][0];
2363: P=nm(P);
2364: P/=fctr(P)[0][0];
1.3 takayama 2365: if(Tr) for(J=0;J<S0;J++) GR[0][J]/=fctr(P)[0][0];
1.1 takayama 2366: }
1.3 takayama 2367: R=mdivisor(N,XX|dviout=V,trans=Tr0,step=(St>0)?St+1:St);
2368: RT=(Tr)?R[0]:R;
1.1 takayama 2369: for(RR=[],L=reverse(RT);L!=[];L=cdr(L))
2370: RR=cons(red(P*car(L)),RR);
2371: RR=cons(P,RR);
1.3 takayama 2372: if(!Tr) return RR;
1.1 takayama 2373: GR=muldo(newbmat(2,2,[[1],[0,R[1]]]),GR,XX);
2374: GC=muldo(GC,newbmat(2,2,[[1],[0,R[2]]]),XX);
2375: if(S0==S1 && countin(1,1,RR)==S0){
1.3 takayama 2376: GR=muldo(GC,GR,XX); GC=mgen(S0,0,1,0);
2377: }
2378: if(Tr==2){
2379: GR0=mdivisor(GR,X|trans=1)[1];
2380: GC0=mdivisor(GC,X|trans=1)[1];
2381: return [RR,GR,GC,GR0,GC0];
1.1 takayama 2382: }
2383: return [RR,GR,GC];
2384: } /* End of commutative case */
2385: for(I=1; I<S0; I++){
2386: for(J=1; J<S1; J++){
2387: if(M[I][J] != 0){
2388: for(T=1;I<S0;T*=XX[0]){
2389: R=divdo(muldo(M[I][J],T,XX),M[0][0],XX);
2390: if(R[1]!=0){
1.3 takayama 2391: if(type(V)==5) V[St]=cons([6,J,T],V[St]);
1.1 takayama 2392: FF=": column 1 += col"+rtostr((J+1)*T);
2393: if(I>1){
2394: M=rowx(M,1,I);
1.3 takayama 2395: if(Tr) GR=rowx(GR,1,I);
2396: if(type(V)==5) V[St]=cons([7,I],V[St]);
1.1 takayama 2397: FF+=", line 2<->"+rtostr(I+1);
2398: }
2399: for(I=1;I<S0;I++) M[I][0]=muldo(M[I][J],T,XX);
1.3 takayama 2400: if(Tr)
1.1 takayama 2401: for(I=1;I<S1;I++) GC[I][0]=red(GC[I][0]+muldo(GC[I][J],T,XX));
2402: I=S0+1; J=S1;
2403: break;
2404: }
2405: }
2406: }
2407: }
2408: if(I>S0) break;
2409: }
2410: if(I==S0) return []; /* zero matrix : never happen */
2411: }
2412: }
2413:
2414: def mdsimplify(L)
2415: {
2416: T=getopt(type);
2417: SS=0;
2418: if(type(L)==6){
2419: L=[L]; SS=1;
2420: }
2421: if(type(L)==5){
2422: SS=2;
2423: L = vtol(L);
2424: }
2425: M=car(L);
2426: S=size(M)[0];
2427: DD=newvect(S);
2428: for(I=0; I<S; I++){
2429: LN=RN=[];
2430: LD=RD=1;
2431: for(LL=L; LL!=[]; LL=cdr(LL)){
2432: M = car(LL);
2433: for(J=0; J<S; J++){
2434: if(J==I) continue;
2435: if((MM=M[I][J]) != 0){
2436: LN = cons(nm(MM),LN);
2437: if(type(MM)==3 && tdiv(LD,P=dn(MM))==0)
2438: LD=tdiv(LD*P,gcd(LD,P));
2439: }
2440: if((MM=M[J][I]) != 0){
2441: RN = cons(nm(MM),RN);
2442: if(type(MM)==3 && tdiv(RD,P=dn(MM))==0)
2443: RD=tdiv(RD*P,gcd(RD,P));
2444: }
2445: }
2446: }
2447: if(T==1 || T==3) LQ=RD;
2448: else{
2449: P=lpgcd(LN);
2450: LQ=gcd(P,RD);
2451: if(P!=0) LQ *= nm(fctr(P)[0][0]);
2452: }
2453: if(T==1 || T==2) RQ=LD;
2454: else{
2455: P=lpgcd(RN);
2456: RQ=gcd(P,LD);
2457: if(P!=0) RQ *= nm(fctr(P)[0][0]);
2458: }
2459: if((P=gcdz(LQ,RQ))!=1){
2460: LQ = red(LQ/P); RQ=red(RQ/P);
2461: }
2462: DD[I]=red(LQ/RQ);
2463: if(LQ!=1 || RQ!=1){
2464: for(LA=[],LL=L; LL!=[]; LL=cdr(LL)){
2465: M = car(LL);
2466: for(J=0; J<S; J++){
2467: if(I!=J){
2468: if(LQ!=1){
2469: M[I][J] = red(M[I][J]/LQ);
2470: M[J][I] = red(M[J][I]*LQ);
2471: }
2472: if(RQ!=1){
2473: M[J][I] = red(M[J][I]/RQ);
2474: M[I][J] = red(M[I][J]*RQ);
2475: }
2476: }
2477: }
2478: }
2479: }
2480: }
2481: if(SS==2) L=ltov(L);
2482: if(SS==1) L=L[0];
2483: if(getopt(show)==1) L=[L,DD];
2484: return L;
2485: }
2486:
2487: def m2mc(M,X)
2488: {
2489: if(type(M)<2){
2490: mycat([
2491: "m2mc(m,t) or m2mc(m,[t,s])\t Calculation of Pfaff system of two variables\n",
2492: " m : list of 5 residue mat. or GRS/spc for rigid 4 singular points\n",
2493: " t : [a0,ay,a1,c], swap, GRS, GRSC, sp, irreducible, pair, pairs, Pfaff, All\n",
2494: " s : TeX, dviout, GRSC\n",
2495: " option : swap, small, simplify, operator, int\n",
2496: " Ex: m2mc(\"21,21,21,21\",\"All\")\n"
2497: ]);
2498: return 0;
2499: }
2500: if(type(M)==7) M=s2sp(M);
2501: if(type(X)==7)
2502: X=[X];
2503: Simp=getopt(simplify);
2504: if(Simp!=0 && type(Simp)!=1) Simp=2;
2505: Small=(getopt(small)==1)?1:0;
2506: if(type(M[0])==4){
2507: if(type(M[0][0])==1){ /* spectral type */
2508: XX=getopt(dep);
2509: if(type(XX)!=4 || type(XX[0])>1) XX=[1,length(M[0])];
2510: M=sp2grs(M,[d,a,b,c],[XX[0],XX[1],-2]|mat=1);
2511: if(XX[0]>1 && XX[1]<2) XX=[XX[0],2];
2512: if(getopt(int)!=0){
2513: T=M[XX[0]-1][XX[1]-1][1];
2514: for(V=vars(T);V!=[];V=cdr(V)){
2515: F=coef(T,1,car(V));
2516: if(type(F)==1 && dn(F)>1)
2517: M = subst(M,car(V),dn(F)*car(V));
2518: }
2519: }
2520: V=vars(M);
2521: if(findin(d1,V)>=0 && findin(d2,V)<0 && findin(d3,V)<0)
2522: M=subst(M,d1,d);
2523: }
2524: RC=chkspt(M|mat=1);
2525: if(RC[2] != 2 || RC[3] != 0){ /* rigidity idx and Fuchs cond */
2526: erno(0);return 0;
2527: }
2528: R=getbygrs(M,1|mat=1);
2529: Z=newmat(1,1,[[0]]);
2530: N=[Z,Z,Z,Z,Z];
2531: for(RR=R; RR!=[]; RR=cdr(RR)){
2532: RT=car(RR)[0];
2533: if(type(RT)==4){
2534: if(RT[0]!=0) N=m2mc(N,RT[0]|simplify=Simp);
2535: N=m2mc(N,[RT[1],RT[2],RT[3]]|simplify=Simp);
2536: }
2537: }
2538: if(type(X)==4 && type(X[0])==7)
2539: return m2mc(N,X|keep=Keep,small=Small);
2540: return N;
2541: }
2542: if(type(X)==4 && type(X[0])==7){
2543: Keep=(getopt(keep)==1)?1:0;
2544: if(X[0]=="All"){
2545: dviout("Riemann scheme"|keep=1);
2546: m2mc(M,[(findin("GRSC",X)>=0)?"GRSC":"GRS","dviout"]|keep=1);
2547: dviout("Spectral types : "|keep=1);
2548: m2mc(M,["sp","dviout"]|keep=1);
2549: dviout("\\\\\nBy the decompositions"|keep=1);
2550: R=m2mc(M,["pairs","dviout"]|keep=1);
2551: for(R0=R1=[],I=1; R!=[]; I++, R=cdr(R)){
2552: for(S=0,RR=car(R)[1][0];RR!=[]; RR=cdr(RR)) S+=RR[0];
2553: if(S==0) R0=cons(I,R0);
2554: else if(S<0) R1=cons(I,R1);
2555: }
2556: S="irreducibility\\ $"+((length(R0)==0)?"\\Leftrightarrow":"\\Leftarrow")
2557: +"\\ \\emptyset=\\mathbb Z\\cap$";
2558: dviout(S|keep=1);
2559: m2mc(M,["irreducible","dviout"]|keep=1);
2560: if(R0!=[])
2561: dviout(ltotex(reverse(R0))|eq=0,keep=1,
2562: title="The following conditions may not be necessary for the irreducibility.");
2563: if(R1!=[])
2564: dviout(ltotex(reverse(R1))|eq=0,keep=1,title="The following conditions can be omitted.");
2565: if(getopt(operator)!=0){
2566: dviout("The equation in a Pfaff form is"|keep=1);
2567: m2mc(M,["Pfaff","dviout"]|keep=Keep,small=Small);
2568: }
2569: else if(Keep!=1) dviout(" ");
2570: return M;
2571: }
2572: Show=0;
2573: if(length(X)>1){
2574: if(X[1]=="dviout") Show=2;
2575: if(X[1]=="TeX") Show=1;
2576: }
2577: if(X[0]=="GRS"||X[0]=="GRSC"||X[0]=="sp"){
2578: Y=radd(-M[0],-M[1]-M[2]);
2579: if(X[0]!="GRSC"){
2580: 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);
2581: if(X[0]=="sp"){
2582: L=chkspt(L|opt="sp");
2583: V=[L[1],L[0],L[2],L[5]]; W=[L[1],L[3],L[4],L[6]];
2584: if(Show==2) dviout(s2sp(V)+" : "+s2sp(W)|keep=Keep);
2585: return [V,W];
2586: }
2587: S="x=0&x=y&x=1&y=0&y=1&x=\\infty&y=\\infty&x=y=\\infty\\\\\n";
2588: }else{
2589: 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]),
2590: radd(M[0],M[1]+M[3]),radd(M[1],M[2]+M[4])]|mult=1);
2591: 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";
2592: }
2593: T=ltotex(L|opt="GRS",pre=S,small=Small);
2594: if(Show==2) dviout(T|eq=0,keep=Keep);
2595: if(Show==1) L=T;
2596: return L;
2597: }
2598: if(X[0]=="Pfaff"){
2599: S=ltotex(M|opt=["Pfaff",u,x,x-y,x-1,y,y-1],small=Small);
2600: if(Show==2) dviout(S|eq=0,keep=Keep);
2601: return S;
2602: }
2603: if(X[0]=="irreducible"){
2604: L=meigen([M[0],M[1],M[2],radd(-M[0],-M[1]-M[2])]|mult=1);
2605: S=getbygrs(L,10|mat=1);
2606: if(Show==2) dviout(ltotex(S)|eq=0,keep=Keep);
2607: return S;
2608: }
2609: if(X[0]=="pairs"||X[0]=="pair"){
2610: L=meigen([M[0],M[1],M[2],radd(-M[0],-M[1]-M[2])]|mult=1);
2611: S=chkspt(L|opt=0);
2612: V=(Show==2)?1:0;
2613: S=sproot(L,X[0]|dviout=V,keep=Keep);
2614: return S;
2615: }
2616: if(X[0]=="swap"){
2617: Swap=getopt(swap);
2618: if(type(Swap)<1 || Swap==1)
2619: return newvect(5,[M[3],M[1],M[4],M[0],M[2]]);
2620: if(Swap==2)
2621: return newvect(5,[radd(M[0],M[1]+M[3]),M[4],M[2],radd(-M[1],-M[3]-M[4]),M[1]]);
2622: if(type(Swap)==4 && length(Swap)==3){
2623: MX=radd(-M[0],-M[1]-M[2]); MY=radd(-M[3],-M[1]-M[4]);
2624: if(Swap[0]==1){
2625: MX0=M[2];MY0=M[4];
2626: }
2627: else if(Swap[0]==2){
2628: MX0=MX;MY0=MY;
2629: }else{
2630: MX0=M[0];MY0=M[3];
2631: }
2632: if(Swap[1]==1){
2633: MX1=M[2];MY1=M[4];
2634: }
2635: else if(Swap[1]==2){
2636: MX1=MX;MY1=MY;
2637: }else{
2638: MX1=M[0];MY1=M[3];
2639: }
2640: return newvect(5,MX0,M[1],MX1,MY0,MY1);
2641: }
2642: }
2643: return 0;
2644: }
2645: if(getopt(swap)==1)
2646: return m2mc(m2mc(m2mc(M,"swap"),X),"swap");
2647: N=newvect(5);
2648: for(I=0;I<5;I++)
2649: N[I]=M[I];
2650: S=size(N[0])[0];
2651: if(type(X)==4){
2652: for(I=0;I<3;I++){
2653: if(X[I] != 0)
2654: N[I] = radd(N[I],X[I]);
2655: }
2656: if(length(X)==3) return N;
2657: X=X[3];
2658: }
2659: MZ = newmat(S,S);
2660: ME = mgen(S,0,[X],0);
2661: MM = newvect(5);
2662: MM[0] = newbmat(3,3, [[N[0]+ME,N[1],N[2]], [MZ], [MZ]]);
2663: MM[1] = newbmat(3,3, [[MZ], [N[0],N[1]+ME,N[2]], [MZ]]);
2664: MM[2] = newbmat(3,3, [[MZ], [MZ], [N[0],N[1],N[2]+ME]]);
2665: MM[3] = newbmat(3,3, [[N[3]+N[1],-N[1]], [-N[0],radd(N[0],N[3])], [MZ,MZ,N[3]]]);
2666: MM[4] = newbmat(3,3, [[N[4]], [MZ,N[4]+N[2],-N[2]], [MZ,-N[1],radd(N[4],N[1])]]);
2667: M0 = newbmat(3,3, [[N[0]], [MZ,N[1]], [MZ,MZ,N[2]]]);
2668: M1 = radd(MM[0],MM[1]+MM[2]);
2669: KE = append(mykernel(M0|opt=1),mykernel(M1|opt=1));
2670: if(length(KE) == 0) return MM;
2671: KK = mtoupper(lv2m(KE),0);
2672: for(I=0;I<5;I++)
2673: MM[I] = mmod(MM[I],KK);
2674: if(Simp!=0) MM = mdsimplify(MM|type=Simp);
2675: return MM;
2676: }
2677:
2678: /*
2679: def mmc(M,X)
2680: {
2681: if(type(M)==4)
2682: M=ltov(M);
2683: L = length(M);
2684: S = size(M[0])[0];
2685: SS = L*S;
2686: MM = newvect(L);
2687: M0 = newmat(SS,SS);
2688: if(type(X)<4){
2689: Y = newvect(L+1);
2690: Y[L]=X;
2691: }else Y = X;
2692: for(KI = 0; KI < L; KI++){
2693: MM[KI] = newmat(SS,SS);
2694: II=KI*S;
2695: for(I=0; I<S; I++){
2696: for(KJ=0; KJ<L; KJ++){
2697: JJ=KJ*S;
2698: for(J=0; J<S; J++){
2699: MM[KI][II+I][JJ+J]=M[KJ][I][J]+((I==J)?Y[KJ]:0);
2700: if(KI==KJ){
2701: M0[II+I][JJ+J]=M[KJ][I][J]+((I==J)?Y[KJ]:0);
2702: if(I==J)
2703: MM[KI][II+I][JJ+J]+=Y[L];
2704: }
2705: }
2706: }
2707: }
2708: }
2709: M1 = newmat(SS,SS);
2710: for(I=0; I<L; I++)
2711: M1 += MM[I];
2712: KE = append(mykernel(M0|opt=1),mykernel(M1|opt=1));
2713: if(length(KE)==0) return MM;
2714: KK = toupper(lv2m(KE,0));
2715: for(KI = 0; KI < L; KI++)
2716: MM[KI] = mmod(MM[KI],KK);
2717: return MM;
2718: }
2719: */
2720:
2721: def easierpol(P,X)
2722: {
2723: if(type(X) == 4){
2724: for( Y = [] ; X != []; X = cdr(X) )
2725: Y = cons([0,car(X)], Y);
2726: }else
2727: Y = [0,X];
2728: return rede(P,Y);
2729: }
2730:
2731: def mykernel(M)
2732: {
2733: if(getopt(opt) == 1)
2734: M = mtranspose(M);
2735: S = size(M);
2736: R = [];
2737: MM = mtoupper(M,-1);
2738: for(I = S[0]-1; I >= 0; I--){
2739: for(J = S[1]-1; J >= 0; J--){
2740: if(MM[I][J] != 0)
2741: return R;
2742: }
2743: P = easierpol(MM[I][S[1]],zz);
2744: RR = newvect(S[0]);
2745: for(J = 0; J < S[0]; J++)
2746: RR[J] = mycoef(P,J,zz);
2747: R = cons(RR,R);
2748: }
2749: return R;
2750: }
2751:
2752: def myimage(M)
2753: {
2754: if(getopt(opt) == 1)
2755: M = mtranspose(M);
2756: S = size(M);
2757: V = [];
2758: M0 = newvect(S[1]);
2759: M = mtoupper(M,0|opt=1);
2760: for(I = S[0]-1; I >= 0; I--)
2761: if(M0 != M[I])
2762: V = cons(vtozv(M[I])[0], V);
2763: return V;
2764: }
2765:
2766: def mymod(V,L)
2767: {
2768: Opt = getopt(opt);
2769: S = length(V);
2770: VP = newvect(S);
2771: if(type(L)==6)
2772: L=m2lv(L);
2773: CT = length(L);
2774: for(LT = L; LT != []; LT = cdr(LT)){
2775: for(VT = car(LT), I = 0; I < S; I++)
2776: if(VT[I] != 0) break;
2777: if(I >= S){
2778: CT--;
2779: continue;
2780: }
2781: VP[I] = 1;
2782: MI = -red(V[I]/VT[I]);
2783: if(MI != 0)
2784: V = radd(V,rmul(MI,VT));
2785: }
2786: if(Opt==1){
2787: for(I = 0; I < S; I++)
2788: if(V[I] != 0)
2789: return 1;
2790: return 0;
2791: }
2792: if(Opt==2){
2793: W=newvect(S-CT);
2794: for(CC = I = 0; I < S; I++){
2795: if(VP[I]==0) W[CC++] =V[I];
2796: }
2797: return W;
2798: }
2799: return V;
2800: }
2801:
2802: def mmod(M,L)
2803: {
2804: S=size(M)[1];
2805: MM=mtranspose(M);
2806: VP = newvect(S);
2807: if(type(L)==6)
2808: L=m2lv(L);
2809: for(CT = 0, LT = L; LT != []; LT = cdr(LT)){
2810: for(VT = car(LT), I = 0; I < S; I++){
2811: if(VT[I] != 0){
2812: VP[I] = 1;
2813: break;
2814: }
2815: }
2816: }
2817: if(getopt(opt)==1)
2818: NE=1;
2819: for(D=I=0; I<S; I++){
2820: if(NE != 1 && VP[I] == 1) continue;
2821: T = mymod(MM[I],L|opt=2);
2822: if(D==0){
2823: K=length(T);
2824: MN=newmat((NE==1)?S:K,K);
2825: }
2826: for(J=0;J<K;J++)
2827: MN[J][D]=T[J];
2828: D++;
2829: }
2830: return MN;
2831: }
2832:
1.3 takayama 2833: def llsize(V)
2834: {
2835: for(I=J=0;V!=[];V=cdr(V),I++)
2836: if(length(car(V))>J) J=length(car(V));
2837: return [I,J];
2838: }
2839:
1.1 takayama 2840: def llbase(VV,L)
2841: {
2842: S = length(VV);
2843: V = dupmat(VV);
2844: if(type(V) == 4)
2845: V = ltov(V);
2846: T = length(L);
2847: for(I = 0; I < S; I++)
2848: V[I] = nm(red(V[I]));
2849: LV = 0;
2850: for(J = 0; J < T; J++){
2851: X = var(L[J]); N = deg(L[J],X);
2852: for(I = LV; I < S; I++){
2853: if((C2=coef(V[I],N,X)) != 0){
2854: if(I > LV){
2855: Temp = V[I];
2856: V[I] = V[LV];
2857: V[LV] = Temp;
2858: }
2859: for(I = 0; I < S; I++){
2860: if(I == LV || (C1 = coef(V[I],N,X)) == 0)
2861: continue;
2862: Gcd = gcd(C1,C2);
2863: V[I] = V[I]*tdiv(C2,Gcd)-V[LV]*tdiv(C1,Gcd);
2864: }
2865: LV++;
2866: }
2867: }
2868: }
1.4 ! takayama 2869: return V;
! 2870: /* return map(ptozp,V); */
1.1 takayama 2871: }
2872:
2873: def lsort(L1,L2,T)
2874: {
2875: if(type(T)==7)
2876: T = findin(T,["cup","setminus","cap","reduce"]);
2877: if(L2 == []){
2878: if(T == 2) return L2;
2879: if(T == 3) return [L1,L2];
2880: L1 = ltov(L1); qsort(L1);
2881: if(T != 1)
2882: return vtol(L1);
2883: L3 = [];
2884: for(I = length(L1)-1; I >= 0; I--){
2885: if(I > 0 && L1[I] == L1[I-1])
2886: continue;
2887: L3 = cons(L1[I], L3);
2888: }
2889: return L3;
2890: }
2891: if(T == 1 || T == 2){
2892: L1 = lsort(L1,[],1);
2893: L2 = lsort(L2,[],1);
2894: L3 = [];
2895: if(T == 1){
2896: while(L1 != []){
2897: if(L2 == [] || car(L1) < car(L2)){
2898: L3 = cons(car(L1), L3);
2899: L1 = cdr(L1);
2900: continue;
2901: }
2902: if(car(L1) > car(L2)){
2903: L2 = cdr(L2);
2904: continue;
2905: }
2906: L1 = cdr(L1); L2 = cdr(L2);
2907: }
2908: return reverse(L3);
2909: }
2910: if(T==2){
2911: while(L1 != [] && L2 != []){
2912: if(car(L1) != car(L2)){
2913: if(car(L1) <= car(L2))
2914: L1 = cdr(L1);
2915: else L2 = cdr(L2);
2916: continue;
2917: }
2918: while(car(L1) == car(L2))
2919: L1 = cdr(L1);
2920: L3 = cons(car(L2), L3);
2921: }
2922: return reverse(L3);
2923: }
2924: }
2925: if(T==3){
2926: L1 = qsort(L1); L2 = qsort(L2);
2927: L3 = L4 = [];
2928: while(L1 != [] && L2 != []){
2929: if(car(L1) == car(L2)){
2930: L1 = cdr(L1); L2 = cdr(L2);
2931: }else if(car(L1) < car(L2)){
2932: L3 = cons(car(L1),L3);
2933: L1 = cdr(L1);
2934: }else{
2935: L4 = cons(car(L2), L4);
2936: L2 = cdr(L2);
2937: }
2938: }
2939: L4 = append(reverse(L4),L2);
2940: L3 = append(reverse(L3),L1);
2941: return [L3,L4];
2942: }
2943: L1 = append(L1,L2);
2944: return lsort(L1,[],1);
2945: }
2946:
1.3 takayama 2947: def lmax(L)
2948: {
2949: if(type(L)==4){
2950: V=car(L);
2951: while((L=cdr(L))!=[])
2952: if(V < car(L)) V=car(L);
2953: return V;
2954: }else if(type(L)==5||type(L)==6)
2955: return lmax(m2l(L));
2956: return [];
2957: }
2958:
2959: def lmin(L)
2960: {
2961: if(type(L)==4){
2962: V=car(L);
2963: while((L=cdr(L))!=[])
2964: if(V > car(L)) V=car(L);
2965: return V;
2966: }else if(type(L)==5||type(L)==6)
2967: return lmin(m2l(L));
2968: return [];
2969: }
2970:
1.4 ! takayama 2971: def lgcd(L)
! 2972: {
! 2973: if(type(L)==4){
! 2974: F=getopt(poly);
! 2975: V=car(L);
! 2976: while((L=cdr(L))!=[]&&V!=1){
! 2977: if(V!=0){
! 2978: V=(F==1)?V=gcd(V,car(L)):igcd(V,car(L));
! 2979: }
! 2980: }
! 2981: return V;
! 2982: }else if(type(L)==5||type(L)==6)
! 2983: return lgcd(m2l(L)|option_list=getopt());
! 2984: return [];
! 2985: }
! 2986:
! 2987:
! 2988: def ldev(L,S)
! 2989: {
! 2990: M=abs(lmax(L));N=abs(lmin(L));
! 2991: if(M<N) M=N;
! 2992: for(C=0,LT=L;;C++){
! 2993: LT=ladd(LT,S,1);
! 2994: MT=abs(lmax(LT));NT=abs(lmin(LT));
! 2995: if(MT<NT) MT=NT;
! 2996: if(MT>=M) break;
! 2997: M=MT;
! 2998: }
! 2999: if(!C){
! 3000: for(C=0,LT=L;;C--){
! 3001: LT=ladd(LT,S,-1);
! 3002: MT=abs(lmax(LT));NT=abs(lmin(LT));
! 3003: if(MT<NT) MT=NT;
! 3004: if(MT>=M) break;
! 3005: M=MT;
! 3006: }
! 3007: }
! 3008: return [C,ladd(L,S,C)];
! 3009: }
! 3010:
1.1 takayama 3011: def lchange(L,P,V)
3012: {
1.4 ! takayama 3013: if(getopt(flat)==1&&type(P)==4){
! 3014: for(L=ltov(L);P!=[];P=cdr(P),V=cdr(V))
! 3015: L[car(P)]=car(V);
! 3016: return vtol(L);
! 3017: }
1.1 takayama 3018: if(type(P)==4){
3019: IP=car(P); P=cdr(P);
3020: }else{
3021: IP=P; P=[];
3022: }
3023: for(I=0, LL=[], LT=L; LT!=[]; I++,LT=cdr(LT)){
3024: if(I==IP){
3025: LL=cons((P==[])?V:lchange(car(LT),P,V),LL);
3026: }else
3027: LL=cons(car(LT),LL);
3028: }
3029: return reverse(LL);
3030: }
3031:
3032: def lsol(VV,L)
3033: {
3034: if(type(VV)<4 && type(L)==2)
3035: return red(L-VV/mycoef(VV,1,L));
3036: S = length(VV);
3037: T = length(L);
3038: V = llbase(VV,L);
3039: for(J = K = 0; J < T; J++){
3040: X = var(L[J]); N = deg(L[J],X);
3041: for(I = K; I < S; I++){
3042: if((C=mycoef(V[I], N, X)) != 0){
3043: V[I] = [L[J],red(X^N-V[I]/C)];
3044: K++;
3045: break;
3046: }
3047: }
3048: }
3049: return V;
3050: }
3051:
3052: def lnsol(VV,L)
3053: {
3054: LL=lsort(vars(VV),L,1);
3055: VV=ptol(VV,LL|opt=0);
3056: return lsol(VV,L);
3057: }
3058:
3059:
1.4 ! takayama 3060: def ladd(X,Y,M)
1.3 takayama 3061: {
3062: if(type(X)==4) X=ltov(X);
3063: if(type(Y)==4) Y=ltov(Y);
1.4 ! takayama 3064: return vtol(X+M*Y);
1.3 takayama 3065: }
3066:
3067: def mrot(X)
3068: {
3069: if(getopt(deg)==1) X=@pi*X/180;
3070: X=deval(X);
3071: return mat([dcos(X),dsin(X)],[-dsin(X),dcos(X)]);
3072: }
3073:
1.1 takayama 3074: def m2v(M)
3075: {
3076: S = size(M);
3077: V = newvect(S[0]*S[1]);
3078: for(I = C = 0; I < S[0]; I++){
3079: MI = M[I];
3080: for(J = 0; J < S[1]; J++)
3081: V[C++] = MI[J];
3082: }
3083: return V;
3084: }
3085:
3086: def lv2m(L)
3087: {
3088: if(type(L)==5) L=vtol(L);
3089: II=length(L);
3090: for(J=1,T=L; T!=[]; T=cdr(T))
1.3 takayama 3091: if(length(car(T))>JJ) JJ=length(car(T));
1.1 takayama 3092: M = newmat(II,JJ);
1.3 takayama 3093: N = getopt(null);
1.1 takayama 3094: if(type(N)<0) N=0;
3095: for(I=0; I<II; I++){
3096: V=car(L); L=cdr(L);
1.3 takayama 3097: for(J=length(V);--J>=0;)
1.1 takayama 3098: M[I][J] = V[J];
3099: if(N!=0){
3100: for(J=length(V); J<JJ; J++)
3101: M[I][J]=N;
3102: }
3103: }
3104: return M;
3105: }
3106:
3107: def m2lv(M)
3108: {
3109: I=size(M)[0];
3110: for(N=[],I=size(M)[0];I-->0;)
3111: N=cons(M[I],N);
3112: return N;
3113: }
3114:
3115: def s2m(S)
3116: {
1.4 ! takayama 3117: if(type(S)==6) return S;
1.1 takayama 3118: if(type(S)==7){
3119: if(str_chr(S,0,"[")!=0) S=s2sp(S);
3120: else if(str_chr(S,0,",")>=0) return eval_str(S);
3121: else{
3122: for(L=LL=[],I=0; ; ){
3123: II=str_chr(S,I+2,"]");
3124: if(II<0) return 0;
3125: J=str_chr(S,I+2," ");
3126: while(str_chr(S,J+1," ")==J+1) J++;
3127: if(J>II-2 || J<0) J=II;
3128: V=eval_str(sub_str(S,I+1,J-1));
3129: L=cons(V,L);
3130: I=J;
3131: if(J==II){
3132: LL=cons(ltov(reverse(L)),LL);
3133: L=[];
3134: if((I=str_chr(S,II+1,"["))<0)
3135: return lv2m(reverse(LL));
3136: }
3137: }
3138: }
3139: }
3140: if(type(S)==5) S=vtol(S);
3141: if(type(S[0])==5) return lv2m(S);
3142: I=length(S);
3143: for(J=1,T=S; T!=[]; T=cdr(T))
3144: if(length(car(T))>J) J=length(car(T));
3145: return newmat(I,J,S);
3146: }
3147:
1.3 takayama 3148: def c2m(L,V)
3149: {
3150: if(type(Pow=getopt(pow))!=1){
3151: if(isvar(V)==1){
3152: for(Pow=0,LT=L;LT!=[];LT=cdr(LT)){
3153: if(mydeg(car(LT),V)>JJ) Pow=mydeg(car(LT),V);
3154: }
3155: JJ=Pow+1;
3156: }else{
3157: Pow=-1;
3158: JJ=length(V);
3159: }
3160: }else JJ=Pow+1;
3161: M=newmat(length(L),JJ);
3162: for(I=0;L!=[];L=cdr(L),I++){
3163: for(J=0;J<JJ;J++){
3164: LT=car(L);
3165: M[I][J]=(Pow>=0)?mycoef(LT,J,V):mycoef(LT,1,V[J]);
3166: }
3167: }
3168: return M;
3169: }
3170:
1.1 takayama 3171: #if 0
3172: def m2diag(M,N)
3173: {
3174: S = size(M);
3175: MM = mtoupper(M,N);
3176: for(I = S[0]-1; I >= 0; I--){
3177: for(J = 0; I < S[1]-N; I++){
3178: if(MM[I][J] != 0){
3179: P = MM[I][J];
3180: for(K = 0; K < I; K++){
3181: Q = -rmul(MM[K][J],1/P);
3182: MM[K][J] = 0;
3183: if(Q != 0){
3184: for(L = J+1; L < S[1]; L++){
3185: if(MM[I][L] != 0)
3186: MM[K][L] = radd(MM[K][L], rmul(MM[I][L],Q));
3187: }
3188: }
3189: }
3190: }
3191: }
3192: }
3193: return MM;
3194: }
3195: #endif
3196:
3197: def myinv(M)
3198: {
3199: S = size(M);
3200: if((T=S[0]) != S[1])
3201: return 0;
3202: MM = mtoupper(M,-T|opt=2);
3203: if(MM[T-1][T-1] != 1) return 0;
3204: return mperm(MM,0,[T,[T]]);
3205: }
3206:
3207: def madj(G,M)
3208: {
3209: H=myinv(G);
3210: if(type(M)==6)
3211: return rmul(rmul(G,M),H);
3212: if(type(M)==4||type(M)==5){
3213: L=length(M);
3214: N=newvect(L);
3215: for(I=0;I<L;I++){
3216: N[I]=rmul(rmul(G,M[I]),H);
3217: }
3218: if(type(N)==4) N=vtol(N);
3219: return N;
3220: }
3221: return -1;
3222: }
3223:
3224: def mpower(M,N)
3225: {
3226: if(type(M)<=3) return (red(M))^N;
3227: S = size(M);
3228: if(S[0] != S[1])
3229: return 0;
3230: if(N == 0) return mgen(S[0],0,[1],0);
3231: if(N < 0)
3232: return(mpower(myinv(M), -N));
3233: R = dupmat(M);
3234: V=1;
3235: for(V=1;;){
3236: if(iand(N,1)){
3237: V=map(red,R*V);
3238: N--;
3239: }
3240: if((N/=2)==0) break;
3241: R=map(red,R*R);
3242: }
3243: return V;
3244: }
3245:
3246: def texlen(S)
3247: {
3248: if(type(S)!=7) return 0;
3249: LF=I=J=0;
3250: LM=str_len(S);
3251: while((I=str_str(S,"\\frac{"|top=J))>=0){
3252: if(I>J) LF+=texlen(str_cut(S,J,I-1));
3253: I+=6;
3254: for(F=L=0,J=I;F<2 && J<LM-1;F++){
3255: for(C=1;C>0 && J<LM;){
3256: if((K0=str_char(S,J,"}"))<0) K0=LM;
3257: if((K1=str_char(S,J,"{"))<0) K1=LM;
3258: if(K0<0 && K1<0){
3259: J = str_len(S)-1;
3260: break;
3261: }
3262: if(K0<K1){
3263: J=K0+1; C--;
3264: }else{
3265: J=K1+1; C++;
3266: }
3267: }
3268: T=str_cut(S,I,J-1);
3269: if(F==0){
3270: I=J=K1+1;C=1;
3271: }else J=K0+1;
3272: if(type(T)==7 && (LL=texlen(T))>L) L=LL;
3273: }
3274: LF+=L;
3275: }
3276: if(J>0) S=str_cut(S,J,str_len(S)-1);
3277: if(S==0) return LF;
3278: S=ltov(strtoascii(S));
3279: L=LL=length(S);
3280: for(I=F=0; I<L; I++){
3281: if(S[I]==92) F=1;
3282: else if(F==1){
3283: if((S[I]>96 && S[I]<123)||(S[I]>64 && S[I]<91)) LL--;
3284: else F=0;
3285: }
3286: if(S[I]<=32||S[I]==123||S[I]==125||S[I]==94||S[I]==38) LL--; /* {}^& */
3287: else if(S[I]==95){
3288: LL--;
3289: if(I+2<L && S[I+2]==94) LL--; /* x_2^3 */
3290: else if(I+6<L && S[I+1]==123 && S[I+4]==125){ /* x_{11}^2 */
3291: if(S[I+5]==94 || (S[I+5]==125 && S[I+6]==94)) LL-- ; /* x_{11}}^2 */
3292: }
3293: }
3294: }
3295: return LL+LF;
3296: }
3297:
3298: def isdif(P)
3299: {
3300: if(type(P)<1 || type(P)>3) return 0;
3301: for(Var=[],R=vars(P);R!=[];R=cdr(R)){
3302: V0=rtostr(car(R));
3303: if(V0>"d" && V0<"e"){
3304: V=sub_str(V0,1,str_len(V0)-1);
3305: if(V>="a" && V<"{") Var=cons([strtov(V),strtov(V0)],Var);
3306: }
3307: }
3308: if(Var==[]) return 0;
3309: for(V=Var; V!=[]; V=cdr(V))
3310: if(ptype(P,car(V)[1])==3) return 0;
3311: return Var;
3312: }
3313:
1.4 ! takayama 3314: def texsp(P)
! 3315: {
! 3316: Q=strtoascii(P);
! 3317: if((J=str_char(Q,0,92))<0 || (C=Q[L=str_len(P)-1])==32||C==41||C==125)
! 3318: return P;
! 3319: for(;;){
! 3320: if((I=str_char(Q,J+1,92))<0) break;
! 3321: J=I;
! 3322: };
! 3323: for(I=J+1;I<L&&isalpha(Q[I]);I++);
! 3324: return(I==L)?P+" ":P;
! 3325: }
! 3326:
1.1 takayama 3327: def fctrtos(P)
3328: {
3329: /* extern TeXLim; */
3330:
3331: if(!chkfun("write_to_tb", "names.rr"))
3332: return 0;
3333:
3334: TeX = getopt(TeX);
3335: if(TeX != 1 && TeX != 2 && TeX != 3)
3336: TeX = 0;
3337: if((Dvi=getopt(dviout)==1) && TeX<2) TeX=3;
3338: if(TeX>0){
3339: Lim=getopt(lim);
3340: if(Lim!=0 && TeX>1 && (type(Lim)!=1||Lim<30)) Lim=TeXLim;
3341: else if(type(Lim)!=1) Lim=0;
3342: CR=(TeX==2)?"\\\\\n":"\\\\\n&";
1.3 takayama 3343: if(TeX==1 || Lim==0) CR="";
1.1 takayama 3344: else if((Pages=getopt(pages))==1) CR="\\allowdisplaybreaks"+CR;
3345: if(!chkfun("print_tex_form", "names.rr"))
3346: return 0;
3347: Small=getopt(small);
3348: }
3349: Dif=getopt(dif);
3350: Var=getopt(var);
3351: if(Lim>0 && type(Var)<2 && TeX!=1) Var=[strtov("0"),""];
3352: Dif=0;
3353: if(Var=="dif"){
3354: Dif=DV=1;
3355: }else if (Var=="dif0") Dif=1;
3356: else if(Var=="dif1") Dif=2;
3357: else if(Var=="dif2") Dif=3;
3358: if(Dif>0){
3359: for(Var=[],R=vars(P);R!=[];R=cdr(R)){
3360: V=rtostr(car(R));
3361: if(V>"d" && V<"e"){
3362: V=sub_str(V,1,str_len(V)-1);
3363: if(V>="a" && V<"{"){
3364: if(TeX>0){
3365: V=my_tex_form(strtov(V));
3366: if(Dif>=1){
3367: if(Dif==1){
3368: if(str_len(V)==1) V="\\partial_"+V;
3369: else V="\\partial_{"+V+"}";
3370: }
3371: Var=cons([car(R),V],Var);
3372: }
3373: else Var=cons([car(R)],Var);
3374: }else Var=cons([car(R)],Var);
3375: }
3376: }
3377: }
3378: if(TeX>0){
3379: if(length(Var)==1){
3380: if(DV==1 && str_len(Var[0][1])==10) Var=[[Var[0][0],"\\partial"]];
3381: }else if(DV==1){
3382: for(V=Var;V!=[];V=cdr(V)){
3383: VV=rtostr(car(V)[0]);
3384: if(VV<"dx0" || VV>= "dx:" || str_len(VV)>4) break;
3385: }
3386: if(V==[]){
3387: for(VT=[],V=Var;V!=[];V=cdr(V)){
3388: VV=str_cut(rtostr(car(V)[0]),2,3);
3389: if(str_len(VV)==1) VT=cons([car(V)[0],"\\partial_"+VV],VT);
3390: else VT=cons([car(V)[0],"\\partial_{"+VV+"}"],VT);
3391: }
3392: Var=reverse(VT);
3393: }
3394: }else
3395: if(Dif==2 && length(Var)>1) Dif=3;
3396: }
3397: if(Dif>0) Dif--;
3398: }
3399: if(type(Var)>1 && Var!=[]){ /* as a polynomial of Var */
3400: Add=getopt(add);
3401: if(type(Add)>0){
3402: if(type(Add)!=7){
3403: Add=my_tex_form(Add);
3404: if(str_char(Add,0,"-")>=0 || str_char(Add,0,"+")>=0) Add="("+Add+")";
3405: }
3406: if(str_char(Add,0,"(")!=0) Add = " "+Add;
3407: }else Add=0;
3408: if(type(Var)!=4) Var=[Var];
3409: if(length(Var)==2 && type(Var[1]) == 7)
3410: Var = [Var];
3411: for(VV=VD=[]; Var!=[];Var=cdr(Var)){
3412: VT=(type(car(Var))==4)?car(Var):[car(Var)];
3413: VT0=var(car(VT));
3414: VV=cons(VT0,VV);
3415: if(length(VT)==1){
3416: VD=cons((TeX>=1)?my_tex_form(VT0):rtostr(VT0),VD);
3417: }else VD=cons(VT[1],VD);
3418: }
3419: VV=reverse(VV);VD=reverse(VD);
3420: Rev=(getopt(rev)==1)?1:0;
3421: Dic=(getopt(dic)==1)?1:0;
3422: TT=terms(P,VV|rev=Rev,dic=Dic);
3423: if(TeX==0){
3424: Pre="("; Post=")";
1.3 takayama 3425: }else{
1.1 takayama 3426: Pre="{"; Post="}";
3427: }
3428: Out = string_to_tb("");
3429: for(L=C=0,Tm=TT;Tm!=[];C++,Tm=cdr(Tm)){
3430: for(I=0,PC=P,T=cdr(car(Tm)),PW="";T!=[];T=cdr(T),I++){
3431: PC=mycoef(PC,D=car(T),VV[I]);
3432: if(PC==0) continue;
3433: PT="";
3434: if(D!=0 && VD[I]!=""){
3435: if(TeX==0 && PW!="") PW+="*";
3436: if(D>1){
3437: if(D>9) PT="^"+Pre+rtostr(D)+Post;
3438: else PT="^"+rtostr(D);
3439: }
3440: if(Dif>0) PW+=(Dif==1)?"d":"\\partial ";
3441: PW+=VD[I]+PT;
3442: }
3443: }
3444: D=car(Tm)[0];
3445: if(Dif>0 && D>0){
3446: Op=(Dif==1)?"\\frac{d":"\\frac{\\partial";
3447: if(D>1) Op+="^"+((D>9)?(Pre+rtostr(D)+Post):rtostr(D));
3448: PW=Op+Add+"}{"+PW+"}";
3449: }else if(Add!=0) PW=PW+Add;
1.3 takayama 3450: if(TeX>=1){
3451: if(type(PC)==1 && ntype(PC)==0 && PC<0)
3452: OC="-"+my_tex_form(-PC);
3453: else OC=fctrtos(PC|TeX=1,br=1);
3454: }else OC=fctrtos(PC|br=1);
1.1 takayama 3455: if(PW!=""){
3456: if(OC == "1") OC = "";
3457: else if(OC == "-1") OC = "-";
3458: }
3459: if(TeX==0 && D!=0 && OC!="" && OC!="-") PW= "*"+PW;
3460: if((TOC=type(OC)) == 4){ /* rational coef. */
3461: if(Lim>0 && (texlen(OC[0])>Lim || texlen(OC[0])>Lim)){
3462: OC = (Small==1)?"("+OC[0]+")/("+OC[1]+")"
3463: :"\\Bigl("+OC[0]+"\\Bigr)\\Bigm/\\Bigl("+OC[1]+"\\Bigr)";
3464: TOC = 7;
3465: }else{
3466: if(str_char(OC[0],0,"-")==0){
1.3 takayama 3467: OC = fctrtos(-PC|TeX=1,br=1);
3468: OC = "-\\frac{"+OC[0]+"}{"+OC[1]+"}";
1.1 takayama 3469: }
3470: else
3471: OC = "\\frac{"+OC[0]+"}{"+OC[1]+"}";
3472: }
3473: }
3474: if(Lim>0){
3475: LL=texlen(OC)+texlen(PW);
3476: if(LL+L>=Lim){
3477: if(L>0) str_tb(CR,Out);
3478: if(LL>Lim){
3479: if(TOC==7) OC=texlim(OC,Lim|cut=CR);
3480: PW+=CR; L=0;
3481: }else L=LL;
3482: }else L+=LL;
3483: }else if(length(Tm)!=1) PW += CR; /* not final term */
1.4 ! takayama 3484: if(TeX) OC=texsp(OC);
1.1 takayama 3485: if(str_chr(OC,0,"-") == 0 || C==0) str_tb([OC,PW], Out);
3486: else{
3487: str_tb(["+",OC,PW],Out);
3488: if(LL<=Lim) L++;
3489: }
3490: }
3491: S=str_tb(0,Out);
1.3 takayama 3492: if(S=="") S="0";
1.1 takayama 3493: }else{ /* Var is not specified */
3494: if((TP=type(P)) == 3){ /* rational function */
3495: P = red(P); Nm=nm(P); Dn=dn(P);
3496: Q=dn(ptozp(Nm|factor=1)[1]);
3497: if(Q>1){
3498: Nm*=Q;Dn*=Q;
3499: }
3500: if(TeX>0){
3501: return (TeX==2)?
3502: "\\frac\{"+fctrtos(Nm|TeX=1)+"\}\{"+fctrtos(Dn|TeX=1)+"\}"
3503: :[fctrtos(Nm|TeX=1),fctrtos(Dn|TeX=1)];
3504: }
1.4 ! takayama 3505: else{
! 3506: S=fctrtos(Nm);
! 3507: if(nmono(Nm)>1) S="("+S+")";
! 3508: return S+"/("+fctrtos(Dn)+")";
! 3509: }
1.1 takayama 3510: }
1.4 ! takayama 3511: if(imag(P)==0) P = fctr(P); /* usual polynomial */
! 3512: else P=[[P,1]];
1.1 takayama 3513: S = str_tb(0,0);
3514: for(J = N = 0; J < length(P); J++){
3515: if(type(P[J][0]) <= 1){
3516: if(P[J][0] == -1){
3517: write_to_tb("-",S);
3518: if(length(P) == 1)
3519: str_tb("1", S);
3520: }else if(P[J][0] != 1){
3521: str_tb((TeX>=1)?my_tex_form(P[J][0]):rtostr(P[J][0]), S);
3522: N++;
3523: }else if(length(P) == 1)
3524: str_tb("1", S);
3525: else if(getopt(br)!=1 && length(P) == 2 && P[1][1] == 1){
3526: str_tb((TeX>=1)?my_tex_form(P[1][0]):rtostr(P[1][0]), S);
3527: J++;
3528: }
3529: continue;
3530: }
3531: if(N > 0 && TeX != 1 && TeX != 2 && TeX != 3)
3532: write_to_tb("*", S);
1.4 ! takayama 3533: SS=(TeX>=1)?my_tex_form(P[J][0]):rtostr(P[J][0]);
1.1 takayama 3534: N++;
1.4 ! takayama 3535: if(P[J][1] != 1){ /* (log(x))^2 */
! 3536: if(nmono(P[J][0])>1||
! 3537: (!isvar(P[J][0])||vtype(P[J][0]))&&str_len(SS)>1) SS="("+SS+")";
! 3538: write_to_tb(SS,S);
! 3539: str_tb(["^", (TeX>1)?rtotex(P[J][1]):monotos(P[J][1])],S);
! 3540: }else{
! 3541: if(nmono(P[J][0])>1) SS="("+SS+")";
! 3542: write_to_tb(SS,S);
! 3543: }
1.1 takayama 3544: }
3545: S = str_tb(0,S);
3546: if((Lim>0 || TP!=2) && CR!="") S=texlim(S,Lim|cut=CR);
3547: }
3548: if(TeX>0){
3549: if(Small==1) S=str_subst(S,"\\frac{","\\tfrac{");
3550: if(Dvi==1){
1.4 ! takayama 3551: dviout(strip(S,"(",")")|eq=(Pages==1)?6:0); S=1;
1.1 takayama 3552: }
3553: }
3554: return S;
3555: }
3556:
1.4 ! takayama 3557: def strip(S,S0,S1)
! 3558: {
! 3559: SS=strtoascii(S);
! 3560: if(length(SS)>1){
! 3561: if(SS[0]==40&&SS[length(SS)-1]==41&&str_pair(SS,1,S0,S1)==length(SS)-1)
! 3562: S=str_cut(SS,1,length(SS)-2);
! 3563: }
! 3564: return S;
! 3565: }
! 3566:
1.1 takayama 3567: def texlim(S,Lim)
3568: {
3569: /* extern TeXLim; */
3570: if(S==1 && Lim>10){
3571: TeXLim=Lim;
3572: mycat(["Set TeXLim =",Lim]);
3573: return 1;
3574: }
3575: if(type(Out=getopt(cut))!=7) Out="\\\\\n&";
3576: if(type(Del=getopt(del))!=7) Del=Out;
3577: if(Lim<30) Lim=TeXLim;
3578: S=ltov(strtoascii(S));
3579: for(L=[0],I=F=0;F==0; ){
3580: II=str_str(S,Del|top=I)+2;
3581: if(II<2){
3582: F++;II=/* str_len(S) */ length(S)-1;
3583: }
3584: for(J=JJ=I+1;;JJ=K+1){
3585: K=str_char(S,JJ,43); /* + */
3586: if((K1=str_char(S,JJ,45))>2 && K1<K){ /* - */
3587: if(S[K1-1]!=123 && S[K1-1]!=40) K=K1; /* {, ( */
3588: }
3589: if((K1=str_char(S,JJ,40))>0 && K1-JJ>6 && K1<K && S[K1-1]!=43 && S[K1-1]!=45){ /* ( */
3590: T=str_char(S,K1-6,"\\"); /* \Big*(, \big*( */
3591: if((T==K1-6 || T==K1-5)
3592: && (str_str(S,"big"|top=T+1,end=T+1)>0 || str_str(S,"Big"|top=T+1,end=T+1)>0))
3593: K=T;
3594: else if(K1>0 && K1<K) K=K1;
3595: }
3596: if(K<0 || K>II) break;
3597: if(K-J>Lim && texlen(str_cut(S,J,K-1))>=Lim){
3598: J=K+1; L=cons(JJ-1,L); SL=0;
3599: }
3600: }
3601: I=II;
3602: }
3603: SS=str_tb(0,0);
3604: L=cons(length(S),L);
3605: L=reverse(L);
3606: for(I=0; L!=[]; I=J,L=cdr(L)){
3607: str_tb((I==0)?"":Out,SS);
3608: J=car(L);
3609: str_tb(str_cut(S,I,J-1),SS);
3610: }
3611: return str_tb(0,SS);
3612: }
3613:
3614: def fmult(FN,M,L,N)
3615: {
1.3 takayama 3616: Opt=getopt();
1.1 takayama 3617: for(I = 0; I < length(M); I++)
1.3 takayama 3618: M = call(FN, cons(M,cons(L[I],N))|option_list=Opt);
1.1 takayama 3619: return M;
3620: }
3621:
3622: def radd(P,Q)
3623: {
3624: if(type(P) <= 3 || type(Q) <= 3){
3625: if(type(P) >= 5)
3626: return radd(Q,P);
3627: if(type(Q) >= 5){
3628: R = dupmat(Q);
3629: if(P == 0)
3630: return R;
3631: if(type(Q) == 6){
3632: S = size(Q);
3633: if(S[0] != S[1])
3634: return 0;
3635: for(I = 0; I < S[0]; I++)
3636: R[I][I] = radd(R[I][I], P);
3637: }else{
3638: for(I = length(R)-1; I >= 0; I--)
3639: R[I] = radd(R[I],P);
3640: }
3641: return R;
3642: }
3643: /* P=red(P);Q=red(Q); */
3644: if((P1=dn(P)) == (Q1=dn(Q))){
3645: if(P1==1) return P+Q;
3646: return red((nm(P)+nm(Q))/P1);
3647: }
3648: R=gcd(P1,Q1);S=tdiv(P1,R);
3649: return red((nm(P)*tdiv(Q1,R)+nm(Q)*S)/(S*Q1));
3650: }
3651: if(type(P) == 5){
3652: S = length(P);
3653: R = newvect(S);
3654: for(I = 0; I < S; I++)
3655: R[I] = radd(P[I],Q[I]);
3656: return R;
3657: }
3658: if(type(P) == 6){
3659: S = size(P);
3660: R = newmat(S[0],S[1]);
3661: for(I = 0; I < S[0]; I++){
3662: for(J = 0; J < S[1]; J++)
3663: R[I][J] = radd(P[I][J],Q[I][J]);
3664: }
3665: return R;
3666: }
3667: erno(0);
3668: }
3669:
3670: def getel(M,I)
3671: {
3672: if(type(M) >= 4 && type(M) <= 6 && type(I) <= 1)
3673: return M[I];
3674: if(type(M) == 6 && type(I) == 5)
3675: return M[I][J];
3676: return M;
3677: }
3678:
3679: def ptol(P,X)
3680: {
3681: F=(getopt(opt)==0)?0:1;
3682: if(type(P) <= 3)
3683: P = [P];
3684: if(type(X) == 4){
3685: for( ; X != []; X = cdr(X))
3686: P=ptol(P,car(X)|opt=F);
3687: return P;
3688: }
3689: P = reverse(P);
3690: for(R=[]; P != []; P = cdr(P)){
3691: Q = car(P);
3692: for(I = mydeg(Q,X); I >= 0; I--){
3693: S=mycoef(Q,I,X);
3694: if(F==1 || S!=0) R = cons(S,R);
3695: }
3696: }
3697: return R;
3698: }
3699:
3700: def rmul(P,Q)
3701: {
3702: if(type(P) <= 3 && type(Q) <= 3){
3703: P=red(P);Q=red(Q);
3704: P1=dn(P);P2=nm(P);Q1=dn(Q);Q2=nm(Q);
3705: if(P1==1 && Q1==1)
3706: return P*Q;
3707: if((R=gcd(P1,Q2)) != 1){
3708: P1=tdiv(P1,R);Q2=tdiv(Q2,R);
3709: }
3710: if((R=gcd(Q1,P2)) != 1){
3711: Q1=tdiv(Q1,R);P2=tdiv(P2,R);
3712: }
3713: return P2*Q2/(P1*Q1);
3714: }
1.3 takayama 3715: #ifdef USEMODULE
3716: return mmulbys(os_md.rmul,P,Q,[]);
3717: #else
1.1 takayama 3718: return mmulbys(rmul,P,Q,[]);
1.3 takayama 3719: #endif
1.1 takayama 3720: }
3721:
3722: def mtransbys(FN,F,LL)
3723: {
1.3 takayama 3724: Opt=getopt();
1.1 takayama 3725: if(type(F) == 4){
3726: F = ltov(F);
3727: S = length(F);
3728: R = newvect(S);
3729: for(I = 0; I < S; I++)
1.3 takayama 3730: R[I] = mtransbys(FN,F[I],LL|option_list=Opt);
1.1 takayama 3731: return vtol(R);
3732: }
3733: if(type(F) == 5){
3734: S = length(F);
3735: R = newvect(S);
3736: for(I = 0; I < S; I++)
1.3 takayama 3737: R[I] = mtransbys(FN,F[I],LL|option_list=Opt);
1.1 takayama 3738: return R;
3739: }
3740: if(type(F) == 6){
3741: S = size(F);
3742: R = newmat(S[0],S[1]);
3743: for(I = 0; I < S[0]; I++){
3744: for(J = 0; J < S[1]; J++)
1.3 takayama 3745: R[I][J] = mtransbys(FN,F[I][J],LL|option_list=Opt);
1.1 takayama 3746: }
3747: return R;
3748: }
1.4 ! takayama 3749: if(type(F) == 7) return F;
1.3 takayama 3750: return call(FN, cons(F,LL)|option_list=Opt);
3751: }
3752:
3753: def drawopt(S,T)
3754: {
3755: if(type(S)!=7) return -1;
3756: if(T==0||T==1){
3757: for(I=0,R=LCOPT;I<7;I++,R=cdr(R))
3758: if(str_str(S,car(R))>=0) return(T==0)?COLOPT[I]:car(R);
3759: return -1;
3760: }
3761: if(T==2){
3762: V0=V1=0;
3763: for(I=0,R=LPOPT;R!=[];I++,R=cdr(R)){
3764: if(str_str(S,car(R))>=0){
3765: if(I==0) V1++;
3766: else if(I==1) V1--;
3767: else if(I==2) V0--;
3768: else V0++;
3769: }
3770: }
3771: if(V0==0&&V1==0) return -1;
3772: return [V0,V1];
3773: }
3774: if(T==3){
3775: V=0;
3776: for(I=1,R=LFOPT;R!=[];R=cdr(R),I*=2){
3777: if(str_str(S,car(R))>=0) V+=I;
3778: }
3779: return (V==0)?-1:V;
3780: }
3781: return -1;
3782: }
3783:
3784: def execdraw(L,P)
3785: {
3786: if((Proc=getopt(proc))!=1) Proc=0;
3787: if(type(P)<2) P=[P];
3788: if(L!=[]&&type(L[0])!=4) L=[L];
3789: /* special command */
3790: if(P[0]<0){
3791: if(length(P)==1&&(P[0]==-1||P[0]==-2||P[0]==-3)){ /* Bounding Box */
1.4 ! takayama 3792: W=WS=N=LS=0;
! 3793: for(LL=L;LL!=[];LL=cdr(LL)){
1.3 takayama 3794: T=car(LL);
3795: if(P[0]!=-3 && T[0]==0){
3796: if(length(T)>3) S=" by "+rtostr(T[3])+" cm";
3797: else S="";
3798: if(P[0]==-1){
3799: mycat(["Windows : ",T[1][0],"< x <",T[1][1],", ",
3800: T[2][0],"< y <",T[2][1],S]);
3801: if(length(T)>4 && type(T[4])==4) mycat(["ext :",T[4]]);
3802: if(length(T)>5) mycat(["shift :",T[5]]);
3803: }
3804: return cdr(T);
3805: }
3806: if(type(T[0])==1){
3807: if(T[0]==1){
1.4 ! takayama 3808: for(TT=cdr(cdr(T));TT!=[];TT=cdr(TT)){
! 3809: D=car(TT);
! 3810: if(type(D[0][0])==4){
! 3811: for(DT=D;DT!=[];DT=cdr(DT)){
! 3812: if(N++==0) W=ptbbox(car(DT));
! 3813: else W=ptbbox(car(DT)|box=W);
! 3814: }
! 3815: }else{
! 3816: if(N++==0) W=ptbbox(D);
! 3817: else W=ptbbox(D|box=W);
1.3 takayama 3818: }
3819: }
3820: }else if(T[0]==2){
3821: V=T[2];
1.4 ! takayama 3822: if(type(V[0])>1||type(V[1])>1) continue; /* not supported */
1.3 takayama 3823: if((Sc=delopt(T[1],"scale"|inv=1))!=[]){
3824: Sc=car(Sc)[1];
3825: if(type(Sc)==1) V=[Sc*V[0],Sc*V[1]];
3826: else V=[Sc[0]*V[0],Sc[1]*V[1]];
3827: }
3828: if(LS==0) WS=ptbbox([V]);
3829: else WS=ptbbox([V]|box=WS);
3830: if(length(T)>4) S=T[4];
1.4 ! takayama 3831: else if(type(S=T[3])==4){
! 3832: S=S[0];
! 3833: if(type(S)==4) S=S[length(S)-1];
! 3834: S=rtostr(S);
! 3835: }
1.3 takayama 3836: if(str_len(S)>LS) LS=str_len(S);
3837: }else if(T[0]==3||T[0]==4){
3838: if(N++==0) W=ptbbox(cdr(cdr(T)));
3839: else W=ptbbox(cdr(cdr(T))|box=W);
1.4 ! takayama 3840: }
1.3 takayama 3841: }
3842: }
1.4 ! takayama 3843: if(W!=0&&WS!=0) W=ptbbox([W,WS]|box=1);
1.3 takayama 3844: return (P[0]==-3)?[W,LS,WS]:W;
3845: }else if(length(P)>1&&P[0]==-1){ /* set Bounding Box */
3846: P=cons(0,cdr(P));
3847: Ex=Sft=[0,0];
3848: if(type(X=getopt(ext))==4) Ex=X;
3849: if(type(X=getopt(shift))==4) Sft=X;
3850: if(Ex!=Sft||Ex!=[0,0]){
3851: if(Sft==[0,0]) Sft=[Ex];
3852: else Sft=[Ex,Sft];
3853: if(length(P)==3) Sft=cons(1,Sft);
3854: if(length(P)==3||length(P)==4) P=append(P,Sft);
3855: }
3856: return cons(P,delopt(L,0));
3857: }
3858: if(P[0]==-4){
3859: for(N=0,LT=L;LT!=[];LT=cdr(LT)){ /* count coord. */
3860: T=car(LT);
3861: if(T[0]==1){
3862: for(T=cdr(cdr(T));T!=[];T=cdr(T)){
3863: if(type((S=car(T))[0][0])==4) N+=length(S);
3864: else for(;S!=[];S=cdr(S)) if(type(car(S))==4) N++;
3865: }
3866: }else if(T[0]==2) N++;
3867: else if(T[0]==3||T[0]==4) N+=2;
3868: }
3869: return N;
3870: }
3871: if(P[0]==-5){ /* functions */
3872: for(N=0,R=[],LT=L;LT!=[];LT=cdr(LT)){
3873: T=car(LT);
3874: if(T[0]==0) N=ior(N,1);
3875: else if(type(T[0])==1){
3876: if(T[0]>0) N=ior(N,2^T[0]);
3877: }
3878: else if(Type(T[0])==2){
3879: if(findin(T[0],R)<0) R=cons(T[0],R);
3880: }
3881: }
3882: for(I=5;I>=0;I--) if(iand(N,2^I)) R=cons(I,R);
3883: return R;
3884: }
3885: return 0;
3886: }
3887:
3888: if(length(P)>1){
3889: if(type(P[1])==6||(type(P[1])<2&&P[1]>0)) M=P[1];
3890: else if(type(P[1])==4&&length(P[1])==2) M=diagm(2,P[1]);
3891: }
3892: if(length(P)>2&&type(P[2])==4){
3893: Org=[["shift",P[2]]];
3894: if(M==0) M=1;
3895: }else Org=[];
3896: if(P[0]==0||(type(P[0])==4&&P[0][0]==0)){ /* Risa/Asir */
3897: PP=car(P);PPP=0;
3898: if(type(PP)!=4) PP=[PP];
3899: if(length(PP)<3){
3900: if(length(PP)==1 || type(PP[1])==4){
3901: if(ID_PLOT<0) ID_PLOT=ox_launch_nox(0,"ox_plot");
3902: Id=ID_PLOT;
1.4 ! takayama 3903: if(length(PP)==1&&type(Canvas)==4&&length(Canvas)==2)
! 3904: PP=cons(PP[0],[Canvas]);
1.3 takayama 3905: if(length(PP)>1){
3906: PPP=PP[1][0];
3907: PPQ=(length(PP[1])==2)?PP[1][1]:PPP;
3908: open_canvas(Id,[PPP,PPQ]);
3909: }else open_canvas(Id);
3910: Ind=ox_pop_cmo(Id);
1.4 ! takayama 3911: }else{
! 3912: Ind=PP[1];
! 3913: if(getopt(cl)==1) clear_canvas(Id,Ind);
! 3914: }
1.3 takayama 3915: }else{
3916: Id=PP[1];Ind=PP[2];
3917: if(length(PP)>3 && type(PP[3])==1) PPP=PP[3];
3918: if(length(PP)>4 && type(PP[4])==1) PPQ=PP[4];
3919: if(getopt(cl)==1) clear_canvas(Id,Ind);
3920: }
3921: if(L==[]) return (PPP>0)? [0,Id,Ind,PPP,PPQ]:[0,Id,Ind];
3922: Ex0=Ex0;Sft=[0,0];
3923: if(length(P)>1&&P[1]==0&&length(P)<4){
3924: R=execdraw(L,-3);
3925: Ex0=Ex1=Ex2=10;
3926: if((U=R[1])>0){ /* string */
3927: if(U>20) U=16; /* adj 16,8,2,7,15 */
1.4 ! takayama 3928: if(R[0][0][0]>R[2][0][0]-(R[0][0][1]-R[0][0][0])/256) Ex0+=8*U; /* adj 256 */
1.3 takayama 3929: else Ex0+=2*U;
1.4 ! takayama 3930: if(R[0][0][1]<R[2][0][1]+(R[0][0][1]-R[0][0][0])/256) Ex1+=7*U;
1.3 takayama 3931: else Ex1+=2*U;
1.4 ! takayama 3932: if(R[0][1][1]<R[2][1][1]+(R[0][1][1]-R[0][1][0])/256) Ex2+=15;
1.3 takayama 3933: }
3934: R=[R[0][0],R[0][1],0,[Ex0,Ex1],[0,-Ex2]];
3935: if(length(P)>2 && P[2]==1)
3936: mycat0(["Box:",[R[0],R[1]], ", ext=",R[3],", shift=",R[4]],1);
3937: }else R=execdraw((length(P)>3)?P[3]:L,-2); /* Windows */
3938: XW=R[0];YW=R[1];
3939: if(length(R)>3){
3940: if(R[3]!=0 && R[3]!=[0,0]) Ex=R[3];
3941: if(length(R)>4) Sft=R[4];
3942: }
3943: if(type(X=getopt(ext))==4)
3944: Ex=(Ex0)?[X[0]+Ex[0],X[1]+Ex[1]]:X;
3945: if(type(M)<2){
3946: if(length(P)>1&&type(P[1])==1) M=P[1];
1.4 ! takayama 3947: else if((length(P)==1||P[1]==0||P[1]==1)&& PPP>0) M=PPP;
! 3948: if(M<2) M=400;
1.3 takayama 3949: if(Ex!=0 && type(Ex)==4){
3950: M-=Ex[0]+Ex[1];
3951: }
3952: M=(M/(XW[1]-XW[0]))*diagm(2,[1,-1]);
3953: }
3954: if(type(X=getopt(shift))==4) Sft=(Ex0)?[Sft[0]+X[0],Sft[1]+X[1]]:X;
3955: if(type(Sft)==4) Sft=[Sft[0],-Sft[1]];
3956: if(Ex!=0) Sft=[Sft[0]+Ex[0],Sft[1]];
3957: Org=[["shift",ptaffine(M,[-XW[0],-YW[1]]|shift=Sft)]];
3958: for(CT=0;CT<2;CT++){
3959: for(LT=L;LT!=[];LT=cdr(LT)){
3960: T=car(LT);
3961: if(!CT && T[0]!=2) continue;
3962: if(CT && T[0]==2) continue;
3963: if(T[0]==1){
3964: for(TT=cdr(cdr(T));TT!=[];TT=cdr(TT)){
3965: D=car(TT);
3966: if(type(D[0][0])==4){
3967: for(DT=D;DT!=[];DT=cdr(DT)){
3968: V=car(DT);
3969: if(M) V=ptaffine(M,V|option_list=Org);
3970: draw_bezier(Id,Ind,V|option_list=T[1]);
3971: }
3972: }else{
3973: if(M) D=ptaffine(M,D|option_list=Org);
3974: draw_bezier(Id,Ind,D|option_list=T[1]);
3975: }
3976: }
1.4 ! takayama 3977: }else if(T[0]==2){ /* put */
! 3978: if(length(T)<4) continue;
! 3979: V=T[2];
! 3980: if(type(VLB)==4&&V[0]=="_") V=VLB;
! 3981: else if(type(V[0])>1||type(V[1])>1) continue; /* not supported */
! 3982: if(length(T)>3&&type(T[3])==4&&length(T[3])>1&&T[3][1]==1) VLB=V;
! 3983: F++;MM=M;
1.3 takayama 3984: if((Sc=delopt(T[1],"scale"|inv=1))!=[]){
3985: if(!MM) MM=1;
3986: Sc=car(Sc)[1];
3987: if(type(Sc)==1) MM=MM*Sc;
3988: else if(type(Sc)==6) MM=MM*diagm(2,Sc);
3989: }
3990: if(MM) V=ptaffine(MM,V|option_list=Org);
3991: if(type(S=S0=T[3])==4) S=S0[0];
3992: if(length(T)>4) S=T[4]; /* subst. string */
3993: if(type(S0)==4&&type(S0[0])==4){
3994: if((Col=drawopt(S0[0][0],0))<0) Col=0; /* attrib. */
1.4 ! takayama 3995: if(type(S)!=7) S=rtostr(S0[0][1]);
! 3996: S=str_subst(S,[["$\\bullet$","*"],["$\\times$","x"],["$",""]],0);
1.3 takayama 3997: if(type(Pos=drawopt(S0[0][0],2))==4)
3998: V=[V[0]+4*str_len(S)*Pos[0],V[1]-10*Pos[1]]; /* adjustable */
1.4 ! takayama 3999: }else S=str_subst(rtostr(S),[["$\\bullet$","*"],["$\\times$","x"],["$",""]],0);
1.3 takayama 4000: V=[V[0]-str_len(S)*4,V[1]-8]; /* adjustable */
4001: draw_string(Id,Ind,V,S,Col);
4002: }else if(T[0]==3){ /* arrow */
4003: F++;
4004: T1=T[2];T2=T[3];
4005: if(M){
4006: T1=ptaffine(M,T1|option_list=Org);
4007: T2=ptaffine(M,T2|option_list=Org);
4008: }
4009: draw_bezier(Id,Ind,[T1,T2]|option_list=T[1]);
4010: }else if(T[0]==4){ /* line */
4011: F++;
4012: T1=T[2];T2=T[3];
4013: if(M){
4014: T1=ptaffine(M,T1|option_list=Org);
4015: T2=ptaffine(M,T2|option_list=Org);
4016: }
4017: V=delopt(T1=T[1],"opt"|inv=1);
4018: if(V!=[]&&str_str(V[1],".")>=0)
4019: T1=cons(["opt",cons("dotted,",V[1])],delopt(T1,"opt"));
4020: draw_bezier(Id,Ind,[T1,T2]|option_list=T1);
4021: }else if(T[0]==5){ /* TeX */
4022: mycat(rtostr(T[2]));
1.4 ! takayama 4023: if(F){
1.3 takayama 4024: S=str_tb(0,Out);
4025: Out=str_tb(0,0);
4026: F=0;
4027: if(S!=""){
4028: if(P[0]==2) dviout(xyproc(S)|keep=1);
4029: else LOut=cons(xyproc(S),LOut);
4030: }
4031: if(P[0]==2) dviout(T[2]|option_list=T[1]);
4032: else{
4033: LOut=cons(T[2],Out);
4034: }
4035: }
4036: }else if(Proc==1&&type(T[0])==2){
4037: if(length(T)<3) call(T[0],T[1]);
4038: else call(T[0],T[1]|option_list=T[2]);
4039: }
4040: }
4041: }
4042: S=(PPP>0)? [0,Id,Ind,PPP,PPQ]:[0,Id,Ind];
1.4 ! takayama 4043: if(Ex==0&&Sft!=[0,0]) Ex=[0,0];
! 4044: return (Ex!=0&&length(P)>2&&P[2]==-1)?
1.3 takayama 4045: [S,0,0,[0,R[0],R[1],0,Ex,[Sft[0]-Ex[0],-Sft[1]]]]:S;
4046: }
4047: if(P[0]==1||P[0]==2){ /* TeX */
4048: Out=str_tb(0,0);LOut=[];F=0;
4049: if(getopt(cl)==1) dviout0(0);
4050: for(;L!=[];L=cdr(L)){
4051: T=car(L);Opt=T[1];
4052: if(type(T[0])>=2) continue;
4053: if(T[0]==0){
4054: XW=T[1];YW=T[2];
4055: if(length(P)>1&&type(P[1])==1&&P[1]<0)
4056: M=-P[1]/(XW[0]-XW[1]);
4057: }else if(T[0]==1){
4058: F++;
4059: for(TT=cdr(cdr(T));TT!=[];TT=cdr(TT)){
4060: D=car(TT);
4061: if(type(D[0][0])==4){
4062: for(DT=D;DT!=[];DT=cdr(DT)){
4063: V=car(DT);
4064: if(M) V=ptaffine(M,V|option_list=Org);
4065: str_tb(xybezier(V|option_list=Opt),Out);
4066: }
4067: }else{
4068: if(M) D=ptaffine(M,D|option_list=Org);
4069: str_tb(xybezier(D|option_list=Opt),Out);
4070: }
4071: }
4072: }else if(T[0]==2){
4073: F++;V=T[2];
4074: Opt=delopt(Opt,"scale"|inv=1);
1.4 ! takayama 4075: MM=M;
1.3 takayama 4076: if(Opt!=[]){
4077: Opt=car(Opt)[1];
4078: if(type(Opt)==1) Opt=[Opt,Opt];
1.4 ! takayama 4079: if(Opt!=[1,1]){
! 4080: if(!MM) MM=1;
! 4081: MM=MM*diagm(2,[Opt[0],Opt[1]]);
! 4082: }
1.3 takayama 4083: }
1.4 ! takayama 4084: if(MM) V=ptaffine(MM,V|option_list=Org);
1.3 takayama 4085: if(length(T)>3) V=append(V,T[3]);
4086: str_tb(xyput(V),Out);
4087: }else if(T[0]==3){
4088: F++;
4089: T1=T[2];T2=T[3];
4090: if(M){
4091: T1=ptaffine(M,T1|option_list=Org);
4092: T2=ptaffine(M,T2|option_list=Org);
4093: }
1.4 ! takayama 4094: str_tb(xyarrow(T1,T2|option_list=Opt),Out);
1.3 takayama 4095: }else if(T[0]==4){
4096: F++;
4097: T1=T[2];T2=T[3];
4098: if(M){
4099: T1=ptaffine(M,T1|option_list=Org);
4100: T2=ptaffine(M,T2|option_list=Org);
4101: }
1.4 ! takayama 4102: str_tb(xyline(T1,T2|option_list=Opt),Out);
1.3 takayama 4103: }else if(T[0]==5){
4104: if(F){
4105: S=str_tb(0,Out);
4106: Out=str_tb(0,0);
4107: F=0;
4108: if(S!=""){
4109: if(P[0]==2) dviout(xyproc(S)|keep=1);
4110: else LOut=cons(xyproc(S),LOut);
4111: }
4112: if(P[0]==2) dviout(T[2]|option_list=T[1]);
4113: else LOut=cons(T[2],Out);
4114: }
4115: }else if(T[0]==-2)
4116: str_tb(["%",T[1],"\n"],Out);
4117: else if(Proc==1&&type(T[0])==2){
4118: if(length(T)<3) call(T[0],T[1]);
4119: else call(T[0],T[1]|option_list=T[2]);
4120: }
4121: }
4122: S=str_tb(0,Out);
4123: if(P[0]==1){
4124: if(F) LOut=cons(xyproc(S),LOut);
4125: Out=str_tb(0,0);
4126: for(L=reverse(LOut);L!=[];L=cdr(L))
4127: str_tb(car(L),Out);
4128: return str_tb(0,Out);
4129: }
4130: if(F) dviout(xyproc(S));
4131: else dviout(" ");
4132: }
4133: }
4134:
4135: def execproc(L)
4136: {
4137: if(type(N=getopt(var))!=1&&N!=0) N=2;
4138: for(R=[];L!=[];L=cdr(L)){
4139: P=car(L);
4140: if(type(P[0])==2&&vtype(P[0])==3){
4141: if((VS=vars(cdr(P)))!=[]){
4142: for(I=0;I<N;I++){
4143: V=makev(["v",I+1]);
1.4 ! takayama 4144: if(findin(V,VS)>=0) P=mysubst(P,[V,R[I]]);
1.3 takayama 4145: }
4146: }
4147: if(length(P)<3) R=cons(call(P[0],P[1]),R);
4148: else R=cons(call(P[0],P[1]|option_list=P[2]),R);
4149: }
4150: }
4151: return (getopt(all)==1)?R:car(R);
1.1 takayama 4152: }
4153:
4154: def mysubst(P,L)
4155: {
4156: if(P==0) return 0;
1.4 ! takayama 4157: Inv=getopt(inv);
1.1 takayama 4158: if(type(L[0]) == 4){
4159: while((L0 = car(L))!=[]){
1.4 ! takayama 4160: P = mysubst(P,(Inv==1)?[L0[1],L0[0]]:L0);
1.1 takayama 4161: L = cdr(L);
4162: }
4163: return P;
4164: }
1.4 ! takayama 4165: if(Inv==1) L=[L[1],L[0]];
1.1 takayama 4166: if(type(P) > 3){
1.4 ! takayama 4167: if(type(P)==7) return P;
! 4168: if(type(P)>7)
1.1 takayama 4169: return subst(P,L[0],L[1]);
1.3 takayama 4170: #ifdef USEMODULE
4171: return mtransbys(os_md.mysubst,P,[L]);
4172: #else
1.1 takayama 4173: return mtransbys(mysubst,P,[L]);
1.3 takayama 4174: #endif
1.1 takayama 4175: }
4176: P = red(P);
4177: if(type(P) == 3){
4178: A=mysubst(nm(P),L);B=mysubst(dn(P),L);
4179: return red(nm(A)/nm(B))*red(dn(B)/dn(A));
4180: }
1.4 ! takayama 4181: L1=(type(L[1])==3)?red(L[1]):L[1];X=L[0];
! 4182: if(ptype(L1,X)==3){
1.1 takayama 4183: LN=nm(L1);LD=dn(L1);
1.4 ! takayama 4184: Deg=mydeg(P,X);
1.1 takayama 4185: if(Deg <= 0) return P;
4186: V = newvect(Deg+1);
4187: for(V[I=Deg]=1;I >= 1;I--)
4188: V[I-1]=V[I]*LD;
4189: for(R = 0, I = Deg; I >= 0; I--)
1.4 ! takayama 4190: R = R*LN + mycoef(P,I,X)*V[I];
1.1 takayama 4191: return red(R/V[0]);
4192: }
4193: return subst(P,X,L1);
4194: }
4195:
4196: def mmulbys(FN,P,F,L)
4197: {
1.3 takayama 4198: Opt=getopt();
1.1 takayama 4199: if(type(F) <= 3){
4200: if(type(P) <= 3)
1.3 takayama 4201: return call(FN, cons(P,cons(F,L))|option_list=Opt);
1.1 takayama 4202: if(type(P) == 5){
4203: S = length(P);
4204: R = newvect(S);
4205: for(I = 0; I < S; I++)
1.3 takayama 4206: R[I] = call(FN, cons(P[I],cons(F,L))|option_list=Opt);
1.1 takayama 4207: return R;
4208: }else if(type(P) == 6){
4209: S = size(P);
4210: R = newmat(S[0],S[1]);
4211: for(I = 0; I < S[0]; I++){
4212: for(J = 0; J < S[1]; J++)
1.3 takayama 4213: R[I][J] = call(FN, cons(P[I][J],cons(F,L))|option_list=Opt);
1.1 takayama 4214: }
4215: return R;
4216: }
4217: }
4218: if(type(F) == 5){
4219: S = length(F);
4220: if(type(P) <= 3){
4221: R = newvect(S);
4222: for(I = 0; I < S; I++)
1.3 takayama 4223: R[I] = call(FN, cons(P,cons(F[I],L))|option_list=Opt);
1.1 takayama 4224: return R;
4225: }
4226: if(type(P) == 5){
4227: for(J=R=0; J<S; J++)
1.3 takayama 4228: R = radd(R, call(FN, cons(P[J],cons(F[J],L)))|option_list=Opt);
1.1 takayama 4229: return R;
4230: }
4231: T = size(P);
4232: R = newvect(T[0]);
4233: for(I = 0; I < T[0]; I++){
4234: for(J = 0; J < S; J++)
1.3 takayama 4235: R[I] = radd(R[I], call(FN, cons(P[I][J],cons(F[J],L))|option_list=Opt));
1.1 takayama 4236: }
4237: return R;
4238: }
4239: if(type(F) == 6){
4240: S = size(F);
4241: if(type(P) <= 3){
4242: R = newmat(S[0],S[1]);
4243: for(I = 0; I < S[0]; I++){
4244: for(J = 0; J < S[1]; J++)
1.3 takayama 4245: R[I][J] = call(FN, cons(P,cons(F[I][J],L))|option_list=Opt);
1.1 takayama 4246: }
4247: return R;
4248: }
4249: if(type(P) == 5){
4250: R = newvect(S[1]);
4251: for(J = 0; J < S[1]; J++){
4252: for(K = U = 0; K < S[0]; K++)
1.3 takayama 4253: U = radd(U, call(FN, cons(P[K],cons(F[K][J],L))|option_list=Opt));
1.1 takayama 4254: R[J] = U;
4255: }
4256: return R;
4257: }
4258: T = size(P);
4259: R = newmat(T[0],S[1]);
4260: for(I = 0; I < T[0]; I++){
4261: for(J = 0; J < S[1]; J++){
4262: for(K = U = 0; K < S[0]; K++)
1.3 takayama 4263: U = radd(U, call(FN, cons(P[I][K],cons(F[K][J],L)|option_list=Opt)));
1.1 takayama 4264: R[I][J] = U;
4265: }
4266: }
4267: return R;
4268: }
4269: erno(0);
4270: return 0;
4271: }
4272:
4273: def appldo(P,F,L)
4274: {
4275: if(type(F) <= 3){
4276: if(type(L) == 4 && type(L[0]) == 4)
4277: return applpdo(P,F,L);
4278: L = vweyl(L);
4279: X = L[0]; DX = L[1];
4280: J = mydeg(P,DX);
4281: for(I = R = 0; I <= J; I++){
4282: if(I > 0)
4283: F = mydiff(F,X);
4284: R = radd(R,mycoef(P,I,DX)*F);
4285: }
4286: return R;
4287: }
1.3 takayama 4288: #ifdef USEMODULE
4289: return mmulbys(os_md.appldo,P,F,[L]);
4290: #else
1.1 takayama 4291: return mmulbys(appldo,P,F,[L]);
1.3 takayama 4292: #endif
1.1 takayama 4293: }
4294:
4295: def appledo(P,F,L)
4296: {
4297: if(type(F) <= 3){
4298: L = vweyl(L);
4299: X = L[0]; DX = L[1];
4300: J = mydeg(P,DX);
4301: for(I = R = 0; I <= J; I++){
4302: if(I > 0)
4303: F = myediff(F,X);
4304: R = radd(R,mycoef(P,I,DX)*F);
4305: }
4306: return R;
4307: }
1.3 takayama 4308: #ifdef USEMODULE
4309: mmulbys(os_md.appledo,P,F,[L]);
4310: #else
1.1 takayama 4311: mmulbys(appledo,P,F,[L]);
1.3 takayama 4312: #endif
1.1 takayama 4313: }
4314:
4315: def muldo(P,Q,L)
4316: {
4317: if(type(Lim=getopt(lim))!=1) Lim=100;
4318: if(type(Q) <= 3){
4319: if(type(L) == 4 && type(L[0]) == 4)
4320: return mulpdo(P,Q,L|lim=Lim); /* several variables */
4321: R = rmul(P,Q);
4322: L = vweyl(L);
4323: X = L[0]; DX = L[1];
4324: if(X != 0){
4325: for(I = F = 1; ; I++){
4326: P = mydiff(P,DX);
4327: if(I>Lim){
4328: mycat(["Over", Lim,"derivations!"]);
4329: break;
4330: }
4331: if(P == 0)
4332: break;
4333: Q = mydiff(Q,X);
4334: if(Q == 0)
4335: break;
4336: F *= I;
4337: R = radd(R,P*Q/F);
4338: }
4339: }
4340: return R;
4341: }
1.3 takayama 4342: #ifdef USEMODULE
4343: return mmulbys(os_md.muldo,P,Q,[L]);
4344: #else
1.1 takayama 4345: return mmulbys(muldo,P,Q,[L]);
1.3 takayama 4346: #endif
1.1 takayama 4347: }
4348:
4349: def adj(P,L)
4350: {
4351: if(type(P) == 4)
1.3 takayama 4352: #ifdef USEMODULE
4353: return map(os_md.adj,mtranspose(P),L);
4354: #else
1.1 takayama 4355: return map(adj,mtranspose(P),L);
1.3 takayama 4356: #endif
1.1 takayama 4357: if(type(L) == 4 && type(L[0]) == 4)
1.3 takayama 4358: #ifdef USEMODULE
4359: return fmult(os_md.adj,P,L,[]);
4360: #else
1.1 takayama 4361: return fmult(adj,P,L,[]);
1.3 takayama 4362: #endif
1.1 takayama 4363: L = vweyl(L);
4364: X = L[0]; DX = L[1];
4365: P = R = subst(P, DX, -DX);
4366: for(I = 1; (R = mydiff(mydiff(R, X), DX)/I) != 0 && I < 100; I++)
4367: P = radd(P,R);
4368: return P;
4369: }
4370:
4371: def laplace1(P,L)
4372: {
4373: if(type(L) == 4 && type(L[0]) == 4)
1.3 takayama 4374: #ifdef USEMODULE
4375: return fmult(os_md.laplace,P,L,[]);
4376: #else
1.1 takayama 4377: return fmult(laplace,P,L,[]);
1.3 takayama 4378: #endif
1.1 takayama 4379: L = vweyl(L);
4380: X = L[0]; DX = L[1];
4381: P = adj(P, L);
4382: return subst(P,X,o_1,DX,X,o_1,DX);
4383: }
4384:
4385: def laplace(P,L)
4386: {
4387: if(type(L) == 4 && type(L[0]) == 4)
1.3 takayama 4388: #ifdef USEMODULE
4389: return fmult(os_md.laplace1,P,L,[]);
4390: #else
1.1 takayama 4391: return fmult(laplace1,P,L,[]);
1.3 takayama 4392: #endif
1.1 takayama 4393: L = vweyl(L);
4394: X = L[0]; DX = L[1];
4395: P = adj(P, L);
4396: return subst(P,X,o_1,DX,-X,o_1,-DX);
4397: }
4398:
4399: def mce(P,L,V,R)
4400: {
4401: L = vweyl(L);
4402: X = L[0]; DX = L[1];
4403: P = sftexp(laplace1(P,L),L,V,R);
4404: return laplace(P,L);
4405: }
4406:
4407: def mc(P,L,R)
4408: {
4409: return mce(P,L,0,R);
4410: }
4411:
4412: def rede(P,L)
4413: {
4414: Q = ltov(fctr(nm(red(P))));
4415: P = 1;
4416: if(type(L) < 4)
4417: L = [L];
4418: if(type(L[0]) < 4)
4419: L = [L];
4420: for( ; L != []; L = cdr(L)){
4421: DX = vweyl(car(L))[1];
4422: for(I = 1; I < length(Q); I++){
4423: if(mydeg(Q[I][0],DX) > 0){
4424: P *= (Q[I][0])^(Q[I][1]);
4425: Q[I]=[1,0];
4426: }
4427: }
4428: }
4429: return P;
4430: }
4431:
4432: def ad(P,L,R)
4433: {
4434: L = vweyl(L);
4435: DX = L[1];
4436: K = mydeg(P,DX);
4437: S = mycoef(P,0,DX);
4438: Q = 1;
4439: for(I=1; I <= K;I++){
4440: Q = muldo(Q,DX-R,L);
4441: S = radd(S,mycoef(P,I,DX)*Q);
4442: }
4443: return S;
4444: }
4445:
4446: def add(P,L,R)
4447: {
4448: return rede(ad(P,L,R),L);
4449: }
4450:
4451:
4452: def vadd(P,L,R)
4453: {
4454: L = vweyl(L);
4455: if(type(R) != 4)
4456: return 0;
4457: N = length(R);
4458: DN = 1; Ad = PW = 0;
4459: for( ; R != []; R = cdr(R), PW++){
4460: DN *= (T=1-car(R)[0]*L[0]);
4461: Ad = Ad*T-car(R)[1]*x^PW;
4462: }
4463: Ad /= DN;
4464: return add(P,L,Ad);
4465: }
4466:
4467: def addl(P,L,R)
4468: {
4469: return laplace1(add(laplace(P,L),L,R),L);
4470: }
4471:
4472: def cotr(P,L,R)
4473: {
4474: L = vweyl(L);
4475: X = L[0]; DX = L[1];
4476: T = 1/mydiff(P,DX);
4477: K = mydeg(P,DX);
4478: S = mysubst(mycoef(P,0,DX), [X, R]);
4479: Q = 1;
4480: for(I = 1; I <= K; I++){
4481: Q = muldo(Q, K*DX, L);
4482: S = radd(S,mysubst(mycoef(P,I,DX), [X, R])*Q);
4483: }
4484: }
4485:
4486: def rcotr(P,L,R)
4487: {
4488: return rede(cotr(P,L,R), L);
4489: }
4490:
4491: def muledo(P,Q,L)
4492: {
4493: if(type(Q)>3)
1.3 takayama 4494: #ifdef USEMODULE
4495: return mmulbys(os_md.muledo,P,Q,[L]);
4496: #else
1.1 takayama 4497: return mmulbys(muledo,P,Q,[L]);
1.3 takayama 4498: #endif
1.1 takayama 4499: R = P*Q;
4500: L = vweyl(L);
4501: X = L[0]; DX = L[1];
4502: for(I = F = 1; I < 100; I++){
4503: P = mydiff(P,DX);
4504: if(P == 0)
4505: break;
4506: Q = myediff(Q,X);
4507: if(Q == 0)
4508: break;
4509: F = rmul(F,I);
4510: R = radd(R,P*Q/F);
4511: }
4512: return R;
4513: }
4514:
4515:
4516: #if 1
4517: def mulpdo(P,Q,L)
4518: {
4519: if(type(Q)>3)
1.3 takayama 4520: #ifdef USEMODULE
4521: return mmulbys(os_md.mulpdo,P,Q,[L]);
4522: #else
1.1 takayama 4523: return mmulbys(mulpdo,P,Q,[L]);
1.3 takayama 4524: #endif
1.1 takayama 4525: if(type(Lim=getopt(lim))!=1) Lim=100;
4526: M = vweyl(car(L)); X= M[0]; DX = M[1];
4527: L = cdr(L);
4528: R = 0;
4529: for(I = 0; Q != 0 && I <= Lim; I++){
4530: if(I>Lim){
4531: mycat(["Over", Lim,"derivations!"]);
4532: break;
4533: }
4534: if(I > 0)
4535: P /= I;
4536: if(length(L)==0)
4537: R = radd(R,P*Q);
4538: else
4539: R = radd(R,mulpdo(P,Q,L));
4540: if(X==0) break;
4541: P = mydiff(P,DX);
4542: if(P == 0)
4543: break;
4544: Q = mydiff(Q,X);
4545: }
4546: if(I>Lim) mycat(["Over", Lim,"derivations!"]);
4547: return R;
4548: }
4549:
4550: #else
4551: def mulpdo(P,Q,L);
4552: {
4553: if(type(Q)>3)
1.3 takayama 4554: #ifdef USEMODULE
4555: return mmulbys(os_md.mulpdo,P,Q,[L]);
4556: #else
1.1 takayama 4557: return mmulbys(mulpdo,P,Q,[L]);
1.3 takayama 4558: #endif
1.1 takayama 4559: if(type(Lim=getopt(lim))!=1) Lim=100;
4560: N = length(L);
4561: VO = newvect(2*N);
4562: VN = newvect(2*N);
4563: for(I = J = 0; I < N; J += 2, I++){
4564: M = vweyl(L[I]);
4565: P = subst(P, VO[J]=M[0], VN[J]=strtov("o_"+rtostr(V[J])),
4566: VO[J+1]=M[1], VN[J+1] = strtov("o_"+rtostr(V[J+1])));
4567: }
4568: for(PQ = P*Q, I = 0; I < 2*N; I += 2){
4569: for(R = PQ, J = 1; J < Lim; J++){
4570: R = mydiff(R, VN[I+1])/J;
4571: if(R == 0)
4572: break;
4573: R = mydiff(R, VO[I]);
4574: if(R == 0)
4575: break;
4576: PQ = radd(PQ,R);
4577: }
4578: if(I==Lim) mycat(["Over", Lim,"derivations!"]);
4579: PQ = red(subst(PQ,VN[I],VO[I],VN[I+1],VO[I+1]));
4580: }
4581: }
4582: #endif
4583:
4584: def transpdosub(P,LL,K)
4585: {
4586: Len = length(K)-1;
4587: if(Len < 0 || P == 0)
4588: return P;
4589: KK=K[Len];
4590: if(type(KK)==4){
4591: KK0=KK[0]; KK1=KK[1];
4592: }else{
4593: L = vweyl(LL[Len]);
4594: KK0=L[1]; KK1=K[Len];
4595: }
4596: Deg = mydeg(P,KK0);
4597: K1 = reverse(cdr(reverse(K)));
4598: R = transpdosub(mycoef(P,0,KK0),LL,K1);
4599: for(I = M = 1; I <= Deg ; I++){
4600: M = mulpdo(M,KK1,LL);
4601: S = mycoef(P,I,KK0);
4602: if(Len > 0)
4603: S = transpdosub(S,LL,K1);
4604: R = radd(R,mulpdo(S,M,LL));
4605: }
4606: return R;
4607: }
4608:
4609: def transpdo(P,LL,K)
4610: {
4611: if(type(K[0]) < 4)
4612: K = [K];
4613: Len = length(K)-1;
4614: K1=K2=[];
4615: if(type(LL)!=4) LL=[LL];
4616: if(type(LL[0])!=4) LL=[LL];
4617: if(getopt(ex)==1){
4618: for(LT=LL, KT=K; KT!=[]; LT=cdr(LT), KT=cdr(KT)){
4619: L = vweyl(LL[J]);
4620: K1=cons([L[0],car(KT)[0]],K1);
4621: K2=cons([L[1],car(KT)[1]],K2);
4622: }
4623: K2=append(K1,K2);
4624: }else{
4625: for(J = length(K)-1; J >= 0; J--){
4626: L = vweyl(LL[J]);
4627: if(L[0] != K[J][0])
4628: K1 = cons([L[0],K[J][0]],K1);
4629: K2 = cons(K[J][1],K2);
4630: }
4631: P = mulsubst(P, K1);
4632: }
4633: return transpdosub(P,LL,K2);
4634: }
4635:
4636: def translpdo(P,LL,M)
4637: {
4638: S=length(LL);
4639: L0=newvect(S);L1=newvect(S);
4640: K=newvect(S);
4641: for(J=0;J<S;J++){
4642: L = vweyl(LL[J]);
4643: L0[J]=L[0];
4644: L1[J]=L[1];
4645: }
4646: K=rmul(M,L0);
4647: for(T=[],J=0;J<S;J++)
4648: T=cons([L0[J],K[J]],T);
4649: P=mulsubst(P,T);
4650: K=rmul(myinv(M),L1);
4651: for(T=[],J=0;J<S;J++)
4652: T=cons([L1[J],K[J]],T);
4653: return mulsubst(P,T);
4654: }
4655:
4656: /*
4657: return [R, M, S] : R = M*P - S*Q
4658: deg(R,X) < deg(Q,X)
4659: */
4660: def rpdiv(P,Q,X)
4661: {
4662: if(P == 0)
4663: return [0,1,0];
4664: DQ = mydeg(Q,X);
4665: CO = mycoef(Q,DQ,X);
4666: S = 0;
4667: while((DP = mydeg(P,X)) >= DQ){
4668: R = mycoef(P,DP,X)/CO;
4669: S = radd(S,R*X^(DP-DQ));
4670: P = radd(P, -R*Q*X^(DP-DQ));
4671: }
4672: Lcm = lcm(dn(S),dn(P));
4673: Gcd = gcd(nm(S),nm(P));
4674: return [red(P*Lcm/Gcd), red(Lcm/Gcd),red(S*Lcm/Gcd)];
4675: }
4676:
1.3 takayama 4677: def texbegin(T,S)
4678: {
4679: if(type(Opt=getopt(opt))==7) Opt="["+Opt+"]\n";
4680: else Opt="\n";
4681: return "\\begin{"+T+"}"+Opt+S+"%\n\\end{"+T+"}\n";
4682: }
4683:
1.1 takayama 4684: def mygcd(P,Q,L)
4685: {
1.3 takayama 4686: if((Dvi=getopt(dviout))==3 || Dvi==-3){ /* dviout=3 */
4687: if((Rev=getopt(rev))!=1) Rev=0;
4688: R=mygcd(P,Q,L|rev=Rev);
4689: if(type(L)<2) Var=0;
4690: else if(type(L)==2){
4691: Val=L;L=[0,L];
4692: }else if(type(L)==4){
4693: L=vweyl(L);
4694: Var=[[L[1],"\\partial"]];
4695: }
4696: S=mat([P],[Q]);T=mat([R[0]],[0]);
4697: M=mat([R[1],R[2]],[R[3],R[4]]);
4698: if(type(Val)==4)
4699: N=mdivisor(M,L|trans=1)[1];
4700: else N=myinv(M);
4701: Tb=str_tb(mtotex(S|var=Var),0);
4702: str_tb("&="+mtotex(N|var=Var)+mtotex(T|var=Var)+",\\\\\n",Tb);
4703: str_tb(mtotex(T|var=Var),Tb);
4704: str_tb("&="+mtotex(M|var=Var)+mtotex(S|var=Var)+".",Tb);
4705: Out=str_tb(0,Tb);
4706: if(Dvi<0) return Out;
4707: dviout(Out|eq="align*");
4708: return 1;
4709: }
4710: if((type(Dvi)==1||Dvi==0) && getopt(rev)!=1) V=[[P,Q]];
4711: else V=0;
4712: if(L==0){ /* integer case */
4713: if(type(P) > 1 || type(Q) > 1 || Q==0 /* P <= 0 || Q <= 0 */
1.1 takayama 4714: || dn(P) > 1 || dn(Q) > 1)
4715: return 0;
4716: CPP = CQQ = 1; CQP = CPQ = 0;
4717: P1 = P; Q1 = Q;
4718: /* P1 = CPP*P + CPQ*Q
1.3 takayama 4719: Q1 = CQP*P + CQQ*Q */
4720: while(Q1 != 0){
1.1 takayama 4721: Div1 = idiv(P1,Q1); Div2 = irem(P1,Q1);
1.3 takayama 4722: if(type(V)==4) V=cons([Div1,Div2],V);
1.1 takayama 4723: P1 = Q1 ; Q1 = Div2;
4724: TP = CQP; TQ = CQQ;
4725: CQP = CPP-Div1*CQP;
4726: CQQ = CPQ-Div1*CQQ;
4727: CPP = TP; CPQ = TQ;
4728: }
1.3 takayama 4729: if(V!=0){
4730: V=reverse(V);
4731: if((DVI=abs(Dvi))==0) return V;
4732: PT=P;QT=Q;
4733: if(DVI==1 || DVI==2){
4734: Tb=str_tb(0,0);
4735: for(C=0,V=cdr(V);V!=[];V=cdr(V)){
4736: T=car(V);
4737: if(C++) str_tb("\\allowdisplaybreaks\\\\\n",Tb);
4738: if(DVI==1){
4739: Qs=rtostr(QT);
4740: if(QT<0) Qs="("+Qs+")";
4741: if(T[1]>0) Qs=Qs+"+";
4742: if(T[1]!=0) Qs=Qs+rtostr(T[1]);
4743: str_tb(rtostr(PT)+"&="
4744: +rtostr(T[0])+"\\times"+Qs,Tb);
4745: }else{
4746: N=mat([T[0],1],[1,0]);
4747: if(C==1){
4748: str_tb(S0=mtotex(mat([PT],[QT])),Tb);
4749: M=N;
4750: }
4751: str_tb("&=",Tb);
4752: if(C>1) str_tb(mtotex(M),Tb);
4753: str_tb(mtotex(N),Tb);
4754: str_tb(S=mtotex(mat([QT],[T[1]])),Tb);
4755: if(C>1){
4756: str_tb("=",Tb);
4757: str_tb(mtotex(M=M*N),Tb);
4758: str_tb(S,Tb);
4759: }
4760: }
4761: PT=QT;QT=T[1];
4762: }
4763: if(DVI==2){
4764: str_tb(",\\allowdisplaybreaks\\\\\n"+S+"&=",Tb);
4765: str_tb(mtotex(myinv(M)),Tb);
4766: str_tb(S0,Tb);
4767: }
4768: Out=str_tb(0,Tb);
4769: if(Dvi>0){
4770: dviout(Out|eq="align*");
4771: return 1;
4772: }
4773: return Out;
4774: }
4775: }
4776: if(P1<0) return [-P1,-CPP,-CPQ,CQP,CQQ];
1.1 takayama 4777: return [P1, CPP, CPQ, CQP, CQQ];
4778: }
1.3 takayama 4779: if(type(L) == 2) /* polynomical case */
1.1 takayama 4780: L = [0,L];
4781: if(getopt(rev)==1 && L[0]!=0){
4782: R=mygcd(adj(P,L),adj(Q,L),L);
4783: return [adj(R[0],L),adj(R[1],L),adj(R[2],L),adj(R[3],L),adj(R[4],L)];
4784: }
4785: if(type(P) == 3)
4786: P = red(P);
4787: if(type(Q) == 3)
4788: Q = red(Q);
1.3 takayama 4789: CP=newvect(2,[1/dn(P),0]); CQ=newvect(2,[0,1/dn(Q)]);
4790: P=PT=nm(P); Q =QT=nm(Q);
1.1 takayama 4791: L = vweyl(L);
4792: while(Q != 0){
4793: R = divdo(P,Q,L);
1.3 takayama 4794: if(type(V)==4) V=cons(R,V);
4795: /* R[1] = R[2]*P - R[0]*Q
4796: = R[2]*(CP[0]*P0+CP[1]*Q0) - R[0]*(CQ[0]*P0+CQ[1]*Q0) */
4797: /*
4798: P(n) |0 1 | P(n-1)
4799: = | |
4800: R[1] |R[2] -R[0]| P(n)
4801: P(n+1) = R[1], P(n) = P, P(n-1) = Q
4802: */
1.1 takayama 4803: P = Q;
4804: Q = R[1];
4805: {
4806: CT = dupmat(CQ);
4807: CQ = [R[2]*CP[0]-muldo(R[0],CQ[0],L),
1.3 takayama 4808: R[2]*CP[1]-muldo(R[0],CQ[1],L)];
1.1 takayama 4809: CP = CT;
4810: }
4811: }
1.3 takayama 4812: if(V!=0){
4813: V=reverse(V);
4814: if((DVI=abs(Dvi))==0) return V;
4815: if(type(L[0])<1) Var=L[1];
4816: else Var=[L[1],"\\partial"];
4817: if(DVI==1 || DVI==2){
4818: Tb=str_tb(0,0);
4819: PT=car(V)[0];QT=car(V)[1];
4820: for(C=0,V=cdr(V);V!=[];V=cdr(V)){
4821: T=car(V);
4822: if(C++) str_tb("\\allowdisplaybreaks\\\\\n",Tb);
4823: if(DVI==1){
4824: if(T[2]!=1){
4825: str_tb(monototex(T[2]),Tb);
4826: str_tb("(",Tb);
4827: str_tb(fctrtos(PT|var=Var,TeX=2),Tb);
4828: str_tb(")&=",Tb);
4829: }else{
4830: str_tb(fctrtos(PT|var=Var,TeX=2),Tb);
4831: str_tb("&=",Tb);
4832: }
4833: str_tb("(",Tb);
4834: str_tb(fctrtos(T[0]|var=Var,TeX=2),Tb);
4835: str_tb(")(",Tb);
4836: str_tb(fctrtos(QT|var=Var,TeX=2),Tb);
4837: if(T[1]!=0){
4838: str_tb(")+(",Tb);
4839: str_tb(fctrtos(T[1]|var=Var,TeX=2),Tb);
4840: }
4841: str_tb(")",Tb);
4842: }else{
4843: N=mat([red(T[0]/T[2]),1],[1,0]);
4844: if(C==1){
4845: str_tb(S0=mtotex(mat([PT],[QT])|var=Var),Tb);
4846: M=N;
4847: }
4848: str_tb("&=",Tb);
4849: if(C>1) str_tb(mtotex(M),Tb);
4850: str_tb(mtotex(N|var=Var),Tb);
4851: str_tb(S=mtotex(mat([QT],[T[1]])|var=Var),Tb);
4852: if(C>1){
4853: str_tb("=",Tb);
4854: str_tb(mtotex(M=muldo(M,N,L)|var=Var),Tb);
4855: str_tb(S,Tb);
4856: }
4857: }
4858: PT=QT;QT=T[1];
4859: }
4860: if(DVI==2){
4861: FT=fctr(PT);
4862: for(R=1;FT!=[];FT=cdr(FT)){
4863: if(mydeg(car(FT)[0],L[1])<1)
4864: for(J=car(FT)[1];J>0;J--) R*=car(FT)[0];
4865: }
4866: if(R!=1){
4867: str_tb("\\allowdisplaybreaks\\\\\n&=",Tb);
4868: M=muldo(M,mat([R,0],[0,1]),L);
4869: str_tb(mtotex(M|var=Var),Tb);
4870: str_tb(S=mtotex(mat([PT/R],[QT])|var=Var),Tb);
4871: }
4872: str_tb(",\\allowdisplaybreaks\\\\\n"+S+"&=",Tb);
4873: if(type(Var)==4){
4874: N=mdivisor(M,L|trans=1);
4875: N=N[1];
4876: }else
4877: N=myinv(M);
4878: str_tb(mtotex(N|var=Var),Tb);
4879: str_tb(S0,Tb);
4880: }
4881: Out=str_tb(0,Tb);
4882: if(Dvi>0){
4883: dviout(Out|eq="align*");
4884: return 1;
4885: }
4886: return Out;
4887: }
4888: }
4889: Q = rede(P,L);
1.1 takayama 4890: R = red(P/Q);
4891: return [Q,red(CP[0]/R),red(CP[1]/R),red(CQ[0]/R),red(CQ[1]/R)];
4892: }
4893:
4894: def mylcm(P,Q,L)
4895: {
4896: Rev=(getopt(rev)==1)?1:0;
4897: if(Rev==1){
4898: P=adj(P); Q=adj(Q);
4899: }
4900: R = mygcd(P,Q,L);
4901: S=(type(L)<=2)?R[3]*P:muldo(R[3],P,L);
4902: S = nm(S);
4903: if(type(S) <= 1 && type(L) <= 1){
4904: if(S<0) S = -S;
4905: return S;
4906: }
4907: if(type(L) == 2)
4908: return easierpol(S,L);
4909: S=rede(easierpol(S,L[1]),L);
4910: return (Rev==1)?adj(S):S;
4911: }
4912:
4913: def sftpexp(P,LL,F,Q)
4914: {
4915: if(type(LL[0]) < 4)
4916: LL = [LL];
1.4 ! takayama 4917: for(L0=L1=[],LT=LL;LT!=[];LT=cdr(LT)){
! 4918: W=vweyl(car(LT));
! 4919: L0=cons(W,L0);
! 4920: D=mydiff(F,W[0]);
! 4921: if(D!=0) L1=cons(W[1]+Q*D/F,L1);
! 4922: else L1=cons(W[1],L1);
1.1 takayama 4923: }
1.4 ! takayama 4924: return rede(transpdosub(P,L0,L1),L0);
1.1 takayama 4925: }
4926:
4927: def applpdo(P,F,LL)
4928: {
4929: if(type(F)>3)
1.3 takayama 4930: #ifdef USEMODULE
4931: return mmulbys(os_md.applpdo,P,F,[LL]);
4932: #else
1.1 takayama 4933: return mmulbys(applpdo,P,F,[LL]);
1.3 takayama 4934: #endif
1.1 takayama 4935: L = vweyl(LL[0]);
4936: LL = cdr(LL);
4937: Deg = deg(P,L[1]);
4938: S = F;
4939: for(I = R = 0; I <= Deg ; I++){
4940: if(I > 0)
4941: S = mydiff(S,L[0]);
4942: if(LL == [])
4943: R = radd(R,mycoef(P,I,L[1])*S);
4944: else
4945: R = radd(R,applpdo(mycoef(P,I,L[1]), S, LL));
4946: }
4947: return R;
4948: }
4949:
4950: def tranlpdo(P,L,M)
4951: {
4952: N = length(L);
4953: R = size(M);
4954: if(R[0] != N || R[1] != N){
4955: print("Strange size");
4956: return;
4957: }
4958: InvM = M;
4959: if(InvM[1] == 0){
4960: print("Not invertible");
4961: return;
4962: }
4963: XL = newvector(N);
4964: DL = newvector(N);
4965: for(I = 0; I < 0; I++){
4966: R = vweyl(L[I]);
4967: XL[I] = R[0];
4968: DL[I] = R[1];
4969: }
4970: for(I = 0; I < N; I++){
4971: for(J = XX = D0 = 0; J < N; J++){
4972: XX = radd(XX,M[I][J]*XL[J]);
4973: DD = radd(DD, red(InvM[0][I][J]/InvM[1])*DL[J]);
4974: P = mysubst(P,[[XL[I],XX],[DL[I],DD]]);
4975: }
4976: }
4977: return P;
4978: }
4979:
4980: def divdo(P,Q,L)
4981: {
1.3 takayama 4982: if(L==0){
4983: R=P-(P%Q)*Q;
4984: if(R<0){
4985: if(Q>0) R+=Q;
4986: else R-=Q;
4987: }
4988: return [(P-R)/Q,R,1];
4989: }
4990: L = vweyl(L);
4991: if(getopt(rev)==1){
4992: R=divdo(adj(P,L),adj(Q,L),L);
4993: return [adj(R[0],L),adj(R[1],L),R[2]];
4994: }
4995: X = L[0]; DX = L[1];
4996: S = 0;
4997: M = 1;
4998: I = mydeg(Q,DX);
4999: CQ = mycoef(Q,I,DX);
5000: while((J=mydeg(P,DX)) >= I){
5001: C = mycoef(P,J,DX);
5002: SR = red(C/CQ);
1.1 takayama 5003: if(dn(SR) != 1){
1.3 takayama 5004: M *= dn(SR);
5005: P *= dn(SR);
5006: S *= dn(SR);
5007: SR = nm(SR);
5008: }
5009: P -= muldo(SR*(DX)^(J-I),Q,L);
5010: S += SR*(DX)^(J-I);
5011: }
5012: return [S,P,M];
1.1 takayama 5013: }
5014:
5015: def qdo(P,Q,L)
5016: {
5017: L = vweyl(L); DX = L[1]; OD = deg(P,DX);
5018: V = newvect(OD+1);
5019: for(I = 0; I <= OD; I++){
1.3 takayama 5020: if(I)
5021: Q = muldo(DX,Q,L);
5022: S = divdo(Q,P,L);
5023: V[I] = S[1]*DX-S[2]*zz^I;
1.1 takayama 5024: }
5025: for(K = [], I = OD; I >= 0; I--)
5026: K = cons(DX^(I+1), K);
5027: R = lsol(V,K);
5028: S = length(R);
5029: for(I = P1 = 0; I < S; I++){
5030: if(type(R[I]) < 4 && mydeg(R[I],DX) == 0 && R[I] != 0
5031: && (mydeg(R[I],zz) <= mydeg(P,DX)))
5032: P1 = R[I];
5033: else if(type(R[I]) == 4 && R[I][0] == DX)
5034: P2 = R[I][1];
5035: }
5036: T=fctr(P1);
5037: for(I=0, S=length(T), P1=1; I<S; I++){
5038: if(mydeg(T[I][0],zz) > 0)
5039: P1 *= T[I][0]^(T[I][1]);
5040: }
5041: return subst([P1,P2],zz,DX);
5042: }
5043:
5044: def sqrtdo(P,L)
5045: {
5046: L = vweyl(L);
5047: P = toeul(P,L,0);
5048: V = -1;
5049: for(R = 0, Ord = mydeg(P,L[1]); Ord >= 0; Ord--){
5050: Q = coef(P,Ord,L[1]);
5051: M = mydeg(Q,L[0]);
5052: N = mymindeg(Q,L[0]);
5053: if(V < 0)
5054: V = M+N;
5055: else if(V != M+N){
5056: print("Cannot be transformed!");
5057: return;
5058: }
5059: Q = tohomog(red(Q/L[0]^N), [L[0]], z_z);
5060: if(irem(Ord,2))
5061: B = x-z_z;
5062: else
5063: B = x+z_z;
5064: Q = substblock(Q,x,B,z_zz);
5065: if(mydeg(Q,x) > 0){
5066: print("Cannot be transformed!");
5067: return;
5068: }
5069: R += mysubst(Q,[z_zz,x])*L[1]^Ord;
5070: }
5071: return fromeul(R,L,0);
5072: }
5073:
5074: def ghg(A,B)
5075: {
5076: R = dx;
5077: while(length(B)>0){
5078: R = muldo(x*dx+car(B),R,[x,dx]);
5079: B = cdr(B);
5080: }
5081: T = 1;
5082: while(length(A)>0){
5083: T = muldo(x*dx+car(A),T,[x,dx]);
5084: A = cdr(A);
5085: }
5086: return R-T;
5087: }
5088:
5089: def ev4s(A,B,C,S,T)
5090: {
5091: R4 = x^2*(x-1)^2;
5092: R3 = x*(x-1)*((2*A-2*B-8)*x-2*A+5);
5093: R2 = (-3/2*(A^2+B^2)+3*A*B+9*A-9*B-29/2+1/4*(S^2+T^2))*x^2
5094: +(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
5095: - (2*A+2*C-5)*(2*A-2*C-3)/4;
5096: 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
5097: +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
5098: #if 1
5099: + A^2*B
5100: #endif
5101: - B*C^2 - A^3/2+(2*A-3)*(S^2+T^2)/8;
5102: /* OK? for the above term added */
5103: R0 = -(A-B-1-S)*(A-B-1+S)*(A-B-1-T)*(A-B-1+T)/16;
5104: return (R4*dx^4-R3*dx^3-R2*dx^2-R1*dx-R0);
5105: }
5106:
5107: def b2e(A,B,C,S,T)
5108: {
5109: R4 = x^2*(x-1)^2;
5110: R3 = x*(x-1)*(2*x-1)*(2*c-5);
5111: R2 = (-6*C^2+24*C-25+1/2*S^2+1/2*T^2)*x^2
5112: +(6*C^2-24*C+25-1/2*S^2-1/2*T^2-A^2+B^2+A-B)*x
5113: +A^2-C^2-A+4*C-15/4;
5114: R1 = (2*C-3)*(2*C^2-6*C+5-1/2*S^2-1/2*T^2)*x
5115: +(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);
5116: R0 = -(2-2*C+S+T)*(2-2*C-S-T)*(2-2*C+S-T)*(2-2*C-S+T)/16;
5117: return (R4*dx^4-R3*dx^3-R2*dx^2-R1*dx-R0);
5118: }
5119:
5120:
5121: /*
5122: T^m = T(T-1)....(T-m+1)
5123: f(t) -> g(t)
5124:
5125: f(t) = a_mt^m + ... + a_1t+a_0
5126: g(x*dx) = a_m*x^m*dx^m + ... + a_1*x*dx+a_0
5127:
5128: ret: x(x-1)...(x-i+1)
5129: */
5130: def sftpow(X,I)
5131: {
5132: R = 1;
5133: for(J=0; J<I;J++)
5134: R *= X-J;
5135: return(R);
5136: }
5137:
5138: /*
5139: ret: x(x+K)(x+2*k)...(x+(i-1)*k)
5140: */
5141: def sftpowext(X,I,K)
5142: {
5143: R = 1;
5144: for(J=0; J<I;J++)
5145: R *= X+K*J;
5146: return(R);
5147: }
5148:
5149: def polinsft(F,A)
5150: {
5151: R = 0;
5152: while(F != 0){
5153: D = mydeg(F,A);
5154: C = mycoef(F,D,A);
5155: R += C*A^D;
5156: F -= C*sftpow(A,D);
5157: }
5158: return R;
5159: }
5160:
5161: def pol2sft(F,A)
5162: {
5163: S=getopt(sft);
5164: if(type(S)<0 || type(S)>2) S=1;
5165: R = 0;
5166: for(I = mydeg(F,A); I >= 0; I--)
5167: R = R*(A-I*S) + mycoef(F,I,A);
5168: return R;
5169: }
5170:
5171: def binom(P,N)
5172: {
5173: if(type(N)!=1 || N<0) return 1;
5174: for(S=1;N>0;N--,P-=1) S*=P/N;
5175: return red(S);
5176: }
5177:
5178: def expower(P,R,N)
5179: {
5180: if(type(N)!=1 || N<0) return 0;
5181: for(S=S0=K=1;K<=N;K++,R-=1){
5182: S0*=P*R/K;S+=S0;
5183: }
5184: return red(S);
5185: }
5186:
5187: def seriesHG(A,B,X,N)
5188: {
5189: if(type(N)!=1 || N<0) return 0;
5190: for(K=0,S=S0=1;K<N;K++){
5191: for(T=A; T!=[]; T=cdr(T)) S0*=car(T)+K;
5192: for(T=B; T!=[]; T=cdr(T)) S0/=car(T)+K;
5193: S0=red(S0*X/(K+1));
5194: DN=dn(S0);
5195: S=red((red(S*DN)+nm(S0))/DN);
5196: }
5197: }
5198:
1.3 takayama 5199: def evalred(F)
5200: {
5201: Opt=getopt(opt);
5202: if(type(Opt)!=4){
5203: Opt=[];
5204: }else if(length(Opt)==2 && type(Opt[0])!=4) Opt=[Opt];
5205: for(;;){
1.4 ! takayama 5206: G=mysubst(F,[[sin(0),0],[tan(0),0],[asin(0),0],[atan(0),0],[sinh(0),0],[tanh(0),0],
! 5207: [log(1),0],[cos(0),1],[cosh(0),1],[exp(0),1]]);
1.3 takayama 5208: for(Rep=Opt; Rep!=[]; Rep=cdr(Rep))
5209: G=subst(G,car(Rep)[0],car(Rep)[1]);
5210: Var=vars(G);
5211: for(V=Var; V!=[]; V=cdr(V)){
5212: if(functor(car(V))!=pow || (P=args(car(V))[0])!=1) continue;
5213: G=subst(G,car(V),1);
5214: }
5215: if(G==F) return F;
5216: F=G;
5217: }
5218: }
5219:
5220: def seriesMc(F,N,V)
5221: {
5222: if(type(V)<4) V=[V];
5223: V=reverse(V);
5224: L=length(V);
5225: if(type(Opt=getopt(evalopt))!=4) Opt=[];
5226: P=newvect(L);
5227: G=newvect(L+1);
5228: G[0]=F;
5229: for(I=0;I<L;I++)
5230: G[I+1]=eval(evalred(subst(G[I],V[I],0)|opt=Opt));
5231: R=G[L];
5232: for(;;){
5233: for(M=0,I=0;I<L;I++){
5234: M+=P[I];
5235: if(M==N) break;
5236: }
5237: if(M<N){
5238: P[L-1]++;
5239: G[L-1]=mydiff(G[L-1],V[L-1]);
1.4 ! takayama 5240: G[L]=eval(evalred(mysubst(G[L-1],[V[L-1],0])|opt=Opt));
1.3 takayama 5241: }else{
5242: if(I--==0) break;
5243: P[I]++;
5244: G[I]=mydiff(G[I],V[I]);
5245: while(I++<L){
1.4 ! takayama 5246: G[I]=eval(evalred(mysubst(G[I-1],[V[I-1],0])|opt=Opt));
1.3 takayama 5247: if(I<L) P[I]=0;
5248: }
5249: }
5250: K=1;
5251: for(I=0;I<L;I++) K*=V[I]^P[I]/fac(P[I]);
5252: R+=G[L]*K;
5253: }
5254: return R;
5255: }
5256:
5257: def seriesTaylor(F,N,V)
5258: {
5259: G=F;
5260: if(isvar(V)) V=[V];
5261: if(length(V)==2 && type(car(V))!=4 && !isvar(V[1])) V=[V];
5262: for(V0=V1=[];V!=[];V=cdr(V)){
5263: if(type(T=car(V))!=4) T=[T];
5264: V0=cons(X=car(T),V0);
5265: if(length(T)==1 || T[1]==0){
5266: V1=cons(X,V1);continue;
5267: }
5268: S=my_tex_form(-T[1]);
5269: if(str_char(S,0,"-")!=0) S="+"+S;
5270: S="("+my_tex_form(X)+S+")";
5271: V1=cons([X,S],V1);
5272: F=red(subst(F,T[0],T[0]+T[1]));
5273: }
5274: V0=reverse(V0);V1=reverse(V1);
5275: F=seriesMc(F,N,V0|option_list=getopt());
5276: if(getopt(frac)==0) F=frac2n(F);
5277: T=getopt(dviout);
5278: if(type(T)!=1) T=0;
5279: F=fctrtos(F|var=V1,rev=1,TeX=(T==0||T==2)?2:3);
5280: if(getopt(small)==1) F=str_subst(F,"\\frac{","\\tfrac{");
5281: if(T<0 || T==1) F="\\begin{align}\\begin{split}\n"+
5282: my_tex_form(G)+"&="+F+"+\\cdots\n\\end{split}\\end{align}\n";
5283: if(T==1) dviout(F);
5284: else if(T==1) dviout(F|eq=4);
5285: return F;
5286: }
5287:
1.1 takayama 5288: def toeul(F,L,V)
5289: {
5290: L = vweyl(L);
5291: X = L[0]; DX = L[1];
5292: I = mydeg(F,DX);
5293: if(V == "infty"){
5294: for(II=I; II>=0; II--){
5295: J = mydeg(P=mycoef(F,I,DX),X);
5296: if(II==I) S=II-J;
5297: else if(P!=0 && II-J>S) S=II-J;
5298: }
5299: F *= X^S;
5300: R = 0;
5301: for( ; I >= 0; I--)
5302: R += red((mysubst(mycoef(F,I,DX),[X,1/X])*(x*DX)^I));
5303: return(subst(pol2sft(R,DX),DX,-DX));
5304: }
5305: F = subst(F,X,X+V);
5306: for(II=I; II>=0; II--){
5307: J = mymindeg(P=mycoef(F,II,DX),X);
5308: if(II==I) S=II-J;
5309: else if(P!=0 && II-J>S) S=II-J;
5310: }
5311: F *= X^S;
5312: R = 0;
5313: for( ; I >= 0; I--)
5314: R += (red(mycoef(F,I,DX)/X^I))*DX^I;
5315: return pol2sft(R,DX);
5316: }
5317:
5318: /*
5319: def topoldif(P,F,L)
5320: {
5321: L = vweyl(L);
5322: P = nm(red(P));
5323: while(deg(P,L[1]) > 0){
5324: R = coef(P,0,L[0]);
5325: Q = red((P-R)/(F*L[0]);
5326: P = nm(Q)*zz+F*R*dn(Q);
5327: }
5328: }
5329: */
5330:
5331: def fromeul(P,L,V)
5332: {
5333: if(P == 0)
5334: return 0;
5335: L = vweyl(L);
5336: X = L[0]; DX = L[1];
5337: I = mydeg(P,DX);
5338: if(V == "infty"){
5339: P = subst(P,DX,-DX);
5340: J = mydeg(P,X);
5341: P = red(mysubst(P,[X,1/X])*X^J);
5342: }
5343: R = mycoef(P,0,DX);
5344: S = 1;
5345: for(S = J = 1; J <= I; J++){
5346: S = DX*(S*X + mydiff(S,DX));
5347: R += mycoef(P,J,DX)*S;
5348: }
5349: while(mycoef(R,0,X) == 0)
5350: R = tdiv(R,X);
5351: if(V != "infty" && V != 0)
5352: R = mysubst(R,[X,X-V]);
5353: return R;
5354: }
5355:
5356: def sftexp(P,L,V,N)
5357: {
5358: L = vweyl(L); DX = L[1];
5359: P = mysubst(toeul(P,L,V),[DX,DX+N]);
5360: return fromeul(P,L,V);
5361: }
5362:
5363:
5364: def fractrans(P,L,N0,N1,N2)
5365: {
5366: L = vweyl(L);
5367: if(N2 != "infty"){
5368: if(N0 == "infty")
5369: N0 = 0;
5370: else
5371: N0 = red(1/(N0-N2));
5372: if(N1 == "infty")
5373: N1 = 0;
5374: else
5375: N1 = red(1/(N1-N2));
5376: P = mysubst(P,[L[0],L[0]+N2]);
5377: P = fromeul(toeul(P,L,"infty"),L,0);
5378: }
5379: if(N0 != 0){
5380: P = mysubst(P,[L[0],L[0]+N0]);
5381: N1 -= N0;
5382: }
5383: if(N1 != 1)
5384: P = mysubst(P,[[L[0],L[0]/N1],[L[1],L[1]*N1]]);
5385: return P;
5386: }
5387:
5388: def soldif(P,L,V,Q,N)
5389: {
5390: L = vweyl(L); X = L[0]; DX = L[1];
5391: P = mysubst(toeul(P,L,V),[DX,DX+Q]);
5392: DEG = mydeg(P,X);
5393: P0 = newvect(DEG+1);
5394: for(I = 0; I <= DEG; I++)
5395: P0[I] = coef(P,I,X);
5396: if(P0[0] == 0)
5397: return 0;
5398: if(subst(P0[0],DX,0) != 0){
5399: mycat([Q,"is not the exponent at", V])$
5400: return 0;
5401: }
5402: R = newvect(N+1);
5403: R[0] = 1;
5404: for(I = 1; I <= N; I++){
5405: for(S = 0, K = 1; K <= DEG && K <= I; K++)
5406: S += mysubst(P0[K],[DX,I-K])*R[I-K];
5407: S = red(S);
5408: M = mysubst(P0[0],[DX,I]);
5409: if(M != 0){
5410: R[I] = -red(S/M);
5411: if(R1 != 0){
5412: for(S = 0, K = 1; K <= DEG && K <= I; K++)
5413: S += mysubst(P0[K],[DX,I-K])*R1[I-K] +
5414: mysubst(P1[K],[DX,I-K])*R[I-K];
5415: R1[I] = -red(S/M);
5416: }
5417: }else{
5418: if(S == 0){
5419: if(R1 != 0){
5420: for(S = 0, K = 1; K <= DEG && K <= I; K++)
5421: S += mysubst(P0[K],[DX,I-K])*R1[I-K] +
5422: mysubst(P1[K],[DX,I-K])*R[I-K];
5423: }
5424: if(S == 0)
5425: continue;
5426: }
5427: R1 = newvect(N+1);
5428: for(K = 0; K < I; K++){
5429: R1[K] = R[K];
5430: R[K] = 0;
5431: }
5432: R1[I] = 0;
5433: P1 = newvect(DEG);
5434: for(K = 0; K <= DEG; K++)
5435: P1[K] = mydiff(P0[K], DX);
5436: M = mysubst(P1[0],[DX,I]);
5437: if(M == 0){
5438: cat(["multiple log at ", I])$
5439: return 0;
5440: }
5441: R[I] = -red(S/M);
5442: }
5443: }
5444: if(R1 != 0)
5445: return [R1, R];
5446: else
5447: return R;
5448: }
5449:
5450: def chkexp(P,L,V,Q,N)
5451: {
5452: L = vweyl(L); X = L[0]; DX = L[1];
5453: P = mysubst(toeul(P,L,V),[DX,DX+Q]);
5454: P = fromeul(P,L,0);
5455: D = mydeg(P,DX);
5456: Z = mindeg(mycoef(P,D,DX), X) - (D-N);
5457: R = [];
5458: for(I = 0; I < Z; I++){
5459: S = mycoef(P,I,X);
5460: if(S != 0){
5461: for(J = mydeg(S,DX); J >= 0; J--){
5462: T = mycoef(S,J,DX);
5463: if(T != 0)
5464: R = cons(T,R);
5465: }
5466: }
5467: }
5468: return R;
5469: }
5470:
1.4 ! takayama 5471:
! 5472: def sqrtrat(P)
! 5473: {
! 5474: if(P==0) return 0;
! 5475: if(type(P)==3||type(P)==2){
! 5476: P=red(P);
! 5477: if(imag(dn(P))!=0||imag(nm(P))!=0){
! 5478: if(imag(dn(P))==0&&real(P)!=0){
! 5479: F=red(imag(P)/real(P));
! 5480: if(F==3^(1/2)||F==-3^(1/2)){
! 5481: if(eval(real(P))<0)
! 5482: return -real(P)+imag(P)*@i;
! 5483: else{
! 5484: if(eval(imag(P))>0) return imag(P)+real(P)*@i;
! 5485: else return -imag(P)-real(P)*@i;
! 5486: }
! 5487: }
! 5488: }
! 5489: return [];
! 5490: }
! 5491: F=fctr(dn(P));
! 5492: R=sqrtrat(car(F)[0]);
! 5493: for(F=cdr(F);F!=[];F=cdr(F)){
! 5494: if(!iand(car(F)[1],1)) R*=car(F)[0]^(car(F)[1]/2);
! 5495: else return [];
! 5496: }
! 5497: F=fctr(nm(P));
! 5498: R=sqrtrat(car(F)[0])/R;
! 5499: for(F=cdr(F);F!=[];F=cdr(F)){
! 5500: if(!iand(car(F)[1],1)) R*=car(F)[0]^(car(F)[1]/2);
! 5501: else return [];
! 5502: }
! 5503: return R;
! 5504: }
! 5505: if(ntype(P)==4){
! 5506: P0=real(P);P1=imag(P)/2;
! 5507: X=makenewv(P);
! 5508: for(R=fctr(X^4-P0*X^2-P1^2);R!=[];R=cdr(R)){
! 5509: RT=car(R)[0];
! 5510: if(deg(RT,X)==1){
! 5511: X=-mycoef(RT,0,X)/mycoef(RT,1,X);
! 5512: return X+P1/X*@i;
! 5513: }
! 5514: if(deg(RT,X)==2){
! 5515: if((D=mycoef(RT,1,X)^2-4*mycoef(RT,2,X)*mycoef(RT,0,X))<0) continue;
! 5516: X=(-mycoef(RT,1,X)+sqrtrat(D))/(2*mycoef(RT,2,X));
! 5517: return X+P1*sqrt2rat(1/X)*@i;
! 5518: }
! 5519: }
! 5520: D=P0^2+4*P1^2;
! 5521: if(P1>0) return ((sqrtrat(D)+P0)/2)^(1/2)+((sqrtrat(D)-P0)/2)^(1/2)*@i;
! 5522: return ((sqrtrat(D)+P0)/2)^(1/2)-((sqrtrat(D)-P0)/2)^(1/2)*@i;
! 5523: }else if(ntype(P)!=0) return [];
! 5524: if(P==1) return P;
! 5525: Dn=dn(P);Nm=nm(P);C=R=1;
! 5526: N=pari(factor,Dn);
! 5527: if(N){
! 5528: for(II=car(size(N))-1;II>=0;II--){
! 5529: if(iand(K=N[II][1],1)){
! 5530: R*=N[II][0];
! 5531: K++;
! 5532: }
! 5533: C/=N[II][0]^(K/2);
! 5534: }
! 5535: }
! 5536: N=pari(factor,Nm);
! 5537: if(N){
! 5538: for(II=car(size(N))-1;II>=0;II--){
! 5539: if(N[II][0]==-1){
! 5540: C*=@i;
! 5541: continue;
! 5542: }
! 5543: K=N[II][1];
! 5544: if(iand(K,1)){
! 5545: R*=N[II][0];
! 5546: K--;
! 5547: }
! 5548: if(K!=0) C*=N[II][0]^(K/2);
! 5549: }
! 5550: }
! 5551: if(R!=1) C*=R^(1/2);
! 5552: return C;
! 5553: }
! 5554:
! 5555: def fctri(F)
! 5556: {
! 5557: R=(iscoef(F,os_md.israt))?fctr(F):[[1,1],[F,1]];
! 5558: if(!iscoef(F,os_md.iscrat)||chkfun("af_noalg",0)==0) return R;
! 5559: X=makenewv(vars(F));
! 5560: for(S=[];R!=[];R=cdr(R)){
! 5561: if(length(Var=vars(R0=car(R)[0])) == 1 && (D=mydeg(R0,Var=car(Var))) > 0){
! 5562: if(imag(T=mycoef(R0,D,Var))!=0) R0/=T;
! 5563: T=af_noalg(real(R0)+imag(R0)*X,[[X,X^2+1]]);
! 5564: if(length(T)>1||T[0][1]>1){
! 5565: T=subst(T,X,@i);
! 5566: for(; T!=[];T=cdr(T)){
! 5567: if(vars(T[0])!=[])
! 5568: S=cons([car(T)[0],car(T)[1]*car(R)[1]],S);
! 5569: }
! 5570: continue;
! 5571: }
! 5572: }
! 5573: S=cons(R[0],S);
! 5574: }
! 5575: return reverse(S);
! 5576: }
! 5577:
1.1 takayama 5578: def getroot(F,X)
5579: {
5580: S=[];
1.4 ! takayama 5581: if(type(Cpx=getopt(cpx))!=1) Cpx=0;
1.1 takayama 5582: M=getopt(mult);
5583: if(type(F) == 3)
5584: F = nm(red(F));
1.4 ! takayama 5585: for(R=fctri(F); length(R)>0; R = cdr(R)){
1.1 takayama 5586: T=car(R);
5587: P=car(T);
5588: I=car(cdr(T));
5589: if(mydeg(P,X)>0){
5590: if(mydeg(P,X)==1){
5591: C = mycoef(P,1,X);
5592: P = X - red(P/C);
1.4 ! takayama 5593: }else if(mydeg(P,X)==2 && Cpx>0){
! 5594: C2=mycoef(P,2,X);C1=mycoef(P,1,X);C0=mycoef(P,0,X);
! 5595: C=sqrt2rat(C1^2-4*C0*C2);
! 5596: C0=[];
! 5597: if(type(C)==0&&ntype(C)==0&&pari(issquare,-C)) C0=sqrt(C);
! 5598: else if(Cpx>1) C0=sqrtrat(C);
! 5599: if(C0==[]&&Cpx>2) C0=C^(1/2);
! 5600: if(C0!=[]){
! 5601: if(M==1)
! 5602: S=cons([I,sqrt2rat((-C1+C0)/(2*C2))],S);
! 5603: else{
! 5604: for(II=I; II>0; II--)
! 5605: S=cons(sqrt2rat((-C1+C0)/(2*C2)),S);
! 5606: }
! 5607: P=sqrt2rat((-C1-C0)/(2*C2));
! 5608: }
! 5609: }else if(mydeg(P,X)==3 && Cpx>1){
! 5610: Omg=(-1+3^(1/2)*@i)/2;
! 5611: PP=P/mycoef(P,3,X);
! 5612: C2=mycoef(PP,2,X)/3;
! 5613: PP=subst(PP,X,X-C2);
! 5614: if((C1=mycoef(PP,1,X))==0){
! 5615: C0=mycoef(PP,0,X);
! 5616: if(real(C0)==0||imag(C0)==0){
! 5617: if(real(C0)==0){
! 5618: PP=getroot(X^3+imag(C0),X);
! 5619: if(length(PP)==3){
! 5620: for(;PP!=[];PP=cdr(PP)){
! 5621: if(imag(PP[0])==0){
! 5622: C0=PP[0]*@i;
! 5623: break;
! 5624: }
! 5625: }
! 5626: if(PP==[]) C0=0;
! 5627: }
! 5628: }else{
! 5629: if(C0>0) C0=C0^(1/3);
! 5630: else C0=-(-C0)^(1/3);
! 5631: }
! 5632: if(C0!=0){
! 5633: if(M==1){
! 5634: S=cons([I,C0-C2],S);
! 5635: S=cons([I,C0*Omg-C2],S);
! 5636: S=cons([I,C0*(-1-Omg)-C2],S);
! 5637: }else{
! 5638: for(II=I; II>0; II--){
! 5639: S=cons(C0-C2,S);
! 5640: S=cons(C0*Omg-C2,S);
! 5641: S=cons(C0*(-1-Omg)-C2,S);
! 5642: }
! 5643: }
! 5644: continue;
! 5645: }
! 5646: }
! 5647: }
! 5648: if(Cpx>2){
! 5649: Q=X^2+(mycoef(PP,1,X)/3)*X+mycoef(PP,0,X)^3;
! 5650: SQ=getroot(Q,X|cpx=2);
! 5651: SQ=SQ[0]^(1/3);SQ2=mycoef(PP,0,X)/SQ;
! 5652: if(M==1){
! 5653: S=cons([I,SQ+SQ2-C2],S);
! 5654: S=cons([I,SQ*Omg+SQ2*(-1-Omg)-C2],S);
! 5655: S=cons([I,SQ*(-1-Omg)+SQ2*Omg-C2],S);
! 5656: }else{
! 5657: for(II=I; II>0; II--){
! 5658: S=cons(SQ+SQ2-C2,S);
! 5659: S=cons(SQ*Omg+SQ2*(-1-Omg)-C2,S);
! 5660: S=cons(SQ*(-1-Omg)+SQ2*Omg-C2,S);
! 5661: }
! 5662: }
! 5663: continue;
! 5664: }
! 5665: }else if(mydeg(P,X)==4 && Cpx>0){
! 5666: C2=mycoef(P,3,X)/(4*mycoef(P,4,X));
! 5667: PP=subst(P,X,X-C2);
! 5668: if(mycoef(PP,1,X)==0){
! 5669: PP=mycoef(PP,4,X)*X^2+mycoef(PP,2,X)*X+(SQ2=mycoef(PP,0,X));
! 5670: SQ=getroot(PP,X|cpx=2);
! 5671: if(length(SQ)==2){
! 5672: if((C0=sqrtrat(SQ[0]))==[]){
! 5673: if(mycoef(PP,1,X)==0){
! 5674: if(SQ2<0) C0=(-SQ2)^(1/4);
! 5675: else C0=SQ2^(1/4)*(1+@i)/2;
! 5676: }
! 5677: else if(Cpx>2) C0=SQ[0]^(1/2);
! 5678: else C0=0;
! 5679: }
! 5680: if((C1=sqrtrat(SQ[1]))==[]){
! 5681: if(mycoef(PP,1,X)==0) C1=-C0;
! 5682: else C1=SQ[1]^(1/2);
! 5683: }
! 5684: if(C0!=0){
! 5685: if(M==1)
! 5686: S=append([[I,C0-C2],[I,-C0-C2],[I,C1-C2],[I,-C1-C2]],S);
! 5687: else{
! 5688: for(II=I; II>0; II--)
! 5689: S=append([C0-C2,-C0-C2,C1-C2,-C1-C2],S);
! 5690: }
! 5691: continue;
! 5692: }
! 5693: }
! 5694: }else{
! 5695: PP/=mycoef(PP,4,X);
! 5696: CC=mycoef(PP,2,X);C1=mycoef(PP,1,X);C0=mycoef(PP,0,X);
! 5697: SQ=getroot(X*(CC+X)^2-4*C0*X-C1^2,X|cpx=Cpx);
! 5698: if(length(SQ)>1){
! 5699: SQ=sqrt2rat(SQ[0]);
! 5700: SQ2=getroot(X^2-SQ,X|cpx=Cpx);
! 5701: if(length(SQ2)>1){
! 5702: C1=SQ2[0]*X-C1/SQ2[0]/2;
! 5703: C0=getroot(X^2+CC/2+SQ/2+C1,X|cpx=Cpx);
! 5704: C1=getroot(X^2+CC/2+SQ/2-C1,X|cpx=Cpx);
! 5705: if(length(C0)>1&&length(C1)>1){
! 5706: C0=[sqrt2rat(C0[0]-C2),sqrt2rat(C0[1]-C2),
! 5707: sqrt2rat(C1[0]-C2),sqrt2rat(C1[1]-C2)];
! 5708: if(M==1) for(II=0;II<4;II++) S=cons([I,C0[II]],S);
! 5709: else for(II=I; II>0; II--) S=append(C0,S);
! 5710: continue;
! 5711: }
! 5712: }
! 5713: }
! 5714: }
1.1 takayama 5715: }
1.4 ! takayama 5716: if(M==1)
1.1 takayama 5717: S=cons([I,P],S);
1.4 ! takayama 5718: else for( ; I>0; I--) S=cons(P,S);
1.1 takayama 5719: }
5720: }
1.4 ! takayama 5721: S=qsort(S);
! 5722: if(M==1) S=reverse(S);
1.1 takayama 5723: return S;
5724: }
5725:
5726: def expat(F,L,V)
5727: {
5728: L = vweyl(L);
5729: if(V == "?"){
5730: Ans = [];
5731:
5732: F = nm(red(F));
5733: S = fromeul(toeul(F,L,"infty"),L,0);
5734: S = mycoef(S,mydeg(S,L[1]),L[1]);
5735: if(mydeg(S,L[0]) > 0)
5736: Ans = cons(["infty", expat(F,L,"infty")],Ans);
5737:
5738: S = mycoef(F,mydeg(F,L[1]), L[1]);
5739: R = getroot(S,L[0]);
5740: for(I = 0; I < length(R); I++){
5741: if(I > 0 && R[I-1] == R[I])
5742: continue;
5743: if(mydeg(R[I], L[0]) <= 0)
5744: Ans = cons([R[I], expat(F,L,R[I])], Ans);
5745: else
5746: Ans = cons([R[I]], Ans);
5747: }
5748: return Ans;
5749: }
5750: return getroot(subst(toeul(F,L,V),L[0],0),L[1]);
5751: }
5752:
5753: def polbyroot(P,X)
5754: {
5755: R = 1;
5756: while(length(P)){
5757: R *= X-car(P);
5758: if(type(R)>2) R = red(R);
5759: P = cdr(P);
5760: }
5761: return R;
5762: }
5763:
5764: def polbyvalue(P,X)
5765: {
5766: R = 1; S = 0;
5767: while(length(P)){
5768: T = car(P);
5769: V0 = T[1] - mysubst(S,[X,T[0]]);
5770: if(V0 != 0){
5771: if(type(R) > 2) R = red(R);
5772: V1 = mysubst(R,[X,T[0]]);
5773: if(V1 == 0){
5774: erno(0);
5775: return 0;
5776: }
5777: S += (V0/V1)*R;
5778: if(type(S) > 2) S = red(S);
5779: }
5780: R *= X - T[0];
5781: P = cdr(P);
5782: }
5783: return S;
5784: }
5785:
5786:
5787: def pcoef(P,L,Q)
5788: {
5789: if(L==0)
5790: return 1;
5791: Coef=TP=0;
5792: if(type(Q)>=4){
5793: TP=1;
5794: V=Q[0];
5795: if(type(V)==4)
5796: V=ltov(V);
5797: else V=dupmat(V);
5798: N=length(V);
5799: if(type(Q[1])==5) MR=dupmat(Q[1]);
5800: else{
5801: MR=newvect(N);
5802: for(K=Q[1], I=0; I< N; I++){
5803: MR[I] = car(K);
5804: K = cdr(K);
5805: }
5806: }
5807: }else{
5808: V=ltov(vars(P));
5809: N=length(V);
5810: MR=newvect(N);
5811: for(I=0;I<N;I++){
5812: MR[I]=mydeg(Q,V[I]);
5813: Q=mycoef(Q,MR[I],V[I]);
5814: }
5815: if(type(Q)>1) return 0;
5816: }
5817: /* mycat([V,MR]); */
5818: if(L==1){
5819: for(I=0;I<N;I++)
5820: P=mycoef(P,MR[I],V[I]);
5821: return P;
5822: }
5823: for(I=1;I<N;I++){ /* sorted by required degrees */
5824: for(K1=MR[I],K2=V[I],J=I-1; J>=0 && MR[J]<K1; J--);
5825: for(II=I-1;II>J;II--){
5826: MR[II+1]=MR[II];V[II+1]=V[II];
5827: }
5828: MR[II+1]=K1;V[II+1]=K2;
5829: }
5830: for(NN=N; N>0 && MR[N-1]==0; N--);
5831: Mon=[];Coe=[];Q=P;
5832: while(Q!=0){
5833: M=newvect(N);
5834: for(R=Q,F=I=0,MT=1;I<NN;I++){
5835: K=mydeg(R,V[I]);
5836: R=mycoef(R,K,V[I]);
5837: if(I<N) M[I]=K;
5838: if(K>0) MT*=V[I]^K;
5839: if(K>MR[I]) F=1;
5840: }
5841: Q -= R*MT;
5842: if(F==0){
5843: Mon=cons(M,Mon);
5844: Coe=cons(R,Coe);
5845: }
5846: }
5847: Mon=ltov(reverse(Mon));
5848: Coe=ltov(reverse(Coe));
5849: Len=length(Mon);
5850: S=newvect(Len);
5851: for(JL=0; JL<Len;JL++){
5852: if(L*Mon[JL][0]<MR[0]) break;
5853: }
5854: S[0]=L;
5855:
5856: K0=Mon[0][0];
5857: K=L*K0-MR[0];
5858: for(I=II=0;II<Len && K>=0;II++){
5859: if((K1=K0-Mon[0][II])>0){
5860: while(K>K1 && S[I]>0){
5861: S[I]--;S[II]++;
5862: K-=K1;
5863: I=II;
5864: K0=Mon[0][II];
5865: }
5866: }else break;
5867: }
5868:
5869: I=0;
5870: while(1){
5871: for(T=T0=J=JP=0; J<Len; J++){
5872: if(S[J]!=0){
5873: if(T0==0 && J>=JL) return Coef;
5874: JP=J;T0=1;
5875: T+=S[J]*Mon[J][I];
5876: }
5877: }
5878: if(T==MR[I]){
5879: if(++I<N) continue;
5880: for(TT=1,J=1; J<=L; J++) /* find a solution */
5881: TT*=J;
5882: for(J=0;J<Len;J++){
5883: if(S[J]!=0){
5884: TT*=Coe[J]^S[J];
5885: for(II=S[J]; II>1; II--)
5886: TT/=II;
5887: }
5888: }
5889: Coef+=TT;
5890: if(TP==1 && type(Coef)==3) Coef=red(Coef);
5891: if(JP<Len-2 && S[JP]>1){
5892: S[JP]-=2;S[JP+1]++;S[JP+2]++;
5893: }else{
5894: for(JT=JP-1;JT>=0&&S[JT]==0;JT--);
5895: if(JT<0) break;
5896: if(JT==JP-1){
5897: S[JT]--;
5898: if(JP<Len-1)
5899: S[JP+1]++;
5900: else
5901: S[JP]++;
5902: }else{
5903: S[JT]--;
5904: S[JT+1]+=S[JP]+1;
5905: S[JP]=0;
5906: }
5907: }
5908: I=0;
5909: continue;
5910: }
5911: if(JP<Len-1){
5912: for(JP1=JP+1;JP1<Len-1;JP1++){
5913: if(Mon[JP1][I]!=Mon[JP][I]) break;
5914: }
5915:
5916: if(I>0 && Mon[JP1][0] < Mon[JP][0]){
5917: S[JP]--;S[Len-1]++;JP=JP-1;
5918: }else{
5919:
5920: S[JP]--;
5921: if(JP1<Len){
5922: S[JP1]++;
5923: }else{
5924: S[JP1-1]++;
5925: }
5926: }
5927: }
5928: if(JP==Len-1){
5929: for(JT=JP-1;JT>=0 && S[JT]==0;JT--);
5930: if(JT<0) break;
5931: S[JT]--;
5932: if(JT==JP-1){
5933: S[JP]++;
5934: }else{
5935: S[JT+1]+=S[JP]+1;
5936: S[JP]=0;
5937: }
5938: }
5939: I=0;
5940: }
5941: return Coef;
5942: }
5943:
5944: def prehombf(P,Q)
5945: {
5946: if((Mem=getopt(mem))!=1 && Mem!=-1)
5947: return prehombfold(P,Q);
5948: /* CT=0; */
5949: if(Q==0) Q=P;
5950: V=ltov(vars(P));
5951: N=length(V);
5952: for(I=1;I<N;I++){ /* sorted by required degrees */
5953: for(K=mydeg(P,V[I]),K1=V[I],J=I-1; J>=0 && mydeg(P,V[J])<K; J--);
5954: for(II=I-1;II>J;II--) V[II+1]=V[II];
5955: V[II+1]=K1;
5956: }
5957: S=newvect(N);T=newvect(N);U=newvect(N);
5958: for(R=P,M=1,Deg=I=0;I<N;I++){ /* extreme vector */
5959: Deg+=(S[I]=mydeg(R,V[I]));
5960: R=mycoef(R,S[I],V[I]);
5961: }
5962: DR=[[-1,0]];
5963: if((R1=N/Deg)!=1){
5964: DR=cons([-R1,0],DR);
5965: Sft=1;
5966: }else Sft=0;
5967: if(Deg%2==0) Sg=1;
5968: else Sg=-1;
5969: for(I=0,R=R2=1,QQ=Q; 2*I+Sft < Deg; I++){
5970: if(Mem==-1){
5971: print(I+1,0);print("/",0);print(idiv(Deg-Sft+1,2),0);print(" ",2);
5972: }
5973: Coef=0;
5974: Q=QQ;
5975: while(Q!=0){
5976: for(R=Q,J=0,RR=1;J<N;J++){
5977: T[J]=mydeg(R,V[J]);
5978: R=mycoef(R,T[J],V[J]);
5979: if(T[J]>0) RR*=V[J]^T[J];
5980: }
5981: Q-=R*RR;
5982: for(J=0,CC=R;J<N;J++){
5983: U[J]=I*S[J]+T[J];
5984: for(II=0; II<T[J]; II++)
5985: CC*=(U[J]-II);
5986: }
5987: /* mycat([I+1,U,CC]); */
5988: CC*=pcoef(P,I+1,[V,U]);
5989: if(Mem==-1) print("*",2);
5990: /* mycat([++CT]); */
5991: Coef+=CC;
5992: }
5993: DR=cons([I,Coef],DR);
5994: DR=cons([-R1-1-I,Sg*Coef],DR);
5995: if(Mem==-1) print("");
5996: }
5997: /* mycat([DR]); */
5998: P = polbyvalue(DR,s);
5999: return fctr(P);
6000: }
6001:
6002: def prehombfold(P,Q)
6003: {
6004: V = vars(P);
6005: if(Q==0) Q=P;
6006: for(Deg=0, R=P, V1=V, DD=[]; V1!=[]; V1=cdr(V1)){
6007: VT = car(V1);
6008: D = mydeg(R,VT);
6009: R = mycoef(R,D,VT);
6010: Deg += D;
6011: X = makev(["d",VT]);
6012: Q = subst(Q,VT,X);
6013: DD=cons([VT,X],DD);
6014: }
6015: DR=[[-1,0]];
6016: NV=length(V);
6017: if((R1=NV/Deg)!=1){
6018: DR=cons([-R1,0],DR);
6019: Sft=1;
6020: }else
6021: Sft=0;
6022: if(Deg%2==0)
6023: Sg=1;
6024: else Sg=-1;
6025: for(I = 0, R=R2=1; 2*I+Sft < Deg; I++){
6026: R = R2;
6027: R2 = R*P;
6028: S = appldo(Q,R2,DD);
6029: QQ = sdiv(S,R);
6030: DR=cons([I,QQ],DR);
6031: DR=cons([-R1-1-I,Sg*QQ],DR);
6032: }
6033: /* mycat([DR]); */
6034: P = polbyvalue(DR,s);
6035: return fctr(P);
6036: }
6037:
6038: def sub3e(P0,P1,P2,N0,N1,N)
6039: {
6040: R = x^N0*(x-1)^N1*dx^N;
6041: for(V = I = 1, J = 1; I <= N; I++){
6042: S = 0;
6043: M = N-I;
6044: if(I <= N0){
6045: T = mycoef(P0,N0-I,x);
6046: S += T;
6047: R += T*x^(N0-I)*(x-1)^N1*dx^M;
6048: K1 = N0-I+1;
6049: }else
6050: K1 = 0;
6051: if(I <= N1){
6052: T = mycoef(P1,N1-I,x);
6053: S += T;
6054: R += T*x^N0*(x-1)^(N1-I)*dx^M;
6055: K2 = N0-1;
6056: }else
6057: K2 = N-I;
6058: for(K = K1; K <= K2; K++){
6059: if(K == K2){
6060: R += (mycoef(P2,N-I,x)-S)*x^K*(x-1)^(M-K)*dx^M;
6061: continue;
6062: }
6063: R += strtov("r"+rtostr(V))*x^K*(x-1)^(M-K)*dx^M;
6064: S += strtov("r"+rtostr(V++));
6065: }
6066: }
6067: if(V > 1)
6068: mycat([V-1, "accessory parameters: r1,r2,..."]);
6069: return R;
6070: }
6071:
6072: def fuchs3e(P,Q,R)
6073: {
1.3 takayama 6074: return getbygrs([R,P,Q],3);
1.1 takayama 6075: }
6076:
6077: def okubo3e(P,Q,R)
6078: {
1.3 takayama 6079: if(getopt(opt)==1){
6080: N=length(R);
6081: M1=N-length(P);M2=N-length(Q);
6082: V=(M1-1)*(M2-1);
6083: if(V>0) mycat([V, "accessory parameters"]);
6084: return getbygrs([R,cons([M1,0],P),cons([M2,0],Q)],3);
6085: }
1.1 takayama 6086: S = 0;
6087: V = -1;
6088: L = newvect(3,[[],[],[]]);
6089: N = newvect(3,[0,0,0]);
6090: if(type(R) < 4){
6091: I = -1;
6092: V = 3;
6093: }else{
6094: I = 2;
6095: V = -1;
6096: }
6097: for( ; I >= 0; I--){
6098: if(I == 2)
6099: U = R;
6100: else if(I == 1)
6101: U = Q;
6102: else
6103: U = P;
6104: for( ; length(U); U = cdr(U)){
6105: T = car(U);
6106: if( T == "?"){
6107: if(V < 0)
6108: V = I;
6109: else
6110: return 0;
6111: }else{
6112: if(I == 2)
6113: L[I] = cons(-T, L[I]);
6114: else
6115: L[I] = cons(T, L[I]);
6116: S += T;
6117: }
6118: N[I]++;
6119: }
6120: }
6121: if(V == 3){
6122: N[2] = N[0] + N[1];
6123: P2 = x^N;
6124: for(I = 1; I <= N; I++)
6125: P2 += makev([R,I])*x^(N-I);
6126: }else{
6127: if(N[0]+N[1] != N[2]){
6128: print("Number of exponents are wrong",0);
6129: return -1;
6130: }
6131: S -= N[0]*N[1];
6132: if(V < 0){
6133: if(S != 0){
6134: mycat(["Viorate Fuchs relation ->",S]);
6135: return -2;
6136: }
6137: }else{
6138: if(V != 2)
6139: S = -S;
6140: L[V] = cons(S, L[V]);
6141: }
6142: P2 = polinsft(polbyroot(L[2],x),x);
6143: }
6144: P0 = polinsft(mysubst(polbyroot(L[0],x),[x,x+N[1]]),x);
6145: P1 = polinsft(mysubst(polbyroot(L[1],x),[x,x+N[0]]),x);
6146: return sub3e(P0,P1,P2,N[0],N[1],N[2]);
6147: }
6148:
6149: /* N = 2*M (N-M = M) or 2*M+1 (N-M = M+1)
6150: 0 : 0 1 ..... M-1 B B+1 ... B+N-M-2 A
6151: 1 : C C+1 ... C+M-1 0 1 .... N-M-2 N-M-1
6152: */
6153: def eosub(A,B,C,N)
6154: {
6155: M = N%2;
6156: P = [];
6157: Q = [];
6158: P = cons(A,P);
6159: for(I = 0; I < N-M-1; I++)
6160: P = cons(B+I,P);
6161: for(I = 0; I < M; I++)
6162: Q = cons(C+I,Q);
6163: P = okubo3e(P,Q,s);
6164:
6165: C = newvect(2);
6166: L = newvect(2);
6167: C[1] = chkexp(P,[x,dx],0,b,N-M-1);
6168: C[0] = chkexp(P,[x,dx],1,c,M);
6169: for(LL = K = 0; K < 2; K++){
6170: L[K] = length(C[K]);
6171: C[K] = ltov(C[K]);
6172: if(L[K] > LL)
6173: LL = L[K];
6174: }
6175: JJ = 0;
6176:
6177: for(I = 1; Do; I++){
6178: Do = 0;
6179: S = makev(["r",I]);
6180: for(J = JJ; J < LL; J++){
6181: JJ = LL;
6182: for(K = 0; K < 2; K++){
6183: if(J >= L[K] || C[K][J] == 0)
6184: continue;
6185: if(J < JJ)
6186: JJ = J;
6187: if(Do == 1){
6188: CC = C[K];
6189: CC[J] = mysubst(CC[J], [S, Var]);
6190: continue;
6191: }
6192: if(mydeg(C[K][J]) >= 1){
6193: if(mydeg(C[K][J]) > 1){
6194: print("Internal error");
6195: return;
6196: }
6197: Var = getroot(C[K][J],S);
6198: Var = Var[0];
6199: CC = C[K];
6200: CC[J] = 0;
6201: P = mysubst(P, [S, Var]);
6202: Do = 1;
6203: J = JJ - 1;
6204: K++;
6205: }
6206: }
6207: }
6208: }
6209: if(JJ != L){
6210: print("Internal error (non Rigid)");
6211: return;
6212: }
6213: return P;
6214: }
6215:
6216: def even4e(X,Y){
6217: if(length(X) != 4 || length(Y) != 2){
6218: print("Usage: even4e([a,b,c,d],[e,f])");
6219: print("0: 0 1 e f");
6220: print("1; 0 1 * *+1");
6221: print("infty: a b c d");
6222: return;
6223: }
6224: S = -3;
6225: for(I = 0; I < 4; I++){
6226: S += X[I];
6227: if(I < 2)
6228: S += Y[I];
6229: }
6230: S = -S/2;
6231: P = okubo3e(Y,[S,"?"],X);
6232: T = chkexp(P,x,1,S,2);
6233: T = getroot(T[0],r1);
6234: return mysubst(P,[r1,T[0]]);
6235: }
6236:
6237: def odd5e(X,Y)
6238: {
6239: if(length(X) != 5 || length(Y) != 2){
6240: print("Usage: spec6e([a,b,c,d,e],[f,g])");
6241: print("0: 0 1 f g g+1");
6242: print("1: 0 1 2 * *+1");
6243: print("infty: a b c d e");
6244: return;
6245: }
6246: S = -4;
6247: for(I = 0; I < 5; I++){
6248: S += X[I];
6249: if(I < 2)
6250: S += Y[I];
6251: }
6252: S = -(S + Y[1])/2;
6253: P = okubo3e([Y[0],Y[1],Y[1]+1],[S,"?"],X);
6254: T = chkexp(P,x,1,S,2);
6255: T = getroot(T[0],r1);
6256: P = mysubst(P,[r1,T[0]]);
6257: T = chkexp(P,x,0,Y[1],2);
6258: T = getroot(T[0],r2);
6259: return mysubst(P,[r2,T[0]]);
6260: }
6261:
6262: def extra6e(X,Y)
6263: {
6264: if(length(X) != 6 || length(Y) != 2){
6265: print("Usage: extra6e([a,b,c,d,e,f],[g,h])");
6266: print("0: 0 1 g g+1 h h+1");
6267: print("1: 0 1 2 3 * *+1");
6268: print("infty: a b c d e f");
6269: return;
6270: }
6271: S = -5;
6272: for(I = 0; I < 6; I++){
6273: S += X[I];
6274: if(I < 2)
6275: S += 2*Y[I];
6276: }
6277: S = -S/2;
6278: P = okubo3e([Y[0],Y[0]+1,Y[1],Y[1]+1],[S,"?"],X);
6279: T = chkexp(P,x,1,S,2);
6280: T = getroot(T[0],r1);
6281: P = mysubst(P,[r1,T[0]]);
6282: T = chkexp(P,x,0,Y[0],2);
6283: T = getroot(T[0],r3);
6284: P = mysubst(P,[r3,T[0]]);
6285: T = chkexp(P,x,0,Y[1],2);
6286: T = getroot(T[0],r2);
6287: return mysubst(P,[r2,T[0]]);
6288: }
6289:
6290: def rigid211(X,Y,Z)
6291: {
6292: if(length(X) != 2 || length(Y) != 2 || length(Z) != 2){
6293: print("Usage: rigid211([a,b],[c,d],[e,f])");
6294: print("0: 0 1 a b");
6295: print("1: 0 1 c d");
6296: print("infty: e e+1 f *");
6297: return;
6298: }
6299: P = okubo3e(X,Y,[Z[0],Z[0]+1,Z[1],"?"]);
6300: T = chkexp(P,x,"infty",Z[0],2);
6301: T = getroot(T[0],r1);
6302: return mysubst(P,[r1,T[0]]);
6303: }
6304:
6305: def solpokuboe(P,L,N)
6306: {
6307: if(type(N) > 1 || ntype(N) != 0 || dn(N) != 1){
6308: mycat(["Irrigal argument :", N]);
6309: return 0;
6310: }
6311: L = vweyl(L);
6312: DD=N+1;
6313: for(U = S = L[0]^N; U != 0; ){
6314: D = mydeg(U,L[0]);
6315: if(D>=DD){
6316: mycat(["Internal Error",D,DD]);
6317: return -1;
6318: }
6319: DD=D;
6320: UU = L[0]^D;
6321: R = appldo(P,UU,L);
6322: if(mydeg(R,L[0]) > D){
6323: printf("Bad operator\n");
6324: return 0;
6325: }
6326: CC = mycoef(R,D,L[0]);
6327: if(D == N){
6328: P -= (E = CC);
6329: U = R-E*U;
6330: continue;
6331: }
6332: if(CC == 0){
6333: printf("No polynomial\n");
6334: return 0;
6335: }
6336: CC= mycoef(U,D,L[0])/CC;
6337: S = red(S - UU*CC);
6338: U = red(U - R*CC);
6339: }
6340: return [nm(S),E];
6341: }
6342:
6343: def stoe(M,L,N)
6344: {
6345: L = vweyl(L);
6346: Size = size(M);
6347: S = Size[0];
6348: NN = 0;
6349: if(type(N) == 4){
6350: NN=N[0]; N=N[1];
6351: }else if(N < 0){
6352: NN=-N; N=0;
6353: }
6354: if(S != Size[1] || N >= S || NN >= S)
6355: return;
6356: D = newmat(S+1,S+1);
6357: MN = dupmat(M);
6358: MD = newmat(S,S);
6359: DD = D[0];
6360: DD[N] = 1; DD[S] = 1;
6361: for(Lcm = I = 1; ; ){
6362: DD = D[I];
6363: MM = MN[N];
6364: for(J = 0; J < S; J++){
6365: DD[J] = MM[J];
6366: Lcm = lcm(dn(DD[J]),Lcm);
6367: }
6368: DD[S] = L[1]^I;
6369: for(J = 0; J <= S; J++)
6370: DD[J] = red(DD[J]*Lcm);
6371: if(I++ >= S)
6372: break;
6373: if(I==S && NN>0){
6374: DD = D[I];
6375: DD[0]=-z_zz; DD[NN]=1;
6376: break;
6377: }
6378: Mm = dupmat(MN*M);
6379: for(J = 0; J < S; J++){
6380: for(K = 0; K < S; K++)
6381: MN[J][K] = red(diff(MN[J][K],L[0])+Mm[J][K]);
6382: }
6383: }
6384: #if 0
6385: P = fctr(mydet2(D));
6386: #else
6387: P = fctr(det(D));
6388: #endif
6389: for(I = R = 1; I < length(P); I++){
6390: if(mydeg(P[I][0],L[1]) > 0)
6391: R *= P[I][0]^P[I][1];
6392: }
6393: if(NN > 0)
6394: R = -red(coef(R,0,z_zz)/coef(R,1,z_zz));
6395: return R;
6396: }
6397:
6398: def dform(L,X)
6399: {
6400: if(type(X)==2) X=[X];
6401: if(type(L[0])!=4) L=[L];
6402: if(type(X)==4) X=ltov(X);
6403: M=length(X);
6404: if(length(car(L))==2){
6405: R=newvect(M);
6406: for(LL=L; LL!=[]; LL=cdr(LL)){
6407: for(I=0; I<M; I++){
6408: RT=rmul(car(LL)[0],mydiff(car(LL)[1],X[I]));
6409: R[I] = (R[I]==0)?RT:radd(R[I],RT);
6410: }
6411: }
6412: Dif=getopt(dif);
6413: for(RR=[], I=M-1; I>=0; I--){
6414: if(Dif==1) RR=cons([1,R[I],X[I]],RR);
6415: else RR=cons([R[I],X[I]],RR);
6416: }
6417: if(Dif==1) RR=dform(RR,X);
6418: return RR;
6419: }else if(length(car(L))!=3) return L;
6420: N=M*(M-1)/2;
6421: R=newvect(N);
6422: S=newvect(N);
6423: for(LL=L; LL!=[]; LL=cdr(LL)){
6424: for(I=K=0; I<M; I++){
6425: for(J=I+1; J<M; J++, K++){
6426: if(LL==L) S[K]=[X[I],X[J]];
6427: LT=car(LL);
6428: R1=mydiff(LT[2],X[J]);
6429: R2=mydiff(-LT[2],X[I]);
6430: if(R2==0){
6431: if(R1==0) continue;
6432: R1=rmul(mydiff(LT[1],X[I]),R1);
6433: }else if(R1==0){
6434: R1=rmul(mydiff(LT[1],X[J]),R2);
6435: }else
6436: R1=rmul(mydiff(LT[1],X[I]),R1)+rmul(mydiff(LT[1],X[J]),R2);
6437: R1=rmul(LT[0],R1);
6438: R[K] = (R[K]==0)?R1:radd(R[K],R1);
6439: }
6440: }
6441: }
6442: for(RR=[],I=N-1; I>=0; I--)
6443: RR=cons([R[I],S[I][0],S[I][1]],RR);
6444: return RR;
6445: }
6446:
6447: def polinvsym(P,Q,Sym)
6448: {
6449: N = length(Q);
6450: T = polbyroot(Q,zz);
6451: for(I = 1; I <= N; I++){
6452: P = mysubst(P,[makev([Sym,I]), (-1)^I*coef(T,N-I,zz)]);
6453: }
6454: return P;
6455: }
6456:
6457: def polinsym(P,Q,Sym)
6458: {
6459: if(type(P) == 3){
6460: P = red(P);
6461: if(type(P) == 3){
6462: D = polinsym(dn(P),Q,Sym);
6463: if(D == 0)
6464: return 0;
6465: return polinsym(nm(P),Q,Sym)/D;
6466: }
6467: }
6468: N = length(Q);
6469: V = newvect(N+1);
6470: S = newvect(N+1);
6471: E = newvect(N+1);
6472: E0 = newvect(N+1);
6473: T = polbyroot(Q,zzz);
6474: for(J = 1; J <= N; J++){
6475: K = coef(T,N-J,zzz);
6476: if(J % 2)
6477: K = -K;
6478: S[J] = K;
6479: V[J] = makev([Sym,J]);
6480: }
6481: K = deg(P,Q[0]);
6482: for(J = 0; J <= N; J++)
6483: E0[J] = K+1;
6484: E[0] = K+1;
6485: while(deg(P,Q[0]) > 0){
6486: for(P0 = P, J = 1; J <= N; J++){
6487: E[J] = deg(P0,Q[J-1]);
6488: P0 = coef(P0,E[J],Q[J-1]);
6489: }
6490: /* P0*Q[0]^E[1]*Q[1]^E[2]*... E[1] >= E[2} >= ... */
6491: for(J = 1; J <= N; J++){
6492: if(E[J] < E0[J])
6493: break;
6494: if(E[J-1] < E[J])
6495: J = N;
6496: }
6497: if(J > N){
6498: print("Not symmetric");
6499: return 0;
6500: }
6501: for(J = 1; J <= N; J++)
6502: E0[J] = E[J];
6503: for(J = N; J > 1; J--){
6504: if(E[J] != 0)
6505: for(K = 1; K < J; K++)
6506: E[K] -= E[J];
6507: }
6508: for(R0 = P0, K = 1; K <= N; K++){
6509: if(E[K] > 0)
6510: P0 *= S[K]^E[K];
6511: R0 *= V[K]^E[K];
6512: }
6513: P += R0 - P0;
6514: }
6515: return P;
6516: }
6517:
6518: def tohomog(P,L,V)
6519: {
6520: while(length(L)>0){
6521: P = mysubst(P,[car(L),car(L)/V]);
6522: L = cdr(L);
6523: }
6524: P = red(P);
6525: N = mindeg(dn(P),V);
6526: if(N > 0)
6527: P = red(P*V^N);
6528: N = mindeg(dn(P),V);
6529: if(N > 0)
6530: P = red(P/(V^N));
6531: return P;
6532: }
6533:
6534: def substblock(P,X,Q,Y)
6535: {
6536: P = red(P);
6537: if(deg(dn(P),X) > 0)
6538: return substblock(nm(P),X,Q,Y)/substblock(dn(P),X,Q,Y);
6539: N = mydeg(Q,X);
6540: if(N < 1)
6541: return P;
6542: R = mycoef(Q,N,X);
6543: while(M = mydeg(P,X), M >= N)
6544: P = red(P - mycoef(P,M,X)*(Q-Y)*X^(M-N)/R);
6545: return P;
6546: }
6547:
6548: def okuboetos(P,L)
6549: {
6550: L = vweyl(L); X = L[0]; DX = L[1];
6551: N = mydeg(P,DX);
6552: C = mycoef(P,N,DX);
6553: K = mydeg(C,X);
6554: if(K > N){
6555: print("Irregular singularity at infinity")$
6556: return 0;
6557: }
6558: if(N > K)
6559: P *= x^(N-K);
6560:
6561: L = getroot(mycoef(P,N,DX),x);
6562: L = ltov(reverse(L));
6563: if(length(L) != N || N == 0){
6564: print("Cannot get exponents")$
6565: return 0;
6566: }
6567: if( type(LL = getopt(diag)) == 4 ){
6568: LL = ltov(LL);
6569: if(length(LL) != N){
6570: mycat(["Length of the option should be", N]);
6571: return 0;
6572: }
6573: Tmp = newvect(N);
6574: for(I = N-1; I >= 0; I--){
6575: for(LLT = LL[I], J = N-1; J >=0 ; J--){
6576: if(LLT == L[J] && Tmp[J] == 0){
6577: Tmp[J] = 1;
6578: break;
6579: }
6580: }
6581: if(J < 0){
6582: print("option is wrong");
6583: return 0;
6584: }
6585: }
6586: L = LL;
6587: }
6588: P /= mycoef(C,N,X);
6589: A = newmat(N,N);
6590: AT = newmat(N+1,N+1);
6591: Phi= newvect(N+1);
6592: Phi[0] = 1;
6593: for(J = 0; J < N; J++)
6594: Phi[J+1] = Phi[J]*(X-L[J]);
6595: for(ATT = AT[N], J = 0; J < N; J++)
6596: ATT[J] = mycoef(P,J,DX);
6597:
6598: for(K = 1; K <= N; K++){
6599: for(J = N; J >= K; J--){
6600: Aj = A[J-1];
6601: SIG = AT[J][J-K];
6602: for(I = 0; I <= K-2; I++)
6603: SIG += Aj[J-I-1]*AT[J-I-1][J-K];
6604: if(K == 1)
6605: DAT = mydiff(Phi[J-1],X);
6606: else
6607: DAT = mydiff(AT[J-1][J-K],X);
6608: Aj[J-K] = -SIG+(X-L[J-1])*DAT;
6609: Aj[J-K] /= Phi[J-K];
6610: Aj[J-K] = mysubst(Aj[J-K],[X,L[J-1]]);
6611: if(J < K+1) continue;
6612: ATj = AT[J-1];
6613: ATj[J-K-1] = SIG+Aj[J-K]*Phi[J-K];
6614: ATj[J-K-1] /= (X - L[J-1]);
6615: ATj[J-K-1] = red(ATj[J-K-1]-DAT);
6616: }
6617: }
6618:
6619: ATT = newmat(N,N);
6620: for(J = 0; J < N; J++){
6621: for(K = 0; K < N; K++){
6622: ATj = ATT[J];
6623: ATj[K] = AT[J][K];
6624: }
6625: ATj[J] = Phi[J];
6626: if(J < N-1){
6627: ATj = A[J];
6628: ATj[J+1] = 1;
6629: }
6630: }
6631: return [L,A,ATT];
6632: }
6633:
6634: def heun(X,P,R)
6635: {
6636: if(type(X) != 4 || length(X) != 5){
6637: print("Usage: huen([a,b,c,d,e],p,r)");
6638: print("0: 0 c");
6639: print("1: 0 d");
6640: print("p: 0 e");
6641: print("infty: a b");
6642: print("Fuchs relation: a+b+1 = c+d+e");
6643: return;
6644: }
6645: S = 1;
6646: V = -1;
6647: X = ltov(X);
6648: for(I = 0; I < 5; I++){
6649: if(X[I] == "?"){
6650: if(V >= 0)
6651: return;
6652: V = I;
6653: }else if(I < 2){
6654: S += X[I];
6655: }else
6656: S -= X[I];
6657: }
6658: if(V >= 0){
6659: if(V < 2)
6660: X[V] = -S;
6661: else
6662: X[V] = S;
6663: }else if(S != 0){
6664: mycat(["Fuch relation:", S,"should be zero!"]);
6665: return;
6666: }
6667: return
6668: x*(x-1)*(x-P)*dx^2
6669: + (X[2]*(x-1)*(x-P)+X[3]*x*(x-P)+X[4]*x*(x-1))*dx
6670: + X[0]*X[1]*(x-R);
6671: }
6672:
6673: def fspt(M,T)
6674: {
6675: if(type(M)==7) M=s2sp(M);
6676: if(T == 3) /* 3: cut 0 */
6677: return cutgrs(M);
6678: if(T == 4 || T== 5){ /* 4: short 5: long */
6679: for(MN = [] ; M != []; M = cdr(M)){
6680: MT = car(M);
6681: for(MNT = []; MT != []; MT = cdr(MT)){
6682: if(type(car(MT)) <= 3){
6683: if(T == 4) MNT = cons(car(MT),MNT);
6684: else MNT = cons([1,car(MT)],MNT);
6685: }else{
6686: if(T == 5 || car(MT)[0] > 1) MNT = cons(car(MT),MNT);
6687: else if(car(MT)[0] == 1) MNT = cons(car(MT)[1],MNT);
6688: }
6689: }
6690: MN = cons(reverse(MNT), MN);
6691: }
6692: return reverse(MN);
6693: }
6694: if(type(M[0][0]) == 4){
6695: for(MN = [] ; M != []; M = cdr(M)){
6696: MT = car(M);
6697: for(MNT = []; MT != []; MT = cdr(MT))
6698: MNT = cons(car(MT)[0], MNT);
6699: MN = cons(reverse(MNT), MN);
6700: }
6701: return fspt(reverse(MN),T);
6702: }
6703: if(T == 0) /* 0: sp */
6704: return M;
6705: for(MN = [] ; M != []; M = cdr(M)){
6706: MT = qsort(ltov(car(M)));
6707: L = length(MT);
6708: for(MNT = [], I = 0; I < L; I++)
6709: MNT = cons(MT[I], MNT);
6710: MN = cons(MNT, MN);
6711: }
6712: MN = reverse(MN);
6713: if(T==6) return MN; /* 7: sort */
6714: L = length(MN);
6715: for(M = MN; M != []; M = cdr(M)){
6716: for(I = 0, MT = car(M); MT != []; MT = cdr(MT))
6717: I += car(MT);
6718: if(OD == 0)
6719: OD = I;
6720: else if(OD != I || OD == 0)
6721: return 0;
6722: }
6723: ALL = [MN];
6724: RD=[];
6725: while(OD > 0){
6726: for(S = 0, MT = MN; MT != []; MT = cdr(MT))
6727: S += car(MT)[0];
6728: S -= (L-2)*OD;
6729: if(S <= 0){
6730: if(T==7) return [ALL[0],ALL[length(ALL)-1],RD];
6731: return (T==1)?MN:ALL;
6732: }
6733: RD=cons([S,0,0],RD);
6734: for(NP=0, M = [], MT = MN; MT != []; NP++, MT = cdr(MT)){
6735: MTT = car(MT);
6736: I = MTT[0] - S;
6737: if(I < 0){
6738: if(I+OD!=0) return 0;
6739: if(T==7) return [ALL[0],ALL[length(ALL)-1],cdr(RD)];
6740: return (T==1)?MN:ALL;
6741: }
6742: MTT = cdr(MTT);
6743: NC=1; DO=0;
6744: for(MNT = []; MTT != []; MTT = cdr(MTT)){
6745: if(MTT[0] > I){
6746: if(DO==0) RD=cons([MTT[0]-I,NP,NC++],RD);
6747: MNT = cons(MTT[0], MNT);
6748: }
6749: else if(MTT[0] <= I && I != 0){
6750: DO=1;
6751: MNT = cons(I, MNT);
6752: I = 0;
6753: if(MTT[0] > 0)
6754: MNT = cons(MTT[0], MNT);
6755: }
6756: }
6757: if(I > 0)
6758: MNT = cons(I,MNT);
6759: M = cons(reverse(MNT), M);
6760: }
6761: MN = reverse(M);
6762: ALL = cons(MN,ALL);
6763: OD -= S;
6764: }
6765: }
6766:
6767: def abs(X)
6768: {
1.4 ! takayama 6769: if(vars(X)!=[]) return todf(os_md.abs,[X]);
! 6770: if(type(X)==4){
! 6771: P=X[1];X=X[0];
! 6772: }else P=0;
1.3 takayama 6773: if(type(X)==1){
6774: if((T=ntype(X))<2 || T==3){
6775: if(X<0) X=-X;
1.4 ! takayama 6776: }else if(T==4) X=P?pari(abs,X,P):pari(abs,X);
1.3 takayama 6777: }
1.1 takayama 6778: return X;
6779: }
6780:
6781: def calc(X,L)
6782: {
6783: if(type(X)<4){
6784: if(type(L)==4){
6785: V=L[1];
6786: if((L0=L[0])=="+") X+=V;
6787: else if(L0=="-") X-=V;
6788: else if(L0=="*") X*=V;
6789: else if(L0=="/") X/=V;
6790: else if(L0=="^") X^=V;
6791: else if(L0==">") X=(X>V);
6792: else if(L0=="<") X=(X<V);
6793: else if(L0=="=") X=(X==V);
6794: else if(L0==">=") X=(X>=V);
6795: else if(L0=="<=") X=(X<=V);
6796: else if(L0=="!=") X=(X!=V);
6797: }else if(type(L)==7){
6798: if(L=="neg") X=-X;
6799: else if(L=="abs") X=abs(X);
6800: else if(L=="neg") X=-X;
6801: else if(L=="sqr") X*=X;
6802: else if(L=="inv") X=1/X;
6803: else if(L=="sgn"){
6804: if(X>0)X=1;
6805: else if(X<0) X=-1;
6806: }
6807: }
6808: }
6809: return X;
6810: }
6811:
6812: def isint(X)
6813: {
6814: if(X==0||(type(X)==1 && ntype(X)==0 && dn(X)==1)) return 1;
6815: return 0;
6816: }
6817:
1.3 takayama 6818: def israt(X)
6819: {
6820: if(X==0||(type(X)==1 && ntype(X)==0)) return 1;
6821: return 0;
6822: }
6823:
1.4 ! takayama 6824: def iscrat(X)
! 6825: {
! 6826: if(X==0 || (type(X)==1 && israt(real(X)) && israt(imag(X)))) return 1;
! 6827: return 0;
! 6828: }
! 6829:
1.1 takayama 6830: def isalpha(X)
6831: {
6832: return ((X>64&&X<91)||(X>96&&X<123))?1:0;
6833: }
6834:
6835: def isnum(X)
6836: {
6837: return (X>47&&X<58)?1:0;
6838: }
6839:
6840: def isalphanum(X)
6841: {
6842: return (isalpha(X)||isnum(X))?1:0;
6843: }
6844:
6845: def isvar(X)
6846: {
1.3 takayama 6847: return ([X]==vars(X)&&vtype(X)<3)?1:0;
1.1 takayama 6848: }
6849:
6850: def isyes(F)
6851: {
6852: if((CC=getopt(set))==1){
6853: IsYes=(type(F[0])==4)?F:[F];
6854: return 1;
6855: }else if(CC==0) return(IsYes);
6856: if(type(CC)!=7)
6857: CC=IsYes;
6858: for(;CC!=[]; CC=cdr(CC)){
6859: C=car(CC);
6860: V=call(C[0],cons(F,C[1]));
6861: if(type(C[2])!=4){
6862: if(V!=C[2]) break;
6863: }else{
6864: if(C[2][0]!="" && V<C[2][0]) break;
6865: if(C[2][1]!="" && V>C[2][1]) break;
6866: }
6867: }
6868: return (CC==[])?1:0;
6869: }
6870:
6871: def isall(FN,M)
6872: {
6873: if(type(M)<4 || type(M)>6) return ((*FN)(M)==0)?0:1;
6874: if(type(M)==4){
6875: for(;M!=[];M=cdr(M))
6876: if((*FN)(car(M))==0) return 0;
6877: }else if(type(M)==5){
6878: K=length(M);
6879: for(I=0;I<K;I++)
6880: if((*FN)(M[I])==0) return 0;
6881: }else if(type(M)==6){
6882: K=size(M)[0];
6883: for(I=0;I<K;I++)
6884: if (isall(FN,M[I])==0) return 0;
6885: }
6886: return 1;
6887: }
6888:
6889: def sproot(MP,T)
6890: {
6891: if((I=str_chr(T,0,","))>0){
6892: if(type(MP)==7) M=s2sp(MP);
6893: else M=chkspt(MP|opt=0);
6894: if(I==length(M[0])){
6895: N=s2sp(T);S=SM=SN=K=0;
6896: for(MM=M,NN=N;MM!=[];MM=cdr(MM),NN=cdr(NN),K++){
6897: for(MT=car(MM),NT=car(NN);MT!=[];MT=cdr(MT),NT=cdr(NT)){
6898: S+=car(MT)*car(NT);
6899: if(K==0){
6900: SM+=car(MT);SN+=car(NT);
6901: }
6902: }
6903: }
6904: return S-(length(M)-2)*SM*SN;
6905: }
6906: }
6907: MM=chkspt(MP|opt=7);
6908: if(T=="base") return MM;
6909: Keep=(getopt(keep)==1)?1:0;
6910: Null=getopt(null);
6911: Only=getopt(only);
6912: if(type(Only)!=1) Only=7;
6913: M0=MM[0];
6914: M1=MM[1];
6915: M=MM[2];
6916: if(T=="length") return length(M);
6917: if(T=="height"){
6918: for(J=2,S=M1[0][0],M2=M1; M2!=[]; M2=cdr(M2)){
6919: for(MT=cdr(car(M2)); MT!=[]; J++, MT=cdr(MT)){
6920: S+= J*car(MT);
6921: }
6922: J=1;
6923: }
6924: return S;
6925: }
6926: for(OD=0, MT=M1[0]; MT!=[]; MT=cdr(MT)) OD+=car(MT);
6927: if(T=="type"){
6928: R=newvect(OD+1);
6929: for(MT=M; MT!=[]; MT=cdr(MT)) R[MT[0][0]]++;
6930: for(RR=[],I=OD; I>0; I--)
6931: if(R[I]>0) RR=cons([R[I],I],RR);
6932: return RR;
6933: }
6934: if(T=="part"||T=="pair"||T=="pairs"){
6935: NP=length(M1);
6936: LM=newvect(NP);
6937: R=newvect(length(M));
6938: for(K=0; K<NP; K++) LM[K]=length(M1[K]);
6939: for(I=0,TM=M; TM!=[]; I++, TM=cdr(TM)){
6940: V=newvect(NP);
6941: for(K=0; K<NP; K++) V[K]=newvect(LM[K]);
6942: TP=car(TM);
6943: if(TP[2]==0){
6944: for(K=0;K<NP;K++) V[K][0]=1;
6945: for(J=0; J<I; J++){
6946: VJ=R[J][1];
6947: for(S=K=0;K<NP;K++) S+=VJ[K][0];
6948: for(OD=0,K=0;K<LM[0];K++) OD+=VJ[0][K];
6949: S-=(NP-2)*OD;
6950: for(K=0;K<NP;K++) VJ[K][0]-=S;
6951: }
6952: }else{
6953: K=TP[1]; P=TP[2];
6954: V[K][P-1]=-1; V[K][P]=1;
6955: for(J=0; J<I; J++){
6956: VJ=R[J][1];
6957: S=VJ[K][P]; VJ[K][P]=VJ[K][P-1]; VJ[K][P-1]=S;
6958: }
6959: }
6960: R[I]=[TP[0],V];
6961: }
6962: if(T=="pair"||T=="pairs"){
6963: MV=ltov(M1);
6964: for(K=0; K<NP; K++) MV[K] = ltov(MV[K]);
6965: for(RR=UU=SS=[],I=0; I<length(M); I++){
6966: V=newvect(NP); W=newvect(NP); U=newvect(NP);
6967: for(K=0; K<NP; K++){
6968: U[K]=newvect(LM[K]); V[K]=newvect(LM[K]); W[K]=newvect(LM[K]);
6969: }
6970: S=R[I][0];
6971: for(K=0; K<NP; K++){
6972: for(Q=J=0; J<LM[K]; J++){
6973: V[K][J] = S*(U[K][J] = R[I][1][K][J]);
6974: Q+=(W[K][J] = MV[K][J] - V[K][J]);
6975: }
6976: }
6977: if(Q>0 && iand(Only,1)==0) continue;
6978: if(Q==0 && iand(Only,2)==0) continue;
6979: if(Q<0 && iand(Only,4)==0) continue;
6980: for(K=0; K<NP; K++){
6981: V[K] = vtol(V[K]); W[K] = vtol(W[K]); U[K]=vtol(U[K]);
6982: }
6983: V=vtol(V); W=vtol(W);U=vtol(U);
6984: if(Q<0) S=-S;
6985: RR = cons([V,W], RR); UU = cons(U,UU); SS=cons(S,SS);
6986: }
6987: RR = reverse(RR); UU=reverse(UU); SS=reverse(SS);
6988: if(getopt(dviout)==1 && (Null!=1 || RR!=[])){
6989: Out=string_to_tb("\\begin{align}\\begin{split}"+s2sp(M1)+"&=");
6990: for(I=0,R=RR, U=UU; R!=[]; I++, R=cdr(R), U=cdr(U)){
6991: if(I>0) str_tb("\\\\\n &=",Out);
6992: if(T=="pairs"){
6993: if((S=SS[I])<0) S=-S;
6994: if(S>1) str_tb([my_tex_form(S),"("],Out);
6995: str_tb(s2sp(car(U)),Out);
6996: if(S>1) str_tb(")",Out);
6997: str_tb(" \\oplus ",Out);
6998: if(SS[I]<0){
1.3 takayama 6999: #ifdef USEMODULE
7000: str_tb(["-(",s2sp(mtransbys(os_md.abs,car(R)[1],[])),")"],Out);
7001: #else
1.1 takayama 7002: str_tb(["-(",s2sp(mtransbys(abs,car(R)[1],[])),")"],Out);
1.3 takayama 7003: #endif
1.1 takayama 7004: }else
7005: str_tb(s2sp(car(R)[1]),Out);
7006: }else
7007: str_tb([s2sp(car(R)[0])," \\oplus ",s2sp(car(R)[1])],Out);
7008: }
7009: str_tb("\n\\end{split}\\end{align}",Out);
7010: dviout(str_tb(0,Out)|keep=Keep);
7011: }
7012: return RR;
7013: }
7014: for(I=0; I<length(M); I++){
7015: for(K=0; K<NP; K++) R[I][1][K] = vtol(R[I][1][K]);
7016: R[I] = [R[I][0],vtol(R[I][1])];
7017: }
7018: R = vtol(R);
7019: return [M0,M1,R];
7020: }
7021: }
7022:
7023: def spgen(MO)
7024: {
7025: Eq=(getopt(eq)==1)?1:0;
7026: Sp=getopt(sp);
7027: if(type(Sp)==7) Sp=s2sp(Sp);
7028: St=getopt(str);
7029: LP=getopt(pt);
7030: if(type(LP)==4){
7031: L0=LP[0]; L1=LP[1];
7032: }else{
7033: L0=0; L1=MO+1;
7034: }
7035: if(MO<=0){
7036: MO=-MO;
7037: if(iand(MO,1)==1) return [];
7038: if(MO>1){
7039: if(isMs()==0) return [];
7040: Cmd="okubo "+rtostr(-MO);
7041: MO/=2;
7042: if(L1>0) Cmd=Cmd+"+"+rtostr(L0)+"-"+rtostr(L1);
7043: else L1=MO+4;
7044: Cmd=Cmd+" B";
7045: Id=getbyshell(Cmd);
7046: if(Id<0) return [];
7047: B=[];
7048: while((S=get_line(Id)) !=0){
7049: P0=str_chr(S,1,":")+1;
7050: if(P0>1){
7051: P1=str_chr(S,P,"\n");
7052: if(P1<0) P1=str_len(S);
7053: B=cons(sub_str(S,P0,P1-1),B);
7054: }
7055: }
7056: }else{
7057: MO/=2;
7058: if(L1<=1) L1=MO+4;
7059: BB=[
7060: ["11,11,11,11","111,111,111","1^4,1^4,22","1^6,222,33"],
7061: ["11,11,11,11,11","1^4,1^4,211","211,22,22,22","1^6,2211,33",
7062: "2211,222,222","22211,2^4,44","2^511,444,66","1^4,22,22,31",
7063: "2^5,3331,55","1^5,1^5,32","1^8,332,44","111,111,21,21","1^5,221,221"],
7064: ["11,11,11,11,11,11","1^4,1^4,1^4","1^4,22,22,22","111,111,111,21",
7065: "1^6,21^4,33","21^4,222,222","221^4,2^4,44","2^41^4,444,66",
7066: "1^5,1^5,311","1^8,3311,44","1^6,222,321","321,33,33,33",
7067: "3321,333,333","33321,3^4,66","3^721,666,99","2^5,3322,55",
7068: "1^6,1^6,42","222,33,33,42","1^a,442,55","1^6,33,33,51",
7069: "222,222,33,51","1^9,333,54","2^7,554,77","1^5,2111,221",
7070: "2^41,333,441","1^7,2221,43","211,211,22,22","2211,2211,222",
7071: "22211,22211,44","1^4,211,22,31","2^411,3331,55","1^4,1^4,31,31",
7072: "22,22,22,31,31","1^7,331,331","2221,2221,331","111,21,21,21,21"],
7073: ["11,11,11,11,11,11,11","111,111,111,111","1^6,1^6,33",
7074: "1^6,222,222","222,33,33,33","1^5,1^5,221",
7075: "1^4,211,22,22","1^4,1^4,22,31","22,22,22,22,31",
7076: "111,111,21,21,21","21^6,2^4,44","2221^6,444,66",
7077: "1^6,222,3111","3111,33,33,33","33111,333,333",
7078: "333111,3^4,66","3^5111,666,99","2^5,33211,55",
7079: "1^8,3221,44","3222,333,333","33222,3^4,66",
7080: "3^4222,666,99","1^6,1^6,411","222,33,33,411",
7081: "1^a,4411,55","2^4,2^4,431","431,44,44,44",
7082: "2^6,4431,66","4431,444,444","44431,4^4,88",
7083: "4^531,888,cc","1^a,433,55","1^7,1^7,52",
7084: "1^c,552,66","3^4,444,552","1^8,2^4,53",
7085: "1^8,44,44,71","3^5,555,771","21^4,2211,222",
7086: "221^4,22211,44","2221^4,3331,55","1^6,2211,321",
7087: "2^411,3322,55","1^7,322,331","2211,33,33,42",
7088: "3^42,4442,77","2211,222,33,51","3^51,5551,88",
7089: "2^611,554,77","2221,2221,322","2^41,2^41,54",
7090: "1^5,2111,2111","222111,333,441","1^7,22111,43",
7091: "1^5,1^5,41,41","1^9,441,441","22111,2221,331",
7092: "1^5,221,32,41","221,221,221,41","211,211,211,22",
7093: "2211,2211,2211","1^4,211,211,31","211,22,22,31,31",
7094: "1^4,22,31,31,31","1^5,32,32,32","221,221,32,32","21,21,21,21,21,21"],
7095: ["11,11,11,11,11,11,11,11","1^4,1^4,22,22","1^8,2^4,44",
7096: "1^6,2211,222","2211,33,33,33","111,111,111,21,21",
7097: "1^5,1^5,2111","1^4,211,211,22","1^4,1^4,211,31",
7098: "211,22,22,22,31","1^4,22,22,31,31","111,21,21,21,21,21",
7099: "221^8,444,66","2^5,331^4,55","1^8,32111,44",
7100: "32211,333,333","332211,3^4,66","3^42211,666,99",
7101: "2^5,32221,55","1^7,1^7,511","1^c,5511,66",
7102: "3^4,444,5511","541,55,55,55","5541,555,555",
7103: "55541,5^4,aa","5^541,aaa,ff","1^8,1^8,62",
7104: "1^a1^4,662,77","1^a,55,55,91","2^71,555,87",
7105: "21^6,22211,44","221^6,3331,55","1^6,2211,3111",
7106: "2^411,33211,55","1^7,3211,331","2211,33,33,411",
7107: "3^42,44411,77","22211,2^4,431","2^511,4431,66",
7108: "1^8,332,431","3^42,4433,77","1^8,22211,53",
7109: "2221,2221,3211","221^5,333,441","1^7,21^5,43",
7110: "1^b,443,65","21^5,2221,331","2^51,3332,65",
7111: "21^4,21^4,222","221^4,221^4,44","1^6,21^4,321",
7112: "2221^4,3322,55","21^4,33,33,42","21^4,222,33,51",
7113: "2^51^4,554,77","2^4,3311,3311","3^411,4442,77",
7114: "321,321,33,33","3321,3321,333","33321,33321,66",
7115: "222,321,33,42","1^6,321,33,51","222,222,321,51",
7116: "1^9,3321,54","1^7,322,322","3^422,5551,88",
7117: "1^6,33,42,42","1^6,222,42,51","33,33,33,42,51",
7118: "1^6,1^6,51,51","222,33,33,51,51","1^b,551,551",
7119: "1^5,221,311,41","2^41,3321,441","22111,2221,322",
7120: "2^51,443,551","222111,2^41,54","21^4,2211,2211",
7121: "1^5,311,32,32","3331,3331,442","2211,2211,33,51",
7122: "221,221,311,32","22111,22111,331","1^5,2111,32,41",
7123: "2111,221,221,41","2111,221,32,32","211,211,211,211",
7124: "211,211,22,31,31","1^4,211,31,31,31","22,22,31,31,31,31"],
7125: ["11,11,11,11,11,11,11,11,11","1^5,1^5,1^5","2^5,2^5,55",
7126: "111,111,111,111,21","2^41,333,333","1^4,1^4,211,22",
7127: "211,22,22,22,22","1^8,22211,44","1^4,1^4,1^4,31",
7128: "1^4,22,22,22,31","1^7,1^7,43","1^7,2221,331",
7129: "2221,2221,2221","1^6,21^4,222","21^4,33,33,33",
7130: "1^6,1^6,321","222,321,33,33","1^6,33,33,42",
7131: "222,222,33,42","1^6,222,33,51","222,222,222,51",
7132: "33,33,33,33,51","1^6,2211,2211","111,111,21,21,21,21",
7133: "1^5,1^5,32,41","1^5,221,221,41","1^5,221,32,32",
7134: "221,221,221,32","1^4,211,211,211","211,211,22,22,31",
7135: "1^4,211,22,31,31","1^4,1^4,31,31,31","22,22,22,31,31,31",
7136: "21,21,21,21,21,21,21","21^a,444,66","1^8,31^5,44",
7137: "321^4,333,333","3321^4,3^4,66","3^421^4,666,99",
7138: "2^5,322111,55","32^41,3^4,66","3332^41,666,99",
7139: "1^8,1^8,611","2^4,44,44,611","1^d,6611,77",
7140: "4^5,66611,aa","2^6,444,651","3^4,3^4,651",
7141: "651,66,66,66","3^6,6651,99","6651,666,666",
7142: "66651,6^4,cc","6^551,ccc,ii","2^8,655,88",
7143: "1^9,1^9,72","1^g,772,88","1^c,444,75",
7144: "2^6,3^4,75","1^c,66,66,b1","3^4,444,66,b1",
7145: "3^7,777,ba","1^7,2221,4111","2^41,333,4311",
7146: "1^9,2^41,63","21^8,3331,55","2^411,331^4,55",
7147: "1^7,31^4,331","2^411,32221,55","22211,2^4,422",
7148: "2^511,4422,66","1^8,332,422","2^5,3331,541",
7149: "22211,44,44,62","2^411,2^5,64","2^711,664,88",
7150: "1^a,3331,64","2221,2221,31^4","21^7,333,441",
7151: "333,333,441,81","2^6111,555,87","21^6,221^4,44",
7152: "221^6,3322,55","2^41^6,554,77","1^6,21^4,3111",
7153: "3111,321,33,33","33111,3321,333","333111,33321,66",
7154: "222,3111,33,42","1^6,3111,33,51","222,222,3111,51",
7155: "1^9,33111,54","2221^4,33211,55","1^7,3211,322",
7156: "3^4211,5551,88","2^4,3221,3311","333221,4442,77",
7157: "3222,3321,333","33222,33321,66","1^9,3222,54",
7158: "21^4,33,33,411","3^411,44411,77","222,321,33,411",
7159: "1^6,33,411,42","1^6,222,411,51","33,33,33,411,51",
7160: "221^4,2^4,431","2^41^4,4431,66","1^8,3311,431",
7161: "3^411,4433,77","33321,444,552","1^8,221^4,53",
7162: "3311,44,44,53","4^42,5553,99","2^4,3311,44,71",
7163: "3^421,555,771","4^52,7771,bb","3^611,776,aa",
7164: "2^41,33111,441","22111,2221,3211","2^41,3222,441",
7165: "2^61,4441,76","3331,3331,4411","22211,22211,431",
7166: "3331,3331,433","3^41,3^41,76","1^7,1^7,61,61",
7167: "1^d,661,661","21^5,2221,322","221^5,2^41,54",
7168: "2^51,33311,65","21^5,22111,331","3^41,4441,661",
7169: "1^7,331,43,61","2221,2221,43,61","2221,331,331,61",
7170: "21^4,21^4,2211","21^4,2211,33,51","22211,3311,3311",
7171: "1^5,311,311,32","2211,321,33,42","2211,222,321,51",
7172: "3322,3331,442","2211,222,42,42","2^411,442,442",
7173: "1^6,2211,42,51","2211,33,33,51,51","221,221,311,311",
7174: "1^5,2111,311,41","222111,3321,441","22111,22111,322",
7175: "222111,222111,54","2111,221,311,32","2111,2111,221,41",
7176: "1^5,221,41,41,41","2221,43,43,43","1^5,32,32,41,41",
7177: "331,331,43,43","221,221,32,41,41","221,32,32,32,41",
7178: "211,211,211,31,31","211,22,31,31,31,31","1^4,31,31,31,31,31"]];
7179: B=BB[MO];
7180: }
7181: if(St!=1){
7182: for(R=[]; B!=[]; B=cdr(B)){
7183: RT=s2sp(car(B));
7184: if(length(RT)<L0 || length(RT)>L1) continue;
7185: R=cons(RT,R);
7186: }
7187: return reverse(R);
7188: }else{
7189: if(L0<=3 && L1>=MO+4) return B;
7190: for(R=[]; B!=[]; B=cdr(B)){
7191: RT=s2sp(car(B));
7192: if(length(RT)<L0 || length(RT)>L1) continue;
7193: R=cons(car(B),R);
7194: }
7195: return reverse(R);
7196: }
7197: /*
7198: MM = 3*MO+5;
7199: if(L1<=1) L1=MM/2+1;
7200: R = newvect(MM+2);
7201: for(RR=[], I=MO/2+2; I>0; I--)
7202: RR=cons([1,1],RR);
7203: R[2]=[RR];
7204: if(MO==0){
7205: R[6] = [[[3,3],[2,2,2],[1,1,1,1,1,1]]];
7206: R[4] = [[[2,2],[1,1,1,1],[1,1,1,1,]]];
7207: R[3] = [[[1,1,1],[1,1,1],[1,1,1]]];
7208: }else{
7209: I=MO/2+1;
7210: R[MM+1]=[[[3*I,3*I],[2*I,2*I,2*I],[I,I,I,I,I,I-1,1]]];
7211: }
7212: */
7213: }
7214: MP=(L1<MO+1)?L1:MO+1;
7215: LL=newvect(MO+1);
7216: R=newvect(MP+2);
7217: R0=newvect(MP+2);
7218: for(I=1; I<=MO; I++) LL[I]=[];
7219: if(type(Sp)==4){
7220: if(getopt(basic)==1) Sp=chkspt(Sp[6]);
7221: R=chkspt(Sp);
7222: if(R[1]>MO) return 0;
7223: LL[R[1]]=R;
7224: K=R[1];
7225: }
7226: if(K==1||type(Sp)!=4){
7227: LL[1]=[[[1]]];
7228: for(I=2; I<=MO && I<MP;I++){
7229: for(T=[], J=0; J<I+1; J++)
7230: T=cons([I-1,1],T);
7231: LL[I]=cons(T,LL[I]);
7232: }
7233: K=2;
7234: }
7235: /* mycat(LL); */
7236: for(OD=K; OD<MO; OD++){
7237: for(LT=LL[OD]; LT!=[]; LT=cdr(LT)){
7238: for(II=0,L=car(LT); L!=[]; II++, L=cdr(L)){
7239: R0[II]=R[II]=car(L);
7240: }
7241: /* mycat([R0,R]); */
7242: for(; ;){
7243: for(S=-2*OD, I=0; I<II; I++){
7244: S += OD;
7245: if(R[I]!=[]) S-=car(R[I]);
7246: }
7247: --I;
7248: for(;S+OD<=MO && I<=MP;S+=OD,I++){
7249: /* mycat(["C",I]); */
7250: if(S<=0) continue;
7251: /* mycat(["+",S,I,II,R,R0]); */
7252: for(J=0;J<=I;J++){
7253: /* mycat([S+((R[J]==[])?0:car(R[J])),car(R0[J])]); */
7254: if(J>=II){
7255: if(S<OD) break;
7256: }else
7257: if(S+((R[J]==[])?0:car(R[J]))<car(R0[J])) break;
7258: }
7259: if(--J>=I){
7260: V=newvect(I);
7261: RRR=[];
7262: for(;J>=0;J--){
7263: if(J>=II) RR=[OD,S];
7264: else{
7265: K=length(R[J]);
7266: RR=[S+((K==0)?0:car(R[J]))];
7267: K=length(R0[J])-K;
7268: for(RT=R0[J]; RT!=[]; K--,RT=cdr(RT)){
7269: if(K!=0) RR=cons(car(RT),RR);
7270: }
7271: }
7272: RRR=cons(reverse(RR),RRR);
7273: }
7274: /* mycat(["Get",s2sp(RRR)]); */
7275: RRR=qsort(reverse(RRR));
7276: if(findin(RRR,LL[S+OD])<0)
7277: LL[S+OD]=cons(RRR,LL[S+OD]);
7278: }
7279: }
7280: /* mycat(["*",I,R]); */
7281: for(K=0; K<II; K++){
7282: if(R[K]!=[]){
7283: S=car(R[K]);
7284: while((R[K]=cdr(R[K]))!=[] && car(R[K])==S);
7285: break;
7286: }else R[K]=R0[K];
7287: }
7288: /* mycat([R,R0]); */
7289: if(K>=II) break;
7290: }
7291: }
7292: }
7293: if(L0>0 || L1<MO+1 || St==1){
7294: for(J=1; J<=MO; J++){
7295: for(RT=[],R=LL[J]; R!=[];R=cdr(R)){
7296: L=length(car(R));
7297: if(L<L0 || L>L1) continue;
7298: RT=cons((St==1)?s2sp(car(R)):car(R),RT);
7299: }
7300: LL[J] = reverse(RT);
7301: }
7302: }
7303: if(Eq==1) return LL[MO];
7304: return LL;
7305: }
7306:
1.4 ! takayama 7307: def spType2(L)
! 7308: {
! 7309: C=0;R=[];
! 7310: for(LT=L;LT!=[];LT=cdr(LT)){
! 7311: D=-1;LP=car(LT);
! 7312: for(LPT=LP;LPT!=[];LPT=cdr(LPT)){
! 7313: if(D==-1) D=car(LPT);
! 7314: else D=igcd(D,car(LPT));
! 7315: if(D==1){
! 7316: C++;break;
! 7317: }
! 7318: }
! 7319: if(C==2) return 0;
! 7320: R=cons(D,R);
! 7321: }
! 7322: if(C==0) return L;
! 7323: if(C==1){
! 7324: for(K=length(R)-1;R[K]!=1;K--);
! 7325: D=-1;
! 7326: for(I=length(R)-1;I>=0;I--){
! 7327: if(I==K) continue;
! 7328: if(D==-1) D=R[I];
! 7329: else D=igcd(D,R[I]);
! 7330: if(D==1) return 0;
! 7331: }
! 7332: }
! 7333: return L;
! 7334: }
! 7335:
1.1 takayama 7336:
7337: /* ret [#points, order, idx, Fuchs, reduction order, reduction exponents, fund] */
7338: def chkspt(M)
7339: {
7340: Opt= getopt(opt);
7341: Mat= getopt(mat);
7342: if(type(M)==7) M=s2sp(M);
7343: if(type(Opt) >= 0){
7344: if(type(Opt) == 7)
7345: Opt = findin(Opt, ["sp","basic","construct","strip","short","long","sort","root"]);
7346: if(Opt < 0){
7347: erno(2);
7348: return 0;
7349: }
7350: return fspt(M,Opt);
7351: }
7352: MR = fspt(M,1);
7353: P = length(M);
7354: OD = -1;
7355: XM = newvect(P);
7356: Fu = 0;
7357: for( I = SM = SSM = 0; I < P; I++ ){
7358: LJ = length(M[I]);
7359: JM = JMV = 0;
7360: for(J = SM = 0; J < LJ; J++){
7361: MV = M[I][J];
7362: if(type(MV) == 4){
7363: Fu += MV[0]*MV[1];
7364: MV = MV[0];
7365: }
7366: if(MV > JMV){
7367: JM = J; JMV = MV;
7368: }
7369: SM += MV;
7370: SSM += MV^2;
7371: }
7372: if(OD < 0)
7373: OD = SM;
7374: else if(OD != SM){
7375: print("irregal partitions");
7376: return 0;
7377: }
7378: XM[I] = JM;
7379: }
7380: SSM -= (P-2)*OD^2;
7381: for(I = SM = JM = 0; I < P; I++){
7382: MV = M[I][XM[I]];
7383: if(type(MV) == 4){
7384: MV = MV[0]; JM = 1;
7385: }
7386: if(I == 0)
7387: SMM = MV;
7388: else if(SMM > MV)
7389: SMM = MV;
7390: SM += MV;
7391: }
7392: SM -= (P-2)*OD;
7393: if(SM > SMM && SM != 2*OD){
7394: print("not realizable");
7395: return -1;
7396: }
7397: if(JM==1 && Mat!=1)
7398: Fu -= OD - SSM/2;
7399: return [P, OD, SSM, Fu, SM, XM, MR];
7400: }
7401:
7402: def cterm(P)
7403: {
7404: V = getopt(var);
7405: if(type(V) != 4)
7406: V=vars(P);
7407: for(; V !=[]; V = cdr(V))
7408: P = mycoef(P,0,car(V));
7409: return P;
7410: }
7411:
7412: def terms(P,L)
7413: {
7414: Lv=getopt(level);
7415: if(type(Lv)!=1) Lv=0;
7416: V=car(L);L=cdr(L);
7417: for(R=[],D=mydeg(P,V);D>=0; D--){
7418: if((Q=mycoef(P,D,V))==0) continue;
7419: if(L!=[]){
7420: R0=terms(Q,L|level=Lv+1);
7421: for(;R0!=[];R0=cdr(R0)) R=cons(cons(D,car(R0)),R);
7422: }else R=cons([D],R);
7423: }
7424: if(Lv>0) return R;
7425: R=qsort(R);
7426: Rev = getopt(rev); Dic=getopt(dic);
7427: if(Dic==1 && Rev==1) R=reverse(R);
7428: for(R0=[];R!=[];R=cdr(R)){
7429: for(RT=car(R),S=0;RT!=[];RT=cdr(RT)) S+=car(RT);
7430: R0=cons(cons(S,car(R)),R0);
7431: }
7432: if(Dic==1) return R0;
1.3 takayama 7433: if(Rev==1){
7434: for(R=[];R0!=[];R0=cdr(R0)){
7435: T=car(R0);
7436: R=cons(cons(-car(T),cdr(T)),R);
7437: }
7438: R0=R;
7439: }
1.1 takayama 7440: R0=qsort(R0);
1.3 takayama 7441: if(Rev==1){
7442: for(R=[];R0!=[];R0=cdr(R0)){
7443: T=car(R0);
7444: R=cons(cons(-car(T),cdr(T)),R);
7445: }
7446: R0=R;
7447: }
1.1 takayama 7448: return (Rev==1)?R0:reverse(R0);
7449: }
7450:
7451: def polcut(P,N,L)
7452: {
7453: if(type(L)==2) L=[L];
7454: M=getopt(top);
7455: if(type(M)!=1) M=0;
7456: T=terms(P,L);
7457: for(S=0;T!=[];T=cdr(T)){
7458: LT=car(T);
7459: if(LT[0]<M || LT[0]>N) continue;
7460: for(PW=1,LT=cdr(LT),V=L,Q=P;LT!=[];LT=cdr(LT),V=cdr(V)){
7461: Q=mycoef(Q,car(LT),car(V));PW*=car(V)^car(LT);
7462: }
7463: S+=Q*PW;
7464: }
7465: return S;
7466: }
7467:
7468: def redgrs(M)
7469: {
7470: Mat = getopt(mat);
7471: if(Mat!=1) Mat=0;
7472: R = chkspt(M|mat=Mat);
7473: if(type(R) < 4)
7474: return -1;
7475: if(R[4] <= 0)
7476: return 1-R[4];
7477: if(R[4] == 2*R[1])
7478: return 0;
7479: V = newvect(R[0]);
7480: Type = type(M[0][0]);
7481: if(Type > 3){
7482: Mu = Mat-1;
7483: for(I = 0; I < R[0]; I++)
7484: Mu += M[I][R[5][I]][1];
7485: }
7486: for(I = 0; I < R[0]; I++){
7487: IR = R[5][I]; L = []; MI = M[I]; MIE=MI[IR];
7488: for(J = length(MI)-1; J >= 0; J--){
7489: if(Type <= 3){
7490: VM = MI[J];
7491: if(J == IR){
7492: VM -= R[4];
7493: if(VM < 0)
7494: return -1;
7495: }
7496: L = cons(VM, L);
7497: }else{
7498: VM = MI[J][0];
7499: if(J == IR){
7500: VM -= R[4];
7501: if(VM < 0)
7502: return -1;
7503: if(I == 0)
7504: EV = 1-Mat-Mu;
7505: else
7506: EV = 0;
7507: }else{
7508: if(I == 0)
7509: EV = MI[J][1] - M[0][R[5][0]][1] + 1-Mat; /* + MX - Mu; */
7510: else
7511: EV = MI[J][1] - MIE[1] + Mu;
7512: }
7513: L = cons([VM,EV], L);
7514: /*
7515: if(R[2] >= 2){ */ /* digid */
7516: /* P = dx^(R[1]);
7517: } */
7518: }
7519: }
7520: V[I] = L;
7521: }
7522: return [R[5], vtol(V)];
7523: }
7524:
7525: def cutgrs(A)
7526: {
7527: for(AL=[] ; A!=[]; A=cdr(A)){ /* AT: level 2 */
7528: for(ALT=[], AT=car(A); AT!=[]; AT=cdr(AT)){
7529: M = (type(car(AT)) < 4)?car(AT):car(AT)[0];
7530: if(M > 0)
7531: ALT = cons(car(AT), ALT); /* ALT: level 2 */
7532: }
7533: AL = cons(reverse(ALT), AL); /* AL: level 3 */
7534: }
7535: return reverse(AL);
7536: }
7537:
7538: def mcgrs(G, R)
7539: {
7540: NP = length(G);
7541: Mat = (getopt(mat)==1)?0:1;
7542: for(R = reverse(R) ; R != []; R = cdr(R)){
7543: GN = [];
7544: L = length(G)-1;
7545: RT = car(R);
7546: if(type(RT) == 4){
7547: RT = reverse(RT); S = 0;
7548: for(G = reverse(G); G != []; G = cdr(G), L--){
7549: AD = car(RT); RT = cdr(RT);
7550: if(L > 0)
7551: S += AD;
7552: else
7553: AD = -S;
7554: for(GTN = [], GT = reverse(car(G)); GT != []; GT = cdr(GT))
7555: GTN = cons([car(GT)[0],car(GT)[1]+AD], GTN);
7556: GN = cons(GTN, GN);
7557: }
7558: G = GN;
7559: continue;
7560: }
7561: VP = newvec(L+1); GV = ltov(G);
7562: for(I = S = OD = 0; I <= L; I++){
7563: RTT = (I==0)?(Mat-RT):0;
7564: VP[I] = -1;
7565: for(J = M = 0, GT = GV[I]; GT != []; GT = cdr(GT), J++){
7566: if(I == 0)
7567: OD += car(GT)[0];
7568: if(car(GT)[1] == RTT && car(GT)[0] > M){
7569: S += car(GT)[0]-M;
7570: VP[I] = J;
7571: }
7572: }
7573: S -= (L-1)*OD;
7574: for(GN = [] ; L >= 0; L--){
7575: GT = GV[L];
7576: RTT = (L==0)?(-RT):RT;
7577: FTN = (VP[L] >= 0 || S == 0)?[]:[-S,(L==0)?(Mat-RT):0];
7578: for(J = 0; GT != []; GT = cdr(GT), J++){
7579: if(J != VP[L]){
7580: GTN = cons([car(GT)[0],car(GT)[1]+RTT], GTN);
7581: continue;
7582: }
7583: K = car(GT)[0] - S;
7584: if(K < 0){
7585: print("Not realizable");
7586: return;
7587: }
7588: GTN = cons([K,(L==0)?(Mat-RT):0], GTN);
7589: }
7590: GN = cons(reverse(GTN), GN);
7591: }
7592: }
7593: G = cutgrs(GN);
7594: }
7595: return G;
7596: }
7597:
1.4 ! takayama 7598: def add2grs(R,T,K)
! 7599: {
! 7600: F=0;T1=[T[0],4];T2=[T[1],4];
! 7601: if(I[0]>I[1]) I=[I[1],I[0]];
! 7602: if(R[0][0]==T) F=1;
! 7603: else if(R[0][1]==T) F=2;
! 7604: if(getopt(Ad)==1){
! 7605: K=-K;
! 7606: if(R[0][0]==T1||car(PG)[0][0]==T2){
! 7607: F=1;break;
! 7608: }
! 7609: if(car(PG)[0][1]==T1||car(PG)[0][0]==T2){
! 7610: F=2;break;
! 7611: }
! 7612: }
! 7613: if(!F) return R;
! 7614: G=reverse(cdr(R));
! 7615: for(L=[];G!=[];G=cdr(G)){
! 7616: if(F==1) L=cons([car(G)[0],car(G)[1]+K,car(G)[2]],TL);
! 7617: else L=cons([car(G)[0],car(G)[1]+K,car(G)[2]],L);
! 7618: }
! 7619: return cons(car(R),L);
! 7620: }
! 7621:
! 7622:
! 7623: def sub2grs(R,I,K)
! 7624: {
! 7625: if(length(R[0])==1){
! 7626: if(R[0]!=I[0]){
! 7627: errno(0);
! 7628: return R;
! 7629: }
! 7630: VL=ltov(L);L=len(VL);
! 7631: for(I=cdr(I);I!=[];I=cdr(I)){
! 7632: V=car(I)[1];
! 7633: for(K=0;K<L;K++)
! 7634: if(I[K][1]==V) VL[K]=[car(I)[0]-I[K][0],V];
! 7635: }
! 7636: for(L=[],K=L-1;K>=0;K--) if(VL[K][1]) L=cons(VL[K],L);
! 7637: return cons(car(L),L);
! 7638: }
! 7639: F=0;
! 7640: if(I[0]>I[1]) I=[I[1],I[0]];
! 7641: if(R[0][0]==I) F=1;
! 7642: else if(R[0][1]==I) F==2;
! 7643: if(!F) return R;
! 7644: Eq=getopt(eq);
! 7645: for(L=[],G=reverse(cdr(R));G!=[];G=cdr(T))
! 7646: if((Eq!=1&&car(G)[F]!=K)||(Eq==1&&car(G)[F]==K)) L=cons(car(G),L);
! 7647: return cons(car(R),G);
! 7648: }
! 7649:
! 7650: def join2grs(R,J,K)
! 7651: {
! 7652: if(J[0]>J[1]) J=[J[1],J[0]];
! 7653: G=reverse(cdr(R));L=[];
! 7654: I=car(R);
! 7655: if(I[0]<J[0]){
! 7656: for(;G!=[];G=cdr(G)) L=cons([car(G)[0],car(G)[1],K],L);
! 7657: return cons([I,J],L);
! 7658: }
! 7659: for(;G!=[];G=cdr(G)) L=cons([car(G)[0],K,car(G)[1]],L);
! 7660: return cons([J,I],L);
! 7661: }
! 7662:
! 7663: /*
! 7664: G=0 get trivial common spct
! 7665: P=["get"] all spct
! 7666: P=["get",L]
! 7667: L=n for variable x_n
! 7668: L=[m,n] for residue [m,n]
! 7669: L=[[m,n],[m',n']] for common spct
! 7670: P=["swap",[m,n]] for symmetry
! 7671: P=["perm",[...]] for symmetry
! 7672: P=["homog"]
! 7673: P=[[[m,n],c],...] for addition
! 7674: P=[m,c] or [[m,c],...] for middle convolution
! 7675: */
! 7676: def mc2grs(G,P)
! 7677: {
! 7678: if(G==0){
! 7679: G=[];
! 7680: for(I=4;I>=0;I--){
! 7681: V=lsort([0,1,2,3,4],[I],1);
! 7682: for(J=1;J<4;J++){
! 7683: for(T=[],K=3;K>0;K--)
! 7684: if(K!=J) T=cons(V[K],T);
! 7685: G=cons([[[V[0],V[J]],T],[1,0,0]],G);
! 7686: }
! 7687: }
! 7688: return reverse(G);
! 7689: }
! 7690: F=0;
! 7691: if(type(P)==4&&type(F=car(P))==7){
! 7692: if(F=="get"){
! 7693: if(length(P)==1){
! 7694: for(L=[],I=3;I>=0;I--){
! 7695: for(J=4;J>I;J--)
! 7696: L=cons([[I,J],mc2grs(G,["get",[I,J]])],L);
! 7697: }
! 7698: return L; /* get spct */
! 7699: }
! 7700: if(type(T=P[1])==4){
! 7701: if(type(car(T))==4){
! 7702: if(T[0][0]>T[0][1]) T=[[T[0][1],T[0][0]],T[1]];
! 7703: if(T[1][0]>T[1][1]) T=[T[0],[T[1][1],T[1][0]]];
! 7704: if(T[0][0]>T[1][0]) T=[T[1],T[0]];
! 7705: for(PG=G;PG!=[];PG=cdr(PG)){
! 7706: if(car(PG)[0]==T) return car(PG);
! 7707: }
! 7708: return []; /* get common spct */
! 7709: }
! 7710: if(T[0]>T[1]) T=[T[1],T[0]];
! 7711: for(F=0,PG=G;PG!=[];PG=cdr(PG)){
! 7712: if(car(PG)[0][0]==T){
! 7713: F=1;break;
! 7714: }
! 7715: if(car(PG)[0][1]==T){
! 7716: F=2;break;
! 7717: }
! 7718: }
! 7719: if(!F) return [];
! 7720: VT=newvect(length(PG));MT=newvect(length(PG));
! 7721: for(T=cdr(car(PG));T!=[];T=cdr(T)){
! 7722: V=car(T)[F];
! 7723: for(I=0;;I++){
! 7724: if(V==VT[I]){
! 7725: MT[I]+=car(T)[0];
! 7726: break;
! 7727: }
! 7728: if(!MT[I]){
! 7729: VT[I]==V;
! 7730: MT[I]==car(T)[0];
! 7731: break;
! 7732: }
! 7733: }
! 7734: }
! 7735: for(L=[],I=0;MT[I];I++){
! 7736: L=cons([MT[I],VT[I]],L);
! 7737: }
! 7738: return reverse(L); /* get exp */
! 7739: }
! 7740: if(type(I=P[1])<2&&I>=0&&I<=4){
! 7741: for(L=[],J=4;J>=0;J--){
! 7742: if(I==J) continue;
! 7743: T=(I<J)?[I,J]:[J,I];
! 7744: L=cons(cdr(mc2grs(G,["get",T])),L);
! 7745: }
! 7746: return L; /* get spct1 */
! 7747: }
! 7748: return [];
! 7749: }
! 7750: if(F=="swap"||F=="perm"){
! 7751: if(F=="perm") TR=P[1];
! 7752: else{
! 7753: TR=newvect(5,[0,1,2,3,4]);
! 7754: K=P[1][0];L=P[1][1];
! 7755: TR[K]=L;TR[L]=K;
! 7756: }
! 7757: V=newvect(2);
! 7758: for(L=[],T=G;T!=[];T=cdr(T)){
! 7759: TP=car(T)[0];
! 7760: for(TQ=[],I=1;I>=0;I--){
! 7761: V=[TR[TP[I][0]],TR[TP[I][1]]];
! 7762: if(V[0]>V[1]) V=[V[1],V[0]];
! 7763: TQ=cons(V,TQ);
! 7764: }
! 7765: if(TQ[0][0]<TQ[1][0]){
! 7766: L=cons(cons(TT,cdr(TP)),L);
! 7767: continue;
! 7768: }
! 7769: TQ=[TQ[1],TQ[0]];
! 7770: for(TP=cdr(TP);TP!=[];TP=cdr(TP))
! 7771: TQ=cons([car(TP)[0],car(TP)[2],car(TP)[1]],TQ);
! 7772: L=conse(reverse(TQ),L);
! 7773: }
! 7774: return qsort(L);
! 7775: }
! 7776: if(F=="homog"){
! 7777: V=mc2grs(G,"nonhomog");
! 7778: return mc2grs(G,[[2,3],V/2]|unique=1);
! 7779: }else if(F=="nonhomog"){
! 7780: R=mc2grs(G,4);
! 7781: for(V=0;R!=[];R++){
! 7782: for(TR=cdr(R);TR!=[];TR=cdr(TR))
! 7783: V+=car(TR)[0]*car(TR)[1];
! 7784: }
! 7785: return -V;
! 7786: }
! 7787: }
! 7788: if(F==4){
! 7789: if(type(P[0])!=4) P=[P];
! 7790: for(;P!=[];P=cdr(P)){
! 7791: if(type(P[0][0])==4){ /* addition */
! 7792: Un=(type(getopt(unique))==1)?1:0;
! 7793: T=P[0][0];T1=[T[0],4];T2=[T[1],4];
! 7794: for(L=[],PG=reverse(G);PG!=[];PG=cdr(PG)){
! 7795: F=0;K=P[0][1];
! 7796: if(car(PG)[0][0]==T) F=1;
! 7797: else if(car(PG)[0][1]==T) F=2;
! 7798: if(!F&&!Un){
! 7799: K=-K;
! 7800: if(car(PG)[0][0]==T1||car(PG)[0][0]==T2) F=1;
! 7801: else if(car(PG)[0][1]==T1||car(PG)[0][0]==T2) F=2;
! 7802: }
! 7803: }
! 7804: if(!F) L=cons(car(PG),L);
! 7805: else{
! 7806: TG=reverse(cdr(PG));
! 7807: for(TL=[];TG!=[];TG=cdr(TG)){
! 7808: if(F==1) TL=cons([car(TG)[0],car(TG)[1]+K,car(TG)[2]],TL);
! 7809: else TL=cons([car(TG)[0],car(TG)[1]+K,car(TG)[2]],TL);
! 7810: }
! 7811: TL=cons(car(PG)[0],TL);
! 7812: L=cons(TL,L);
! 7813: }
! 7814: G=L;
! 7815: }else{ /* mc 4:cases */
! 7816: # if 0
! 7817: K=mc2grs(G,"nonhomog");
! 7818: U=P[0][1];
! 7819: GG=[];
! 7820: /* [[0,1],[2,3]] */
! 7821: for(I=1;I<4;I++){
! 7822: J=lsort([1,2,3,4],[I],1);
! 7823: }
! 7824: I=[0,I];
! 7825: G0=mc2grs(G,["get",[I,J]]);
! 7826: G0=sub2grs(G0,I,0);
! 7827: G0=add2grs(G0,I,U);
! 7828: G1=mc2grs(G,["get",[[0,4],J]]);
! 7829: G1=sub2grs(G1,[0,4],U);
! 7830: G1=mc2grs(G1,["get",J]);
! 7831: G1=join2grs(G1,I,0);
! 7832: G3=mc2grs(G,["get",[[I[0],4],[]]
! 7833: #endif
! 7834: }
! 7835: }
! 7836: return G;
! 7837: }
! 7838: }
! 7839:
1.3 takayama 7840: def delopt(L,S)
7841: {
7842: if((Inv=getopt(inv))!=1) Inv=0;
7843: for(R=[];L!=[];L=cdr(L)){
1.4 ! takayama 7844: if(type(car(L))!=4) F=0;
! 7845: else if(type(S)==4) F=(findin(car(L)[0],S)<0)?0:1;
! 7846: else F=(car(L)[0]==S)?1:0;
1.3 takayama 7847: if(F==Inv) R=cons(car(L),R);
7848: }
7849: return reverse(R);
7850: }
7851:
1.1 takayama 7852: def str_char(S,N,L)
7853: {
7854: if(type(S)==7){
7855: if(type(L)==1) L=asciitostr([L]);
7856: return str_chr(S,N,L);
7857: }
7858: if(type(L)==7) L=strtoascii(L)[0];
7859: if(type(S)==4){
7860: M=N;
7861: while(M-->0) S=cdr(S);
7862: M=findin(L,S);
7863: return (M>=0)?findin(L,S)+N:-1;
7864: }else if(type(S)==5){
7865: K=length(S);
7866: for(I=N;I<K;I++)
7867: if(S[I]==L) return I;
7868: }
7869: return -1;
7870: }
7871:
7872: def str_pair(S,N,I,J)
7873: {
7874: if(type(I)==7) I=(II=strtoascii(I))[0];
7875: if(type(J)==7) J=(JJ=strtoascii(J))[0];
7876: if(type(S)==7) S=strtoascii(S);
1.4 ! takayama 7877: if(getopt(inv)==1){
! 7878: if(II!=0){
! 7879: I=asciitostr(reverse(II));
! 7880: IL=length(II);
! 7881: }else IL=1;
! 7882: if(JJ!=0) J=asciitostr(reverse(JJ));
! 7883: R=str_pair(reverse(S),length(S)-N-1,J,I);
! 7884: if(R>=0) R=length(S)-IL-R;
! 7885: return R;
! 7886: }
1.3 takayama 7887: if((SJIS=getopt(sjis))!=1) SJIS=0;
1.1 takayama 7888: if((II!=0&&length(II)>1)||(JJ!=0&&length(JJ)>1)){
7889: for(;;){
1.3 takayama 7890: MJ=str_str(S,N|top=JJ,sjis=SJIS);
1.1 takayama 7891: if(MJ>=0){
1.3 takayama 7892: MI=str_str(S,II|top=N,sjis=SJIS);
1.1 takayama 7893: if(MI<0 || MI>MJ){
7894: if(C==0) return MJ;
7895: C--; N=MJ+length(II);
7896: }else if(MI>=0){
7897: C++; N=MI+length(JJ);
7898: }
7899: }
7900: return -1;
7901: }
7902: }
7903: if(type(S)==4){
7904: M=N;
7905: while(M-->0) S=cdr(S);
7906: while(S!=[]){
7907: if(car(S)==I) C++;
7908: else if(car(S)==J){
7909: if(C==0) return N;
7910: C--;
7911: }
7912: S=cdr(S);N++;
7913: }
7914: }else if(type(S)==5){
7915: K=length(S);
7916: for(T=N;T<K && C>=0; T++){
7917: if(S[T]==I) C++;
7918: else if(S[T]==J){
7919: if(C==0) return T;
7920: C--;
7921: }
7922: }
7923: }
7924: return -1;
7925: }
7926:
7927:
7928: def str_cut(S,I,J)
7929: {
7930: if(type(S)==7) return sub_str(S,I,J);
7931: if((JJ=length(S))<=J) J=JJ-1;
7932: if(type(S)==5){
7933: for(L=[],K=J; K>=I; K--) L=cons(S[K],L);
7934: }else if(type(S)==4){
7935: J-=I;
7936: while(I-->0) S=cdr(S);
7937: for(L=[];J-->=0;S=cdr(S)) L=cons(car(S),L);
7938: L=reverse(L);
7939: }
7940: return asciitostr(L);
7941: }
7942:
7943: def str_str(S,T)
7944: {
7945: if(S==0) return -1;
7946: if(type(S) == 7)
7947: S = strtoascii(S);
7948: if(type(J=getopt(top))!=1 || J<0) J=0;
7949: LS=length(S);
7950: if(LS-J<1) return -1;
7951: if(type(S)==4){
7952: LS-=(J0=J);
7953: for( ; J>0 && S!=[]; S=cdr(S),J--);
7954: }
7955: if(type(JJ=getopt(end))!=1 && JJ!=0) JJ=LS;
7956: else JJ-=J0;
7957: if((SJIS=getopt(sjis))!=1) SJIS=0;
7958: if(JJ-J<0) return -1;
7959: /* search from J-th to JJ-th */
7960: if(type(T)==1) T=[T];
7961: else if(type(T)==7) T = strtoascii(T);
7962: else if(type(T)==4 && type(T[0])>3){
7963: for(K=(KF=-1)-J0; T!=[]; F++,T=cdr(T)){
7964: JK=str_str(S,car(T)|top=J,end=JJ,sjis=SJIS);
7965: if(JK>=0){
7966: JJ=(K=JK)-1; KF=F;
7967: if(J>JJ) break;
7968: }
7969: }
7970: return [KF,J0+K];
7971: }
7972: if(type(T)==4) T=ltov(T);
7973: LT = length(T);
7974: if(LT>0){
7975: LE = LS-LT;
7976: LP = T[0];
7977: if(JJ==0 ||(type(JJ)==1 && JJ<LE)) LE=JJ;
7978: if(type(S)==5){
7979: for(; J <= LE; J++){
7980: if(S[J] != LP){
7981: if(SJIS && (V=S[J])>128){
7982: if(V<160 || (V>223 && V<240)) J++;
7983: }
7984: continue;
7985: }
7986: for(I = 1; I < LT && S[I+J] == T[I]; I++);
7987: if(I >= LT) return J;
7988: }
7989: }else if(type(S)==4){
7990: for(; J<=LE; S=cdr(S),J++){
7991: if(car(S) != LP){
7992: if(SJIS && (V=S[J])>128){
7993: if(V<160 || (V>223 && V<240)) J++;
7994: }
7995: continue;
7996: }
7997: for(ST=cdr(S), I = 1; I < LT && car(ST) == T[I]; I++, ST=cdr(ST));
7998: if(I >= LT) return J0+J;
7999: }
8000: }
8001: }
8002: return -1;
8003: }
8004:
1.3 takayama 8005: def str_times(S,N)
8006: {
8007: if(!isint(N)) return "";
8008: if(type(S)==7){
8009: for(Tb=str_tb(0,0);N-->0;)
8010: str_tb(S,Tb);
8011: return str_tb(0,Tb);
8012: }
8013: if(type(S)==4){
8014: for(LT=[],I=0;I<N;I++){
8015: if(type(car(S))==7){
8016: LT=cons(car(S),LT);
8017: S=cdr(S);
8018: if(S==[]) S=[[""]];
8019: }else if(type(car(S))==4){
8020: ST=car(S);
8021: for(J=0;I<N;I++){
8022: if(J==length(ST)) J=0;
8023: LT=cons(ST[J++],LT);
8024: }
8025: }
8026: }
8027: return reverse(LT);
8028: }
8029: return S;
8030: }
8031:
1.1 takayama 8032: def ssubgrs(M,L)
8033: {
8034: if(type(L)==7) L=s2sp(L);
8035: for(S=0, L=L, M=M; L!=[]; L=cdr(L), M=cdr(M)){
8036: for(LT=car(L), MT=car(M); LT!=[]; LT=cdr(LT), MT=cdr(MT)){
8037: S += car(LT)*car(MT)[1];
8038: }
8039: }
8040: return S;
8041: }
8042:
1.3 takayama 8043: def s2os(S)
8044: {
8045: return str_subst(S,[["\\","\\\\"],["\"","\\\""]],0);
8046: }
8047:
8048: def l2os(S)
8049: {
8050: if(type(S)==6)
8051: S=m2ll(S);
8052: else if(type(S)==5)
8053: S=vtol(S);
8054: else if(type(S)==7) return "\""+s2os(S)+"\"";
8055: else if(type(S)<4) return rtostr(S);
8056: if(type(S)==4){
8057: for(F=0,Tb=str_tb("[",0);S!=[];S=cdr(S)){
8058: if(F++) str_tb(", ",Tb);
8059: str_tb(l2os(car(S)),Tb);
8060: }
8061: str_tb("]",Tb);
8062: return str_tb(0,Tb);
8063: }
8064: return 0;
8065: }
8066:
8067: def r2os(S)
8068: {
8069: if(type(S)==6){
8070: for(T="",S=m2ll(S);S!=[];S=cdr(S)){
8071: if(T!="") T=T+","+r2os(car(S));
8072: else T=r2os(car(S));
8073: }
8074: return "mat("+T+")\n";
8075: }else if(type(S)==5){
8076: for(T="",S=v2l(S);S!=[];S=cdr(S)){
8077: if(T!="") T=T+","+r2os(car(S));
8078: else T=r2os(car(S));
8079: }
8080: return "vect("+T+")\n";
8081: }else if(type(S)<4) return rtostr(S);
8082: else if(type(S)==4){
8083: for(T="";S!=[];S=cdr(S)){
8084: if(T!="") T=T+","+r2os(car(S));
8085: else T=r2os(car(S));
8086: }
8087: return "["+T+"]";
8088: }else if(type(S)==7) return "\""+s2os(S)+"\"";
8089: return "";
8090: }
8091:
8092: def s2euc(S)
8093: {
8094: for(R=[],CR=0,L=strtoascii(S);L!=[];L=cdr(L)){
8095: if((C=car(L)) == 0x1b && length(L)>1) {
8096: if((C=car(L=cdr(L)))==0x24 && length(L)>1){ /* $ */
8097: if((C = car(L=cdr(L))) == 0x40 || C == 0x42) { /* @, B */
8098: Mode = 1;
8099: } else return 0;
8100: }else if(C == 0x28 && length(L)>1) { /* ( */
8101: if((C = car(L=cdr(L)))== 0x42 || C == 0x4a) { /* B, J */
8102: Mode = 0;
8103: }else if(C == 0x49) { /* I */
8104: Mode = 2;
8105: }else{
8106: R=cons(0x1b,R);R=cons(0x28,R);R=cons(C,R);
8107: }
8108: }else if (C == 0x26 && length(L)>1 && car(cdr(L))==0x1b) { /* & ESC */
8109: L=cdr(L);
8110: }else{
8111: R=cons(0x1b,R);R=cons(C,R);
8112: }
8113: }else if(C == 0x0e) {
8114: Mode = 2;
8115: }else if(C == 0x0f) {
8116: Mode = 0;
8117: }else if(Mode == 1 && C>0x20 && C<0x7f && length(L)>1) { /* JIS KANJI */
8118: D=car(L=cdr(L));
8119: if(D>0x20 && D<0x7f) {
8120: R=cons(ior(C,0x80),R);R=cons(ior(D,0x80),R);
8121: } else return 0;
8122: }else if(Mode == 2 && C > 0x1f && C < 0x60) { /* JIS KANA */
8123: R=cons(0x8e,R); R=cons(ior(C,0x80),R);
8124: }else if(((C>0x80 && C<0xa0) || (C>0xdf && C<0xf0)) && length(L)>1) { /* ShiftJIS */
8125: D=car(L=cdr(L));
8126: if(D>0x3f && D<0xfd && D!=0x7f) {
8127: T=sjis2jis([C,D]);
8128: R=cons(ior(T[0],0x80),R); R=cons(ior(T[1],0x80),R);
8129: }else return 0;
8130: }else if(C>0x9f && C<0xe0) { /* HanKana */
8131: R=cons(0x8e,R); R=cons(C,R);
8132: }else if(C == 0x0a){
8133: CR++;
8134: }else if(C == 0x0d){
8135: R=cons(0x0d,R);
8136: CR=0;
8137: }else{
8138: while(CR-->0) R=cons(0x0d,R);
8139: R=cons(C,R);
8140: }
8141: }
8142: while(CR-->0) R=cons(0x0d,R);
8143: return asciitostr(reverse(R));
8144: }
8145:
8146: def s2sjis(S)
8147: {
8148: for(R=[],CR=0,L=strtoascii(S);L!=[];L=cdr(L)){
8149: if((C=car(L)) == 0x1b && length(L)>1) {
8150: if((C=car(L=cdr(L)))==0x24 && length(L)>1){ /* $ */
8151: if((C = car(L=cdr(L))) == 0x40 || C == 0x42) { /* @, B */
8152: Mode = 1;
8153: } else return 0;
8154: }else if(C == 0x28 && length(L)>1) { /* ( */
8155: if((C = car(L=cdr(L)))== 0x42 || C == 0x4a) { /* B, J */
8156: Mode = 0;
8157: }else if(C == 0x49) { /* I */
8158: Mode = 2;
8159: }else{
8160: R=cons(0x1b,R);R=cons(0x28,R);R=cons(C,R);
8161: }
8162: }else if (C == 0x26 && length(L)>1 && car(cdr(L))==0x1b) { /* & ESC */
8163: L=cdr(L);
8164: }else{
8165: R=cons(0x1b,R);R=cons(C,R);
8166: }
8167: }else if(C == 0x0e) {
8168: Mode = 2;
8169: }else if(C == 0x0f) {
8170: Mode = 0;
8171: }else if(Mode == 1 && C>0x20 && C<0x7f && length(L)>1) { /* JIS KANJI */
8172: D=car(L=cdr(L));
8173: if(D>0x20 && D<0x7f) {
8174: T=jis2sjis([C,D]);
8175: R=cons(T[0],R);R=cons(T[1],R);
8176: } else return 0;
8177: }else if(Mode == 2 && C > 0x1f && C < 0x60) { /* JIS KANA */
8178: R=cons(ior(C,0x80),R);
8179: }else if(C>0xa0 && C<0xff && length(L)>1) { /* EUC */
8180: D=car(L=cdr(L));
8181: if(D>0xa0 && D<0xff) {
8182: T=jis2sjis([iand(C,0x7f),iand(D,0x7f)]);
8183: R=cons(T[0],R);R=cons(T[1],R);
8184: }else return 0;
8185: }else if(C == 0x0a){
8186: CR++;
8187: }else if(C == 0x0d){
8188: R=cons(0x0a,R);R=cons(0x0d,R);
8189: CR=0;
8190: }else{
8191: while(CR-->0){
8192: R=cons(0x0a,R);R=cons(0x0d,R);
8193: }
8194: R=cons(C,R);
8195: }
8196: }
8197: while(CR-->0){
8198: R=cons(0x0a,R);R=cons(0x0d,R);
8199: }
8200: return asciitostr(reverse(R));
8201: }
8202:
8203: def r2ma(S)
8204: {
8205: return evalma(S|inv=1);
8206: }
8207:
8208: def evalma(S)
8209: {
8210: L0=["\n","\d","{","}","[","]","Log","Exp","Sinh","Cosh","Tanh","Sin","Cos","Tan",
8211: "ArcSin","ArcCos","ArcTan"];
8212: L1=["", "" ,"[","]","(",")","log","exp","sinh","cosh","tanh","sin","cos","tan",
8213: "asin", "acos", "atan"];
8214: if(getopt(inv)==1){
8215: if(type(S)==6) S=m2ll(S);
8216: else if(type(S)==5) S=vtol(S);
8217: if(type(S)==4){
8218: for(L=[];S!=[];S=cdr(S)){
8219: if(type(car(S))==6) L=cons(m2ll(car(S)),L);
8220: else if(type(car(S))==5) L=cons(vtol(car(S)),L);
8221: else L=cons(car(S),L);
8222: }
8223: S=reverse(L);
8224: }else return 0;
8225: return str_subst(rtostr(S),cdr(cdr(L1)),cdr(cdr(L0)));
8226: }
8227: if(S==0){
8228: print("Mathematica text (terminated by ;) ?");
8229: purge_stdin();
8230: Tb=str_tb(0,0);
8231: for(;;){
8232: S=get_line();
8233: str_tb(S,Tb);
8234: if(str_char(S,0,";")>=0) break;
8235: }
8236: S=str_tb(0,Tb);
8237: }
8238: /*
8239: while((P=str_chr(S,0,";"))>=0){
8240: V0=evalma(str_cut(S,0,P+1));
8241: S=str_cut(S,P+1,length(S));
8242: }
8243: if((P=str_char(S,0,"="))>=0){
8244: X=strtoascii(str_cut(S,0,P));
8245: L=length(X);
8246: for(P0=P1=-1,I=0;I<L;I++){
8247: if(L(I)<=32) continue;
8248: if(isalphanum(L[I])){
8249: if(P0<0){
8250: if(isnum(L[I])) break;
8251: P0=I;
8252: }
8253: else if(P1!=I+1) break;
8254: P1=I;
8255: }
8256: }
8257: if(I==L && P0>=0){
8258: for(I==P0;I-->0;) X=cdr(X);
8259: if((X0=car(X))>96) X0-=32;
8260: Y=[X0];X=cdr(X);
8261: for(I=P1-P0;I-->0;X=cdr(X))
8262: Y=cons(car(X),Y);
8263: Y=cons(61,Y);
8264: Var=asciitostr(reverse(Y));
8265: S=str_cut(S,P,length(S));
8266: }
8267: }
8268: */
8269: S=eval_str(str_subst(S,L0,L1));
8270: if(type(S)==4){
8271: for(L=-1,T=S;T!=[];T=cdr(T)){
8272: if(type(T0=car(T))>4) break;
8273: if(type(T0)<4){
8274: if(L>=0) break;
8275: L=-2;continue;
8276: }
8277: if(L<-2) break;
8278: if(L==-1) L=length(T0);
8279: else if(L!=length(T0)) break;
8280: }
8281: if(T==[]){
8282: if(L>0) S=s2m(S);
8283: else S=ltov(S);
8284: }
8285: }
8286: /*
8287: if(S==0 && V0!=0) return V0;
8288: if(type(Var)==7){
8289: T=rtostr(S);
8290: if(type(S)==7) T="\""+T+"\"";
8291: S=eval_str(Var+T);
8292: mycat(["Define",Var]);
8293: }
8294: */
8295: return S;
8296: }
8297:
8298: def i2hex(N)
8299: {
8300: Opt=getopt();
8301: if(type(N)==4 && isint(car(N))){
8302: #ifdef USEMODULE
8303: L=mtransbys(os_md.i2hex,N,[]|option_list=Opt);
8304: #else
8305: L=mtransbys(i2hex,N,[]|option_list=Opt);
8306: #endif
8307: return rtostr(L);
8308: }
8309: if(!isint(N) || N<0) return 0;
8310: if(!N) L=[];
8311: else{
8312: Cap=(getopt(cap)==1)?32:0;
8313: for(L=[];N!=0;N=ishift(N,4)){
8314: J=iand(N,15);
8315: L=cons(((J>9)?(87-Cap):48)+J,L);
8316: }
8317: }
8318: if(!isint(Min=getopt(min))) Min=2;
8319: for(Min-=length(L);Min-->0;)
8320: L=cons(48,L);
8321: if(getopt(num)==1){
8322: L=cons(120,L);L=cons(48,L);
8323: }
8324: return asciitostr(L);
8325: }
8326:
8327: def sjis2jis(L)
8328: {
8329: L1=L[1];
8330: if((L0=L[0])<=0x9f){
8331: if(L1<0x9f) L0=L0*2-0xe1;
8332: else L0=(L0*2)-0xe0;
8333: }else{
8334: if(L1<0x9f) L0=L0*2-0x161;
8335: else L0=L0*2-0x160;
8336: }
8337: if(L1<0x7f) return [L0,L1-0x1f];
8338: else if(L1<0x9f) return [L0,L1-0x20];
8339: return [L0,L1-0x7e];
8340: }
8341:
8342: def jis2sjis(L)
8343: {
8344: L1=L[1];
8345: if(iand(L0=L[0],1)){
8346: if(L1<0x60) L=[L1+0x1f];
8347: else L=[L1+0x20];
8348: }else L=[L1+0x7e];
8349: if(L0<0x5f) return cons(ishift(L0+0xe1,1),L);
8350: return cons(ishift(L0+0x161,1),L);
8351: }
8352:
1.1 takayama 8353: def verb_tex_form(P)
8354: {
8355: L = reverse(strtoascii(rtostr(P)));
8356: for(SS = []; L != []; L = cdr(L)){
8357: Ch = car(L); /* ^~\{} */
8358: if(Ch == 92 || Ch == 94 || Ch == 123 || Ch == 125 || Ch == 126){
8359: SS = append([92,Ch,123,125],SS); /* \Ch{} */
8360: if(Ch != 94 && Ch != 126) /* \char` */
8361: SS = append([92,99,104,97,114,96],SS);
8362: continue;
8363: }
8364: SS = cons(Ch, SS);
8365: if((Ch >= 35 && Ch <= 38) || Ch == 95) /* #$%&_ */
8366: SS = cons(92, SS); /* \Ch */
8367: }
8368: return asciitostr(SS);
8369: }
8370:
1.4 ! takayama 8371: def tex_cuteq(S,P)
! 8372: {
! 8373: if(P==0) return 0;
! 8374: if(S[P]==125){ /* } */
! 8375: if((Q=str_pair(S,P-1,"{","}"|inv=1))<0) return -1;
! 8376: if(Q<2||S[Q-1]!=95) return Q;
! 8377: return tex_cuteq(S,Q-2);
! 8378: }
! 8379: if(!isalphanum(S[Q=P--])) return -1;
! 8380: while(P>0&&isalphanum(S[P])) P--;
! 8381: if(S[P]==92){ /* \ */
! 8382: if(P==0) return P;
! 8383: else P--;
! 8384: }
! 8385: if(S[P]!=95||P==0) return Q; /* _ */
! 8386: return tex_cuteq(S,P-1);
! 8387: }
! 8388:
! 8389:
! 8390: def texket(S)
! 8391: {
! 8392: if(!isint(F=getopt(all))) F=0;
! 8393: if(type(S)==7){
! 8394: L=str_len(S);
! 8395: SS=strtoascii(S);
! 8396: }else{
! 8397: L=length(S);
! 8398: SS=S;
! 8399: }
! 8400: for(T="",I=I0=0;I<L-1;){
! 8401: J=str_char(SS,I,"(");
! 8402: if(J<0) break;
! 8403: if(J<L-1 && J>4 && str_str(SS,"\\left"|top=J-5,end=J-1)>=0){
! 8404: I=J+1;continue;
! 8405: }
! 8406: if((K=str_pair(SS,J+1,"(",")"))>=0){
! 8407: KK=str_char(SS,J+2,"(");
! 8408: if(KK>K||KK<0){
! 8409: if(F!=1){
! 8410: if(!F){
! 8411: for(N=J+1;N<K;N++) /* + - _ { } */
! 8412: if(!isalphanum(P=SS[N])&&findin(P,[32,43,45,95,123,125])<0) break;
! 8413: }else N=K;
! 8414: if(N==K){
! 8415: I=K+1;continue;
! 8416: }
! 8417: }
! 8418: T=T+str_cut(SS,I0,J-1)+"\\left"+str_cut(SS,J,K-1)+"\\right)";
! 8419: I0=I=K+1;
! 8420: }else{
! 8421: T=T+str_cut(SS,I0,J-1)+"\\left("+texket(str_cut(SS,J+1,K-1)|all=F) +"\\right)";
! 8422: I0=I=K+1;
! 8423: }
! 8424: }else break;
! 8425: }
! 8426: return T+str_cut(SS,I0,L);
! 8427: }
! 8428:
! 8429:
1.1 takayama 8430: def my_tex_form(S)
8431: {
8432: if(getopt(skip) != 1){
1.3 takayama 8433: if(type(S)==1 && S<0) return "-"+print_tex_form(-S);
1.4 ! takayama 8434: if(type(S)==6) return mtotex(S);
1.1 takayama 8435: S = print_tex_form(S);
8436: for(F=Top=0;(L=str_str(S,"\\verb`"|top=Top))>=0;Top=LV+1){
8437: F++;
8438: if(Top==0) Tb = string_to_tb("");
8439: LV = str_chr(S, L+6, "`");
8440: if(LV<0) LV=str_len(S);
8441: str_tb([my_tex_form(sub_str(S, Top, L-1)|skip=1), "\\texttt{"], Tb);
8442: str_tb([verb_tex_form(sub_str(S,L+6, LV-1)),"}"], Tb);
8443: Top=LV+1;
8444: }
1.3 takayama 8445: if(F>0){
8446: str_tb(my_tex_form(sub_str(S, Top,str_len(S)-1)|skip=1), Tb);
8447: return tb_to_string(Tb);
8448: }
1.1 takayama 8449: }
8450: if(S==0) return "";
8451: S = ltov(strtoascii(S));
8452: L = length(S)-1;
8453: while(L >= 1 && S[L] == 10)
8454: L--;
1.3 takayama 8455: if((Fr=getopt(frac))!=0 && Fr!=1) Fr=2;
8456: for(I = L+1, T = K = 0, SS = []; --I >= 0; ){
8457: if(S[I] == 32 && I!=L){
8458: if(I==L) continue;
1.1 takayama 8459: if(findin(S[I+1], [32,40,41,43,45,123,125]) >= 0 /* " ()+-{}" */
8460: || (S[I+1] >= 49 && S[I+1] <= 57)) /* 1 - 9 */
1.3 takayama 8461: if(I == 0 || S[I-1] >= 32) continue;
8462: }
8463: if(Fr && S[I]>=48 && S[I]<=57){ /* 2/3 -> \tfrac{2}{3} */
8464: for(K=0,II=I; II>=0; II--){
8465: if(S[II]>=48 && S[II]<=57) continue;
8466: if(S[II]==47){ /* / */
8467: if(K>0) break;
8468: K=II;
8469: }else break;
8470: }
8471: if(K>II+1){
8472: SS=cons(125,SS);
8473: for(J=I; J>K; J--) SS=cons(S[J],SS);
8474: if(AMSTeX){
8475: SS=cons(123,SS);SS=cons(125,SS);
8476: }else{
8477: for(J=[114,101,118,111,92];J!=[];J=cdr(J)) /* \over */
8478: SS=cons(car(J),SS);
8479: }
8480: for(J=K-1;J>II;J--) SS=cons(S[J],SS);
8481: SS=cons(123,SS);
8482: if(AMSTeX){
8483: J=(Fr==2)?[99,97,114,102,116,92]:[99,97,114,102,92];
8484: for(;J!=[];J=cdr(J)) /* \tfrac */
8485: SS=cons(car(J),SS);
8486: }
8487: I=II+1;
8488: }else{
8489: for(;I>II;I--) SS = cons(S[I], SS);
8490: I++;
8491: }
8492: continue;
1.1 takayama 8493: }
8494: SS = cons(S[I], SS);
8495: }
1.4 ! takayama 8496: SS=str_subst(SS,"\\\\\n\\end{pmatrix}","\n\\end{pmatrix}"|raw=1);
1.1 takayama 8497: Subst=getopt(subst);
1.4 ! takayama 8498: Sub0=["{asin}","{acos}","{atan}"];
! 8499: Sub1=["\\arcsin ","\\arccos","\\arctan "];
! 8500: if(type(Subst) == 4){
! 8501: Sub0=append(Sub0,Subst[0]);Sub1=append(Sub1,Subst[1]);
! 8502: }
! 8503: SS = str_subst(SS,Sub0,Sub1|raw=1);
1.1 takayama 8504: S = ltov(SS);
8505: L = length(S);
8506: SS = [];
8507: while(--L >= 0){
8508: if(S[I=L] == 125){
8509: while(--I >= 0 && S[I] == 125);
8510: J = 2*I - L;
8511: if(J >= 0 && S[I] != 123){
8512: for(K = J; K < I && S[K] == 123; K++);
8513: if(K == I){
8514: if(J-- <= 0 || S[J] < 65 || S[J] > 122 || (S[J] > 90 && S[J] < 97)){
1.3 takayama 8515: SS = cons(S[I],SS);
1.1 takayama 8516: L = J+1;
8517: continue;
8518: }
8519: }
8520: }
8521: }
1.3 takayama 8522: SS = cons(S[L],SS);
8523: }
1.4 ! takayama 8524: RT=getopt(root);
! 8525: for(Top=0;;Top++){ /* ((x+1))^{y} , 1/y=2,3,...,9 */
! 8526: #if 1
! 8527: P=str_str(SS,["))^","^{\\tfrac{1}"]|top=Top);
! 8528: if(P[0]<0) break;
! 8529: Sq=0;
! 8530: if(P[0]==0){
! 8531: P=P[1];
! 8532: if((Q=str_pair(SS,P,"(",")"|inv=1))<0||SS[Q+1]!=40) continue;
! 8533: if((RT==2||(RT!=0 && P-Q<33)) && str_str(SS,"{\\tfrac{1}"|top=P+3,end=P+3)==P+3
! 8534: && SS[P+14]==125){
! 8535: if((Sq=SS[P+13]-48)<2||Sq>9) Sq=0;
! 8536: }
! 8537: F=2;
! 8538: }else{
! 8539: P=P[1];
! 8540: if(SS[P+12]!=125||(Sq=(SS[P+11]-48))<2||Sq>9) break;
! 8541: if(SS[P-1]==125){
! 8542: if((Q=str_pair(SS,P-2,"{","}"|inv=1))<0) break;
! 8543: if(Q>1&&SS[Q-1]==95){
! 8544: if((Q=tex_cuteq(SS,Q-2))<0) break;
! 8545: F=0;
! 8546: }else F=1;
! 8547: }else{
! 8548: if(!isalphanum(SS[Q=P-1]) || (Q=tex_cuteq(SS,Q))<0) break;
! 8549: F=0;
! 8550: }
! 8551: if(RT!=2&&P-Q>32) break;
! 8552: }
! 8553: #else
! 8554: if((P=str_str(SS,"))^"|top=Top))<0 || (Q=str_pair(SS,P,"(",")"|inv=1))<0) break;
! 8555: else F=2;
! 8556: Sq=0;
! 8557: if((RT==2||(RT!=0 && P-Q<33)) && str_str(SS,"{\\tfrac{1}"|top=P+3,end=P+3)==P+3
! 8558: && SS[P+14]==125){
! 8559: if((Sq=SS[P+13]-48)<2||Sq>9) Sq=0;
! 8560: }
! 8561: #endif
1.3 takayama 8562: for(I=0,S=[];SS!=[];SS=cdr(SS),I++){
1.4 ! takayama 8563: if(I==Q){
! 8564: if(Sq){
! 8565: S=append([116,114,113,115,92],S);
! 8566: if(Sq>2) S=append([93,Sq+48,91],S);
! 8567: S=cons(123,S);
! 8568: if(F==2) SS=cdr(SS);
! 8569: else if(F==0) S=cons(car(SS),S);
! 8570: }else if(F==2&&P-Q==3){ /* (2)^x -> 2^x*/
! 8571: SS=cdr(SS);SS=cdr(SS);
! 8572: S=cons(123,S);S=cons(car(SS),S);S=cons(125,S);
! 8573: SS=cdr(SS);SS=cdr(SS);
! 8574: I+=3;
! 8575: }
! 8576: continue;
! 8577: }else if(I==P){
! 8578: if(Sq){
! 8579: if(F>0) S=cdr(S);
! 8580: S=cons(125,S);
! 8581: if(F==2) SS=cdr(SS);
! 8582: for(J=0;J<12;J++) SS=cdr(SS);
! 8583: }
! 8584: continue;
! 8585: }
1.3 takayama 8586: S=cons(car(SS),S);
8587: }
8588: SS=reverse(S);
8589: Top=P;
1.1 takayama 8590: }
1.4 ! takayama 8591: S=asciitostr(SS);
! 8592: if((K=getopt(ket))==1) S=texket(S);
! 8593: else if(K==2) S=texket(S|all=1);
! 8594: return S;
1.1 takayama 8595: }
8596:
8597: def smallmattex(S)
8598: {
8599: return str_subst(S,[["\\begin{pmatrix}","\\left(\\begin{smallmatrix}"],
8600: ["\\end{pmatrix}","\\end{smallmatrix}\\right)"],
8601: ["\\begin{Bmatrix}","\\left\\{\\begin{smallmatrix}"],
8602: ["\\end{Bmatrix}","\\end{smallmatrix}\\right\\}"],
8603: ["\\begin{bmatrix}","\\left[{\\begin{smallmatrix}"],
8604: ["\\end{bmatrix}","\\end{smallmatrix}\\right]"],
8605: ["\\begin{vmatrix}","\\left|\\begin{smallmatrix}"],
8606: ["\\end{vmatrix}","\\end{smallmatrix}\\right|"],
8607: ["\\begin{Vmatrix}","\\left\\|\\begin{smallmatrix}"],
8608: ["\\end{Vmatrix}","\\end{smallmatrix}\\right\\|"],
8609: ["\\begin{matrix}","\\begin{smallmatrix}"],
8610: ["\\end{matrix}","\\end{smallmatrix}"]],0);
8611: }
8612:
8613: def str_subst(S, L0, L1)
8614: {
8615: if(type(S) == 7)
8616: S = strtoascii(S);
8617: if(type(S) == 4)
8618: S = ltov(S);
8619: SE = length(S);
8620: if(L1 == 0){
8621: for(L1 = L = [], L0 = reverse(L0); L0 != []; L0 = cdr(L0)){
8622: L = cons(car(L0)[0], L);
8623: L1 = cons(car(L0)[1], L1);
8624: }
8625: L0 = L;
8626: }
8627: if(type(L0)==7) L0 = [strtoascii(L0)];
8628: else{
8629: for(LT = []; L0 != []; L0 = cdr(L0))
8630: LT = cons(strtoascii(car(L0)), LT);
8631: L0 = ltov(LT);
8632: }
8633: E0 = length(L0);
8634: if(type(L1)==7) L1 = [strtoascii(L1)];
8635: else{
8636: for(LT = []; L1 != []; L1 = cdr(L1))
8637: LT = cons(strtoascii(car(L1)), LT);
8638: L1 = ltov(LT);
8639: }
1.3 takayama 8640: if(getopt(inv)==1){
8641: L2=L0;L0=L1;L0=L2;
8642: }
1.1 takayama 8643: if((SJIS=getopt(sjis))!=1) SJIS=0;
8644: for(J = JJ = 0, ST = []; J < SE; J++){
8645: SP = S[J];
8646: for(I = E0-1; I >= 0; I--){
8647: if(SP != L0[I][0] || J + (K = length(L0[I])) > SE)
8648: continue;
8649: while(--K >= 1)
8650: if(L0[I][K] != S[J+K]) break;
8651: if(K > 0) continue;
8652: for(KE = length(L1[I]), K = 0 ;K < KE; K++)
8653: ST = cons(L1[I][K],ST);
8654: J += length(L0[I])-1;
8655: break;
8656: }
8657: if(I < 0){
8658: ST = cons(S[J],ST);
8659: if(SJIS && (V=S[J])>128){
8660: if(V<160 || (V>223 && V<240)) ST = cons(S[J++],ST);
8661: }
8662: }
8663: }
1.4 ! takayama 8664: if(getopt(raw)==1) return reverse(ST);
1.1 takayama 8665: return asciitostr(reverse(ST));
8666: }
8667:
8668: def dviout0(L)
8669: {
1.4 ! takayama 8670: Cmd=["TikZ","TeXLim","TeXEq","DVIOUT","XYPrec","XYcm","XYLim","Canvas"];
1.3 takayama 8671: if(type(Opt=getopt(opt))==7){
8672: if((F=findin(Opt,Cmd)) < 0) return -1;
8673: if(L==-1){
8674: if(F<=3){
8675: if(F==0) V=TikZ;
8676: else if(F==1) V=TeXLim;
8677: else if(F==2) V=TeXEq;
8678: else V=iand(DVIOUTF,1);
8679: }else{
8680: if(F==4) V=XYPrec;
8681: else if(F==5) V=XYcm;
1.4 ! takayama 8682: else if(F==6) V=XYLim;
! 8683: else V=Canvas;
1.3 takayama 8684: }
8685: return V;
8686: }
8687: if(F==0) TikZ=L;
8688: else if(F==2) TeXEq=L;
8689: else if(F==3){
8690: if(iand(DVIOUTF,1)==L)
8691: mycat0(["DVIOUTA=\"", DVIOUTA,"\""],1);
8692: else dviout0(4);
8693: return 1;
1.4 ! takayama 8694: }else if(F==7&&type(L)==4)
! 8695: Canvas=L;
! 8696: else if(L>0){
1.3 takayama 8697: if(F==1) TeXLim=L;
8698: else if(F==4) XYPrec=L;
8699: else if(F==5) XYcm=L;
8700: else if(F==6) XYLim=L;
8701: }
8702: mycat0([Cmd[F],"=",L],1);
8703: return 1;
8704: }
1.1 takayama 8705: if(type(L) == 4){
1.3 takayama 8706: for( ; L != []; L = cdr(L)) dviout0(car(L));
1.1 takayama 8707: return 1;
8708: }
8709: if(type(L) == 7){
1.3 takayama 8710: if(L=="") dviout(" \n"|keep=1);
8711: else if(L=="cls") dviout0(0);
8712: else if(L=="show") dviout(" ");
1.4 ! takayama 8713: else if(L=="?") dviout0(3);
1.3 takayama 8714: else dviout("\\"+L+"\n"|keep=1);
1.1 takayama 8715: return 1;
8716: }
8717: if(L == 0)
8718: dviout(" "|keep=1,clear=1);
8719: else if(L == 1)
8720: dviout(" ");
8721: else if(L == 2)
8722: dviout(" "|clear=1);
8723: else if(L>10)
8724: dviout("\\setcounter{MaxMatrixCols}{"+rtostr(L)+"}%"|keep=1);
8725: else if(L < 0)
8726: dviout(" "|delete=-L,keep=1);
8727: else if(L == 3){
1.3 takayama 8728: mycat0(["DIROUT =\"", DIROUT,"\""],1);
8729: mycat0(["DVIOUTH=\"", DVIOUTH,"\""],1);
8730: mycat0(["DVIOUTA=\"", DVIOUTA,"\""],1);
8731: mycat0(["DVIOUTB=\"", DVIOUTB,"\""],1);
8732: mycat0(["DVIOUTL=\"", DVIOUTL,"\""],1);
1.4 ! takayama 8733: mycat(["Canvas =", Canvas]);
1.1 takayama 8734: mycat(["TeXLim =", TeXLim]);
8735: mycat(["TeXEq =", TeXEq]);
8736: mycat(["AMSTeX =", AMSTeX]);
1.3 takayama 8737: mycat(["TikZ =", TikZ]);
8738: mycat(["XYPrec =", XYPrec]);
8739: mycat(["XYcm =", XYcm]);
8740: mycat(["XYLim =", XYLim]);
8741: }else if(L==4){
8742: Tmp=DVIOUTA; DVIOUTA=DVIOUTB; DVIOUTB=Tmp;
8743: mycat0(["DVIOUTA=\"", DVIOUTA,"\""],1);
8744: DVIOUTF++;
8745: }else if(L==5){
8746: if(!iand(DVIOUTF,1)) dviout0(4);
8747: }else if(L==6){
8748: TikZ=1;mycat("TikZ=1");
8749: }else if(L==7){
8750: TikZ=0;mycat("TikZ=0");
1.1 takayama 8751: }
8752: return 1;
8753: }
8754:
8755: def myhelp(T)
8756: {
8757: /* extern DVIOUT; */
8758: /* extern HDVI; */
8759: /* extern DVIOUTH; */
8760:
8761: if(type(T)==2){
8762: if(T==getbygrs){
8763: getbygrs(0,0);
8764: return 0;
8765: }
8766: else if(T==m2mc){
8767: m2mc(0,0);
8768: return 0;
8769: }
8770: else if(T==mgen){
8771: mgen(0,0,0,0);
8772: return 0;
8773: }
8774: else T=rtostr(T);
8775: }
8776: if(type(T)==4 && typeT[0]==7){
8777: if(length(T)==2 && type(T[1])==1){
8778: DVIOUTH="start "+T[0]+" -"+rtostr(T[1])+"-hyper:0x90 \"%ASIRROOT%\\help\\os_muldif.dvi\" #r:%LABEL%";
8779: }else if(str_len(T[0])>2) DVIOUTH=T[0];
8780: mycat(["DVIOUTH="+DVIOUTH,"\nmyhelp(fn) is set!"]);
8781: return 0;
8782: }
8783: if(T==0){
8784: mycat([
8785: "myhelp(t) : show help\n",
8786: #ifdef USEMODULE
8787: " t : -1 (dvi), 1 (pdf) or os_md.getbygrs, os_md.m2mc, os_md.mgen\n",
8788: #else
8789: " t : -1 (dvi), 1 (pdf) or getbygrs, m2mc, mgen\n",
8790: #endif
8791: " \"fn\" : Help of the function fn\n",
8792: " [path,n] : path of dviout, n = # dviout\n",
8793: " [DVIOUTH] : Way to jump to the help of a function\n",
8794: " default: start dviout -2 \"%ASIRTOOT%\\help\\os_muldif.dvi\" #r:%LABEL%"
8795: ]);
8796: return 0;
8797: }
8798: if(type(T)==7){
8799: if(str_str(T,"os_md.")==0) T=str_cut(T,6,str_len(T)-1);
8800: Dr=str_subst(DVIOUTH,["%ASIRROOT%","%LABEL%"],[get_rootdir(),"r:"+str_subst(T,"_","")]);
8801: shell(Dr);
8802: return 0;
8803: }
8804: Dr=get_rootdir();
8805: if(T==-1) Dr+="\\help\\os_muldif.dvi";
8806: else Dr+="\\help\\os_muldif.pdf";
8807: if(!isMs()) Dr=str_subst(Dr,"\\","/");
8808: shell(Dr);
8809: return 0;
8810: }
8811:
8812: def isMs()
8813: {
8814: if(type(Tmp=getenv("TEMP"))!=7) {
8815: if (type(Tmp=getenv("TMP")) != 7) Tmp=getenv("HOME");
8816: }
8817: if(type(Tmp)==7 && str_chr(Tmp,0,"\\")==2) return 1;
8818: else return 0;
8819: }
8820:
1.3 takayama 8821: def tocsv(L)
8822: {
8823: if(type(L)==6) L=m2ll(L);
8824: else if(type(L)==5) L=vtol(L);
8825: Null=getopt(null);
8826: Tb=str_tb(0,0);
8827: for(LL=L; LL!=[]; LL=cdr(LL)){
8828: LT=car(LL);
8829: if(type(LT)==5) LT=vtol(LT);
8830: if(type(LT)<4) LT=[LT];
8831: for(N=0; LT!=[]; LT=cdr(LT),N++){
8832: if(N) str_tb(", ",Tb);
8833: if((T=car(LT))==Null) continue;
8834: if(type(T)==7){
8835: K=str_len(T);
8836: T=str_subst(T,["\""],["\"\""]);
8837: if(str_len(T)>K||str_char(T,0,",")>=0) T="\""+T+"\"";
8838: str_tb(T,Tb);
8839: }else str_tb(rtostr(T),Tb);
8840: }
8841: str_tb("\n",Tb);
8842: }
8843: return str_tb(0,Tb);
8844: }
8845:
8846: def readcsv(F)
8847: {
8848: if((ID=open_file(F))<0) return -1;
8849: SJIS=isMs();
8850: L=[];
8851: if(type(V=getopt(eval))!=4){
8852: if(V=="all") V=1;
8853: else if(type(V)==1) V=[V];
8854: else V=[];
8855: }
8856: Sp=getopt(sp);
8857: if(type(T=getopt(col))!=1) T=0;
8858: Null=getopt(null);
8859: while((S=get_line(ID))!=0){
8860: S=strtoascii(S);
8861: N=length(S);
8862: for(I=J=F=0,LL=LT=[];I<N;I++){
8863: C=S[I];
8864: if(F==0){
8865: if(C<=32) continue;
8866: if(C==34){F=2;continue;}
8867: F=1;
8868: }
8869: if(F==2 && C==34){
8870: if(I<N-1&& S[I+1]==34){
8871: LT=cons(34,LT);I++;continue;
8872: }
8873: F=-2;
8874: }
8875: if(F==1){
8876: if((C==44&&Sp!=1)||(C<=32&&Sp==1)) F=-1;
8877: else if(C<32 && C!=9) continue;
8878: }
8879: if(SJIS && I<N-1 && ((C>128 && C<160)||(C>223 && C<240))){
8880: LT=cons(C,LT);LT=cons(S[++I],LT);continue;
8881: }
8882: if(F>0){
8883: LT=cons(C,LT);continue;
8884: }
8885: LS=asciitostr(reverse(LT));
8886: if(V==1||findin(++J,V)>=0) LS=(type(Null)>=0 && LS=="")?Null:eval_str(LS);
8887: if(!T || T==J) LL=cons(LS,LL);
8888: if(F==-2) while(++I<N && Sp!=1 && S[I]!=44);
8889: F=0;LT=[];
8890: }
8891: if(I<=N && (Sp!=1 || length(LT)>0)){ /* lastline */
8892: LS=asciitostr(reverse(LT));
8893: if(findin(++J,V)>=0) LS=(type(Null)>=0 && LS=="")?Null:eval_str(LS);
8894: if(!T || T==J) LL=cons(LS,LL);
8895: }
8896: L=cons(reverse(LL),L);
8897: }
8898: close_file(ID);
8899: if(T) L=m2l(L|flat=1);
8900: return reverse(L);
8901: }
1.1 takayama 8902:
8903: def showbyshell(S)
8904: {
8905: Id = getbyshell(S);
8906: if(Id<0) return Id;
8907: while((S=get_line(Id))!=0) print(S,2);
8908: return close_file(Id);
8909: }
8910:
1.3 takayama 8911:
1.1 takayama 8912: def getbyshell(S)
8913: {
8914: /* extern DIROUT; */
8915:
8916: Home=getenv("HOME");
8917: if(type(Home)!=7) Home="";
8918: if(type(Tmp=getenv("TEMP"))!=7 && type(Tmp=getenv("TMP")) != 7)
8919: Tmp=str_subst(DIROUT,["%HOME%","%ASIRROOT%"],[Home,get_rootdir()]);
8920: Sep=isMs()?"\\":"/";
8921: F=Tmp+Sep+"muldif.tmp";
8922: if(type(S)<=1 && S>=0) close_file(Id);
8923: remove_file(F);
8924: if(type(S)<=1) return -1;
8925: shell(S+" > \""+F+"\"");
8926: return open_file(F);
8927: }
8928:
8929: def show(P)
8930: {
8931: T=type(P);
8932: S=P;
8933: Var=getopt(opt);
8934: if(Var=="verb"){
8935: dviout("{\\tt"+verb_tex_form(T)+"}\n\n");
8936: return;
8937: }
1.3 takayama 8938: if(type(Var)<0) Var=getopt(var);
1.1 takayama 8939: if(T==6){
8940: if((Sp=getopt(sp))==1 || Sp==2)
8941: S=mtotex(P|lim=1,small=2,sp=Sp,null=1,mat="B");
1.3 takayama 8942: else if(type(Var)==4 || type(Var)==7)
1.1 takayama 8943: S=mtotex(P|lim=1,small=2,var=Var);
8944: else
8945: S=mtotex(P|lim=1,small=2);
8946: Size=size(P);
8947: Size=(Size[0]>Size[1])?Size[0]:Size[1];
8948: if(Size>10) dviout0(Size);
8949: }else if(T<=3){
1.4 ! takayama 8950: X=0;
! 8951: if(Var=="pfrac") X=var(P);
! 8952: else X=getopt(pfrac);
! 8953: if(isvar(X)){
! 8954: pfrac(P,X|dviout=1);
! 8955: return;
! 8956: }
! 8957: Opt=cons(["dviout",1],getopt());
! 8958: if(type(Var)==2||type(Var)==4||type(Var)==7) fctrtos(P|option_list=Opt);
! 8959: else{
! 8960: if(isdif(P)!=0) Opt=cons(["var","dif"],Opt);
! 8961: else Opt=cons(["br",1],Opt);
! 8962: fctrtos(P|option_list=Opt);
! 8963: }
1.1 takayama 8964: return;
8965: }else if(T==4){
8966: if(type(Var)==4 || type(Var)==7){
1.4 ! takayama 8967: S=ltotex(P|option_list=getopt());
1.1 takayama 8968: if(Var=="text"){
8969: dviout(S);
8970: return;
8971: }
8972: }else{
8973: for(F=0,L=P;L!=[] && F!=-1;L=cdr(L)){
8974: LL=car(L);
8975: if(type(LL)==4){
8976: if(F==0){
8977: T=type(LL[0]);
8978: if(T==4) F=2; /* [[[? */
8979: else if(T==1 || T==0) F=1; /* [[num,.. */
8980: }
8981: if(F==1){
8982: if(length(LL)!=2 || !isint(LL[0]) || LL[0]<0 || type(LL[1])>3)
8983: F=-1; /* [[num,rat],[num,rat],...] */
8984: }else if(F==2){
8985: for(LLT=LL; LLT!=[] && F!=-1; LLT=cdr(LLT)){
8986: LLL=car(LLT); /* [[[num,rat],[num,rat],...],[[..],..]],....] */
8987: if(length(LLL)!=2 || !isint(LLL[0]) || LLL[0]<0 || type(LLL[1])>3)
8988: F=-1;
8989: }
8990: }
8991: }else if((F==0 || F==7) && type(LL)==7){
8992: F=7;
8993: }else F=-1;
8994: }
8995: if(F==1) S=ltotex(P|opt="spt");
8996: else if(F==2){
8997: M=mtranspose(lv2m(S));
8998: show(M|sp=1); /* GRS */
8999: return;
9000: }else if(F==7) S=ltotex(P|opt="spts");
9001: else{
9002: for(F=0,L=P;L!=[] && F!=-1;L=cdr(L)){
9003: LL=car(L);
9004: if(type(LL)!=4){
9005: F=-1; break;
9006: }
9007: for(LLT=LL; LLT!=[] && F!=-1; LLT=cdr(LLT)){
9008: T=type(LLL=car(LLT));
9009: if(T<7 && T!=4) F0++;
9010: else if(T==7){
9011: if(str_char(LLL,0,"\\")<0) F1++;
9012: else F2++;
9013: }else F=-1;
9014: }
9015: }
9016: }
9017: if(F==0 && F0>0 && (F1+F2)>0){ /* list of list of eq and str */
9018: if(F2>0) S=ltotex(P|opt=["cr","spts0"],str=1);
9019: else S=ltotex(P|opt=["cr","spts"]);
1.4 ! takayama 9020: }else{
! 9021: for(S="[";;){
! 9022: S+=my_tex_form(car(P));
! 9023: if((P=cdr(P))==[]){
! 9024: S+="]";break;
! 9025: }
! 9026: S+=",";
! 9027: }
1.1 takayama 9028: }
9029: }
9030: }else if(T==7){
9031: if(Var=="raw" ||
9032: (Var !="eq" && str_chr(P,0,"\\")<0 && str_char(P,0,"^")<0 && str_char(P,0,"_")<0
9033: && str_char(P,0,"&")<0)){
9034: dviout(P+"\n\n");
9035: return;
9036: }
9037: }
9038: dviout(S|eq=5);
9039: }
9040:
9041:
9042: /* options : eq = 1 - 8, clear=1, keep=1, delete=1, title=s,
1.3 takayama 9043: fctr=1, begin=s */
1.1 takayama 9044: def dviout(L)
9045: {
1.3 takayama 9046: /* extern AMSTeX, TeXEq, DIROUT, DVIOUTA, DVIOUTB, DVIOUTL; */
1.1 takayama 9047:
9048: MyEq = [
9049: ["\\[\n ","\\]"],
9050: ["\\begin{align}\n","\\end{align}"],
9051: ["\\begin{gather}\n ","\\end{gather}"],
9052: ["\\begin{multline}\n ","\\\\[-15pt]\\end{multline}"],
9053: ["\\begin{align}\\begin{split}\n &","\\end{split}\\end{align}"],
9054: ["\\begin{align*}\n &","\\end{align*}"],
9055: ["\\begin{gather*}\n ","\\end{gather*}"],
9056: ["\\begin{equation}\n ","\\end{equation}"]
9057: ];
9058: if(!chkfun("print_tex_form", "names.rr"))
9059: return 0;
9060: Home=getenv("HOME");
9061: if(type(Home)!=7) Home="";
1.4 ! takayama 9062: Dir=str_subst(DIROUT,["%HOME%","%ASIRROOT%","\\"],[Home,get_rootdir(),"/"]);
1.1 takayama 9063: Dirout=Dir+(AMSTeX?"/out.tex":"/out0.tex");
9064: Risaout=(AMSTeX)?"risaout":"risaout0";
9065: Dirisa=Dir+"/"+Risaout+".tex";
9066: Viewer="dviout";
9067: SV=["c:/w32tex/dviout","c:/dviout"];
9068: Risatex=str_subst(AMSTeX?DVIOUTA:DVIOUTL,
1.3 takayama 9069: ["%HOME%","%ASIRROOT%","%TikZ%"],[Home,get_rootdir(),rtostr(TikZ)]);
1.1 takayama 9070: if(isMs() && !access(Risatex)){
9071: for(TV=SV; TV!=[]; TV=cdr(TV)){
9072: VV=car(TV)+"/dviout.exe";
9073: if(access(VV)){
9074: Viewer=str_subst(VV,"/","\\");
9075: break;
9076: }
9077: }
9078: output(Risatex);
9079: print("cd \""+str_subst(Dir,"/","\\")+"\"");
9080: print("latex -src=cr,display,hbox,math,par "+Risaout);
9081: print("start "+Viewer+" -1 \""+Dr+"\\tex\\"+Risaout+"\" 1000");
9082: output();
9083: }
9084: if(access(Dirisa) == 0){
9085: D0="\""+(isMs()?str_subst(Dir,"/","\\")+"\"":Dir);
9086: shell("mkdir "+D0);
9087: output(Dirisa);
9088: if(AMSTeX){
9089: print("\\documentclass[a4paper]{amsart}");
9090: print("\\usepackage{amsmath,amssymb,amsfonts}");
9091: }else
9092: print("\\documentclass[a4paper]{article}");
9093: print("\\pagestyle{empty}\n\\begin{document}\n\\thispagestyle{empty}");
9094: print(AMSTeX?"\\input{out}\n\\end{document}":"\\input{out0}\n\\end{document}");
9095: output();
9096: }
9097: if((K = getopt(delete)) >= 1){ /* delete */
9098: LC = 0;
9099: if(type(K) == 1 && K > 10) K = 10;
9100: if(type(K) == 4){
9101: K = qsort(K);
9102: LC = 1; /* specific lines */
9103: }
9104: Done = 1;
9105: Id = open_file(Dirout);
9106: if(Id >= 0){
9107: Buf = Buf0 = Buf1 = Key = "";
9108: PE = 0;
9109: if(type(K) == 1)
9110: BufE = newvect(K--);
9111: Dout = Dirout+"0";
9112: remove_file(Dout);
9113: output(Dout);
9114: while((S = get_line(Id)) != 0){
9115: if(LC){
9116: while(K != [] && car(K) < LC)
9117: K = cdr(K);
9118: if(K == [] || car(K) > LC)
9119: output(S);
9120: }
9121: if(Key == ""){
9122: if((P0 = str_str(S,"\\begin{")) == 0){
9123: Key = sub_str(S,7,str_str(S,"}")-1);
1.3 takayama 9124: if(findin(Key,["align", "gather","multline", "equation","align*"]) < 0)
1.1 takayama 9125: Key = "";
9126: else{
9127: Key = "\\end{"+Key+"}";
9128: if(!LC){
9129: if(Buf != ""){
9130: if(PE < K)
9131: BufE[PE++] = Buf1+Buf;
9132: else{
9133: if(K > 0){
9134: print(BufE[0]);
9135: for(I = 1; I < K; I++)
9136: BufE[I-1]=BufE[I];
9137: BufE[K-1] = Buf1+Buf;
9138: }else
9139: print(Buf1+Buf);
9140: Done = 0;
9141: }
9142: Buf1 = Buf0;
9143: Buf = Buf0 ="";
9144: }
9145: }
9146: }
9147: }
9148: if(Key == "" && !LC) Buf0 += S;
9149: }
9150: if(Key != ""){
9151: if(!LC) Buf += S;
9152: if(str_str(S,Key) >= 0){
9153: Key = "";
9154: if(LC) LC++;
9155: }
9156: }
9157: }
9158: output();
9159: close_file(Id);
9160: }
9161: if(Done==0){
9162: Id = open_file(Dout);
9163: if(Id >= 0){
9164: remove_file(Dirout);
9165: output(Dirout);
9166: while((S = get_line(Id)) != 0)
9167: print(S,0);
9168: output();
9169: close_file(Id);
9170: }
9171: remove_file(Dout);
9172: }else L=" ";
9173: }
9174: if(getopt(clear) == 1 || Done == 1){ /* clear */
9175: remove_file(Dirout);
9176: if(L == "" || L == " "){
9177: output(Dirout);
9178: print("\\centerline{Risa/Asir}");
9179: output();
9180: }
9181: }
9182: if(L != " "){
1.3 takayama 9183: Eq=1;
1.1 takayama 9184: Eqo = getopt(eq);
9185: Fc = getopt(fctr);
9186: if(Fc == 1 && (type(L) == 2 || type(L) == 3)){
9187: L = fctrtos(L|TeX=1);
9188: if(type(L) == 4)
9189: L = "\\fact{"+L[0]+"}{"+L[1]+"}";
1.3 takayama 9190: if(type(Eqo) != 0 && type(Eqo) !=7){
1.1 takayama 9191: Eqo=0;
1.3 takayama 9192: }
1.1 takayama 9193: }
9194: if(type(L) != 4 || getopt(mult) != 1)
9195: L = [L];
1.3 takayama 9196: if(type(Eqo)!=7 && (Eqo<1 || Eqo>8))
1.1 takayama 9197: Eqo = (AMSTeX==1)?TeXEq:1;
9198: Title = getopt(title);
9199: if(type(Title) == 7){
9200: output(Dirout);
9201: print(Title);
9202: output();
9203: }
9204: Sb = getopt(subst);
9205: for( ; L != []; L = cdr(L)){
9206: Eq = 1;
9207: if(type(LT=car(L)) != 7 && type(LT) != 21)
9208: LT = my_tex_form(LT);
9209: else if(type(getopt(eq)) < 0)
9210: Eq = 0;
9211: if(type(Sb) == 4)
9212: LT = str_subst(LT,Sb[0],Sb[1]);
9213: output(Dirout);
1.3 takayama 9214: if(Eq == 1){
9215: if(type(Eqo)==7)
9216: print(texbegin(Eqo,LT));
9217: else if(Eqo >= 1 && Eqo <= 8){
9218: mycat0([MyEq[Eqo-1][0],LT,"%"],1);
9219: print(MyEq[Eqo-1][1]);
9220: }else print(LT);
9221: }else print(LT);
1.1 takayama 9222: output();
9223: }
9224: }
1.3 takayama 9225: if(str_char(Risatex,0," ")>=0 && str_char(DVIOUTA,0," ")<0 && str_char(DVIOUTB,0," ")<0
9226: && str_char(DVIOUTL,0," ")<0)
1.1 takayama 9227: Risatex="\""+Risatex+"\"";
9228: if(getopt(keep) != 1) shell(Risatex);
9229: return 1;
9230: }
9231:
9232: def rtotex(P)
9233: {
9234: S = my_tex_form(P);
9235: return (str_len(S) == 1)?S:"{"+S+"}";
9236: }
9237:
9238: def mtotex(M)
9239: {
9240: /* extern TexLim; */
9241:
9242: MB=mat(["(",")","p"],["\\{","\\}","B"],["[","]","b"],["|","|","v"],
9243: ["\\|","\\|","V"], [".",".",""]);
9244: if(type(MT=getopt(mat))==7){
9245: MT=findin(MT,["p","B","b","v","V",""]);
9246: if(MT<0) MT=0;
9247: }
9248: else MT=0;
9249: MT=MB[MT];
9250: if((F=getopt(small))!=1 && F!=2) F=0;
9251: Lim=getopt(lim);
9252: if(type(Lim)==1){
9253: if(Lim<30 && Lim!=0) Lim = TexLim;
9254: }else Lim=0;
9255: FL=getopt(len);
9256: Rw=getopt(raw);
9257: Sp=getopt(sp);
9258: Idx=getopt(idx);
9259: if(type(Idx)==4) Idx=ltov(Idx);
9260: if(type(Idx)==6 && length(Idx)==0) Idx=-1;
9261: Var=getopt(var);
9262: if(Lim>0) FL=1;
9263: Null=getopt(null);
9264: if(Null!=1 && Null!=2) Null=0;
1.4 ! takayama 9265: if(type(M)==5) M=lv2m([V]);
! 9266: else if(type(M)!=6) return monototex(M);
1.1 takayama 9267: S=size(M);
9268: if(FL==1){
9269: L=newmat(S[0],S[1]); LL=newvect(S[1]);
9270: }
9271: SS=newmat(S[0],S[1]);
9272: for(I=0; I<S[0]; I++){
9273: for(J=0; J<S[1]; J++){
9274: if(type(P=M[I][J])<=3){
9275: if(P!=0 || Null == 0 || (Null==2 && I==J)){
9276: SS[I][J]=(type(Var)>1)?fctrtos(P|TeX=2,lim=0,var=Var):fctrtos(P|TeX=2,lim=0);
1.4 ! takayama 9277: if(type(P)==1 && str_str(SS[I][J],"\\frac{-"|end=0)==0)
1.3 takayama 9278: SS[I][J]="-\\frac{"+str_cut(SS[I][J],7,100000);
1.1 takayama 9279: }
9280: }else if(type(P)==6){
9281: ST= mtotex(P|small=1,len=1);
9282: SS[I][J]=ST[0];
9283: L[I][J]=ST[1];
9284: }else if(type(P)==7){
9285: if(Rw==1) SS[I][J]=P;
9286: else SS[I][J]="\\text{"+P+"\}";
9287: }else if(type(P)==4 && length(P)==2 && P[0]>0 && (Sp==1 || Sp==2)){
9288: if(P[0]==1){
9289: SS[I][J]=fctrtos(P[1]|TeX=2,lim=0);
9290: }else{
9291: ST=my_tex_form(P[0]);
9292: if(Sp==2) ST="("+ST+")";
9293: SS[I][J]="["+fctrtos(P[1]|TeX=2,lim=0)+"]_";
9294: if(str_len(ST)<2) SS[I][J]+=ST;
9295: else SS[I][J]+="{"+ST+"}";
9296: }
9297: }else
9298: SS[I][J]=my_tex_form(P);
9299: if(FL==1) L[I][J]=texlen(SS[I][J]);
9300: }
9301: }
9302: if(Lim>0 || FL==1){
9303: for(LLL=J=0; J<S[1];J++){
9304: for(I=K=0; I<S[0];I++){
9305: if(K<L[I][J]) K=L[I][J];
9306: }
9307: LLL+=(LL[J]=K);
9308: }
9309: }
9310: if(Lim>0){
9311: if(F==2 && LLL>Lim-2*S[1]-2) F=1;
9312: if(F==1)
9313: Lim=idiv(Lim*6,5);
9314: if(LLL<=Lim-(2-F)*S[I]-2) Lim=0;
9315: }
9316: Mat=(F==1)?"smallmatrix}":"matrix}";
9317: if(F==1) Out=str_tb("\\left"+MT[0]+"\\begin{",0);
9318: else Out=str_tb((Lim==0)?"\\begin{"+MT[2]:"\\left"+MT[0]+"\\begin{",0);
9319: Out = str_tb(Mat,Out);
9320: for(I=II=LT=0; II<=S[0]; II++){
9321: if(Lim==0) II=S[0];
9322: if(II<S[0]){
9323: K=LL[II]+(2-F);
9324: if(I==II){
9325: LT+=K;
9326: continue;
9327: }
9328: if(LT+K<Lim-2) continue;
9329: LT=K;
9330: }
9331: for(I0=I; I<II; I++){
9332: if(I==I0){
9333: str_tb((I==0)?
9334: "\n ":
9335: "\\right.\\\\\n \\allowdisplaybreaks\\\\\n &\\ \\left.\\begin{"+Mat+"\n ", Out);
9336: if(Idx==1||Idx==0||type(Idx)==5){
9337: for(J=I; J<II; J++){
9338: if(type(Idx)!=4)
9339: str_tb("("+rtostr(J+Idx)+")",Out);
9340: else{
9341: JJ=length(Idx)-1;
9342: if(J<JJ) JJ=J;
9343: str_tb(my_tex_form(Idx[JJ]),Out);
9344: }
9345: if(J<II) str_tb(" & ",Out);
9346: }
9347: str_tb("\\\\\n ",Out);
9348: }
9349: }
9350: else str_tb("\\\\\n ",Out);
9351: for(J=0; J<S[1]; J++){
9352: if(J!=0) str_tb(" & ",Out);
9353: if(type(SS[I][J])==7) str_tb(SS[I][J],Out);
9354: }
9355: }
9356: Out=str_tb("\n\\end{", Out);
9357: if(II==S[0]) Out=str_tb((Lim==0&&F!=1)?MT[2]+Mat:Mat+"\\right"+MT[1],Out);
9358: else Out=str_tb(Mat+"\\right.",Out);
9359: }
9360: SS = str_tb(0,Out);
9361: if(FL!=1) return SS;
9362: if(F==1) LLL=idiv((LLL+S[1])*5+13,6);
9363: else LLL+=2*(1+S[1]);
9364: return [SS,LLL];
9365: }
9366:
9367: def sint(N,P)
9368: {
1.3 takayama 9369: if( type(N)==1 ) {
9370: NT=ntype(N);
1.4 ! takayama 9371: if((type(Opt=getopt(str))==1 || Opt==0) && Opt>=0 && P>=0){
! 9372: if(Opt==2 || Opt==4 || Opt==0){
1.3 takayama 9373: if(N==0) return "0";
9374: Pw=0;
9375: if(NT==4){
9376: NN=abs(real(N));N1=abs(imag(N));
9377: if(NN<N1) NN=N1;
9378: }else NN=abs(N);
9379: while(NN<1 && NN>-1){
9380: Pw--;
9381: N*=10;NN*=10;
9382: }
9383: while(N>=10 || N<=-10){
9384: Pw++;
9385: N/=10;NN/=10;
9386: }
1.4 ! takayama 9387: if(Opt==0) return sint(N*10^Pw,P-Pw-1);
1.3 takayama 9388: S=(getopt(sqrt)==1)?sint(N,P|str=(Opt==4)?3:1,sqrt=1):sint(N,P|str=(Opt==4)?3:1);
9389: if(Pw==0) return S;
9390: if(NT==4)
9391: S="("+S+")";
9392: if(Pw==1){
9393: if(Opt==2)
9394: return S+"*10";
9395: else
9396: return S+"\\times10";
9397: }
9398: if(Opt==2)
9399: return S+"*10^("+rtostr(Pw)+")";
9400: else
9401: return S+"\\times10^{"+rtostr(Pw)+"}";
9402: }
9403: if(NT==4){
9404: NN=real(N);
1.4 ! takayama 9405: if(NN!=0){
! 9406: S=sint(NN,P|str=1);
! 9407: if(imag(N)>0) S=S+"+";
! 9408: }
1.3 takayama 9409: else S="";
9410: S=S+sint(imag(N),P|str=1)+((Opt==3)?((getopt(sqrt)==1)?"\\sqrt{-1}":"i"):"@i");
9411: return S;
9412: }
9413: if(N<0){
9414: N=-N;
9415: Neg="-";
9416: }else Neg="";
9417: NN=floor(N);
9418: NS=rtostr(NN);
9419: if(P<=0) return Neg+NS;
9420: if(NN==0 && getopt(zero)==0) NS="";
9421: return Neg+NS+"."+str_cut(rtostr(rint((N-NN+1)*10^P)),1,P);
9422: }
9423: if(NT==4)
9424: return sint(real(N),P)+sint(imag(N),P)*@i;
9425: X = rint( N*10^P );
9426: return ((X+1.0)-1.0)/10^P;
9427: }
9428: if( (type(N)==2) || (type(N)==3) ){
9429: NN = eval(N);
9430: if( type(NN)==1 )
9431: return sint(NN,P|option_list=getopt());
9432: else return N;
9433: }
9434: if( type(N)>3 )
9435: #ifdef USEMODULE
9436: return mtransbys(os_md.sint,N,[P]|option_list=getopt());
9437: #else
9438: return mtransbys(sint,N,[P]|option_list=getopt()));
9439: #endif
9440: }
9441:
9442: def frac2n(N)
9443: {
9444: if((T=type(N))<0) return N;
1.4 ! takayama 9445: E=(getopt(big)==1)?eval(@e):0.1;
1.3 takayama 9446: if(T==1){
1.4 ! takayama 9447: if(ntype(N)==0) return (E+N)-E;
! 9448: else if(ntype(N)!=4) return N;
! 9449: else return (E*(1+@i)+N)-E*(1+@i);
1.3 takayama 9450: }
1.4 ! takayama 9451: if(T==3||T==2){
1.3 takayama 9452: N=red(N);
1.4 ! takayama 9453: Nm=nm(N);Var=vars(Nm);V=car(Var);K=length(Var);
! 9454: for(S=0,I=mydeg(Nm,V);I>=0;I--) S+=frac2n(mycoef(Nm,I,V))*V^I;
! 9455: return S/dn(N);
1.3 takayama 9456: }
1.4 ! takayama 9457: if(T<4) return (N+E)-E;
1.3 takayama 9458: #ifdef USEMODULE
1.4 ! takayama 9459: return mtransbys(os_md.frac2n,N,[]|option_list=getopt());
1.3 takayama 9460: #else
1.4 ! takayama 9461: return mtransbys(frac2n,N,[]|option_list=getopt());
1.3 takayama 9462: #endif
1.1 takayama 9463: }
9464:
9465: def xyproc(F)
9466: {
1.3 takayama 9467: if(type(Opt=getopt(opt))!=7) Opt="";
9468: if(type(Env=getopt(env))!=7)
9469: Env=(!TikZ)?"xy":"tikzpicture";
9470: if(F==1)
9471: return(Opt=="")?"\\begin{"+Env+"}\n":"\\begin{"+Env+"}["+Opt+"]\n";
9472: if(F==0) return "\\end{"+Env+"}\n";
1.1 takayama 9473: if(type(F)==7){
1.3 takayama 9474: F=xyproc(1|opt=Opt,env=Env)+F+xyproc(0|env=Env);
1.1 takayama 9475: if(getopt(dviout)==1) dviout(F);
9476: else return F;
9477: }
9478: }
9479:
9480: def xypos(P)
9481: {
1.3 takayama 9482: if(type(P[0])==7){
9483: if(P[0]=="") S="";
9484: else S=(!TikZ)?"\""+P[0]+"\"":"("+P[0]+")";
9485: }
1.1 takayama 9486: else{
1.3 takayama 9487: if(TikZ==0 && XYcm==1){
9488: X=sint(P[0]*10,XYPrec); Y=sint(P[1]*10,XYPrec);
9489: }else{
9490: X=sint(P[0],XYPrec); Y=sint(P[1],XYPrec);
9491: }
1.1 takayama 9492: S="("+rtostr(X)+","+rtostr(Y)+")";
9493: }
1.3 takayama 9494: if(!TikZ){
9495: if(length(P)>2 && (PP=P[2])!=""){
9496: S=S+" *";
9497: if(type(PP)==4 && length(PP)==2 && type(PP[0])==7){
9498: S=S+PP[0];
9499: PP=PP[1];
9500: }
9501: if(type(PP)==7){
9502: L=str_len(PP);
9503: if(str_chr(PP,0,"$")==0 && str_chr(PP,L-1,"$")==L-1){
9504: PP=str_cut(PP,1,L-2);
9505: }else S+="\\txt";
9506: }
9507: else PP=my_tex_form(PP);
9508: S=S+"{"+PP+"}";
9509: }
9510: if(length(P)>3){
9511: if(type(P[3])==7 && P[3]!="") S=S+"=\""+P[3]+"\"";
9512: if(length(P)>4 && type(P[4])==7) S=S+P[4];
9513: }
9514: }else{
9515: T="";
9516: if(length(P)>2 && (PP=P[2])!=""){
9517: F=1;
9518: if(type(PP)==4){
9519: if(length(PP)==2 && type(PP[0])==7){
9520: T="["+PP[0]+"]";
9521: PP=PP[1];
9522: }
9523: }
9524: if(type(PP)!=7) PP="$"+my_tex_form(PP)+"$";
9525: S=S+"{"+PP+"}";
9526: }else F=0;
9527: if(length(P)>3){
9528: if(type(P[3])==7 && P[3]!="") T=T+"("+P[3]+")";
9529: else if(P[3]==1) T=T+"(_)";
9530: if(length(P)>4 && type(P[4])==7) S=S+P[4];
9531: }
9532: if(length(P)>2){
9533: if(F) S="node"+T+" at"+S;
9534: else S="coordinate"+T+" at"+S;
9535: }
1.1 takayama 9536: }
9537: return S;
9538: }
9539:
9540: def xyput(P)
9541: {
9542: if((type(Sc=getopt(scale))==1 && Sc!=1) || type(Sc)==4){
9543: if(type(Sc)==1) Sc=[Sc,Sc];
9544: Sx=Sc[0];Sy=Sc[1];
1.3 takayama 9545: if(length(P)>2)
9546: P1=cons(Sy*P[1],cdr(cdr(P)));
9547: else P1=[Sy*P[1]];
9548: P=cons((type(P[0])==7)?P[0]:(Sx*P[0]),P1);
1.1 takayama 9549: }
1.3 takayama 9550: if(!TikZ) return "{"+xypos(P)+"};\n";
9551: return "\\"+xypos(P)+";\n";
1.1 takayama 9552: }
9553:
9554: def xyline(P,Q)
9555: {
1.3 takayama 9556: if(!TikZ) return "{"+xypos(P)+" \\ar@{-} "+xypos(Q)+"};\n";
9557: if(type(T=getopt(opt))!=7) T="";
9558: else T="["+T+"]";
9559: if(length(P)<3 && length(Q)<3)
9560: return "\\draw"+T+xypos(P)+"--"+xypos(Q)+";\n";
9561: if(length(P)==2) P=[P[0],P[1],"","_0"];
9562: else if(length(P)==3 || (length(P)==4 && P[3]==""))
9563: P=[P[0],P[1],P[2],"_0"];
9564: else if(length(P)>4 && P[3]=="")
9565: P=[P[0],P[1],P[2],"_0",P[4]];
9566: if(length(Q)==2) Q=[Q[0],Q[1],"","_1"];
9567: else if(length(Q)==3 || (length(Q)==4 && Q[3]==""))
9568: Q=[Q[0],Q[1],Q[2],"_1"];
9569: else if(length(Q)>4 && Q[3]=="")
9570: Q=[Q[0],Q[1],Q[2],"_1",Q[4]];
9571: return "\\draw "+T+xypos(P)+" "+xypos(Q)+"("+P[3]+")--("+Q[3]+");\n";
1.1 takayama 9572: }
9573:
9574: def xylines(P)
9575: {
1.3 takayama 9576: /* mycat([P,getopt()]); */
1.1 takayama 9577: Lf=getopt(curve);
9578: if(type(Lf)!=1) Lf=0;
9579: SS=getopt(opt);
1.3 takayama 9580: SF=(SS==0)?1:0;
9581: if((Proc=getopt(proc))==1||Proc==2||Proc==3){
9582: OL=cons(["opt",0],delopt(getopt(),["opt","proc"]));
9583: R=xylines(P|option_list=OL);
9584: OP=(type(SS)<0)?[]:((type(SS)==4)?[["opt",SS[0]],["cmd",SS[1]]]:[["opt",SS]]);
9585: return [1,OP,R];
9586: }
9587: if(type(SS)!=7 && type(SS)!=4){
9588: if(Lf==0 && !TikZ) SS="@{-}";
1.1 takayama 9589: else SS="";
9590: }
9591: if(type(Sc=getopt(scale))==1 || type(Sc)==4){
9592: if(type(Sc)==1) Sc=[Sc,Sc];
9593: Sx=Sc[0];Sy=Sc[1];
9594: if(Sx!=1 || Sy!=1){
9595: for(PP=[], P0=P; P0!=[]; P0=cdr(P0)){
9596: PT=car(P0);
1.3 takayama 9597: if((type(PT)!=4 && type(PT)!=5) || (type(PT[0])!=1 && PT[0]!=0))
9598: PP=cons(PT,PP);
1.1 takayama 9599: else{
1.3 takayama 9600: if(length(PT)>2 && type(PT)==4)
9601: P1=cons(Sy*PT[1],cdr(cdr(PT)));
9602: else P1=[Sy*PT[1]];
1.1 takayama 9603: PP=cons(cons(Sx*PT[0],P1),PP);
9604: }
9605: }
9606: P=reverse(PP);
9607: }
9608: }
1.3 takayama 9609: if(type(Cl=CL0=getopt(close))!=1) Cl=0;
9610: if((Vb=getopt(verb))!=1&&type(Vb)!=4) Vb=0;
1.1 takayama 9611: if(type(Lf)!=1 || Lf==0){ /* lines */
1.3 takayama 9612: if(TikZ||SF){
9613: for(L=[],F=0,PT=P;PT!=[];PT=cdr(PT)){
9614: if(type(car(PT))<4){
9615: L=cons(car(PT),L);
9616: F=0;
9617: }else{
9618: if(F++>1) L=cons(1,L);
9619: L=cons(car(PT),L);
9620: }
9621: }
9622: if(Cl==1){
9623: L=cons(1,L);L=cons(-1,L);
9624: }
9625: if(L) L=reverse(L);
9626: if(SF) return L;
9627: if(type(SS)!=4) S=xybezier(L|opt=SS);
9628: else S=xybezier(L|opt=SS[0],cmd=SS[1]);
9629:
9630: }else{
9631: Out = str_tb(0,0);
9632: for(PT=P; PT!=[]; ){
9633: PS1=car(PT);
9634: PT=cdr(PT);
9635: if(PT==[]){
9636: if(Cl==1) PS2=car(P);
9637: else PS2=0;
9638: }else PS2=car(PT);
9639: str_tb(xyarrow(PS1,PS2|opt=SS),Out);
9640: }
9641: S=str_tb(0,Out);
1.1 takayama 9642: }
9643: }else if(Lf==2){ /* B-spline */
1.3 takayama 9644: if(SF) return P;
9645: if(!TikZ){
9646: Out = str_tb("{\\curve{",0);
9647: for(PT=P;PT!=[];PT=cdr(PT)){
9648: if(car(PT)==0){
9649: str_tb("}};\n{\\curve{",Out);
9650: continue;
9651: }
9652: if(PT!=P) str_tb("&",Out);
9653: str_tb(xypos([car(PT)[0],car(PT)[1]]),Out);
1.1 takayama 9654: }
1.3 takayama 9655: str_tb("}};\n",Out);
9656: S=str_tb(0,Out);
9657: }else Out=str_tb(xybezier(P|opt=SS),0);
1.1 takayama 9658: for(I=0;I<2;I++){
9659: Q=car(P);
9660: if(length(Q)>2)
9661: str_tb(xyput(Q),Out);
9662: P=reverse(P);
9663: }
1.3 takayama 9664: S=str_tb(0,Out);
1.1 takayama 9665: }else{ /* extended Bezier */
9666: RTo=getopt(ratio);
1.4 ! takayama 9667: if(type(Acc=getopt(Acc))!=1) Acc=0;
1.1 takayama 9668: if(type(RTo)!=1 || RTo>1.5 || RTo<0.001) RTo=0;
9669: if(Cl==1){
9670: PR=reverse(P);
9671: PT=car(PR);
9672: PR=cons(P[0],PR);
9673: PR=cons(P[1],PR);
9674: P=cons(PT,reverse(PR));
9675: }else if(Cl==-1) Cl=1;
1.3 takayama 9676: for(L=P2=P3=0,PT=P;;){
1.1 takayama 9677: P1=P2;P2=P3;P3=P4;
9678: P4=(PT==[])?0:car(PT);
9679: if(PT==[] && (Cl==1 || P3==0)) break;
9680: PT=cdr(PT);
9681: if(P3==0) str_tb("%\n", Out);
9682: if(P2==0 || P3==0 || (Cl==1 && P1==0)) continue;
1.3 takayama 9683: if(L!=0){
9684: if(car(L)==P2)
9685: L=cons(1,L);
9686: else{
9687: L=cons(0,L); L=cons(P2,L);
9688: }
9689: }else L=[P2];
1.1 takayama 9690: X=P3[0]-P2[0];Y=P3[1]-P2[1];
1.4 ! takayama 9691: DL1=DL2=0;DL=Acc?sqrt(X^2+Y^2):dsqrt(X^2+Y^2);
1.1 takayama 9692: if(P4!=0){
1.4 ! takayama 9693: XD1=P4[0]-P2[0];YD1=P4[1]-P2[1];DL1=Acc?sqrt(XD1^2+YD1^2):dsqrt(XD1^2+YD1^2);
1.1 takayama 9694: }
9695: if(P1!=0){
1.4 ! takayama 9696: XD2=P3[0]-P1[0];YD2=P3[1]-P1[1];DL2=Acc?sqrt(XD2^2+YD2^2):dsqrt(XD2^2+YD2^2);
1.3 takayama 9697: }
9698: if(RTo!=0)
9699: R=RTo;
9700: else if(DL1>0 && DL2>0){
9701: Cos=(XD1*XD2+YD1*YD2)/(DL1*DL2);
1.4 ! takayama 9702: RT=4/(3*(Acc?sqrt((1+Cos)/2):dsqrt((1+Cos)/2))+3);
1.3 takayama 9703: R=DL*RT/(DL1+DL2);
9704: }else if(DL1!=0)
9705: R=DL/(2*DL1);
9706: else if(DL2!=0)
9707: R=DL/(2*DL2);
9708: if(DL2!=0) L=cons([P2[0]+R*XD2,P2[1]+R*YD2],L);
9709: if(DL1!=0) L=cons([P3[0]-R*XD1,P3[1]-R*YD1],L);
9710: L=cons([P3[0],P3[1]],L);
9711: }
9712: if(CL0==1) L=cons(-1,cdr(L));
9713: if(L!=0) L=reverse(L);
9714: if(SF) return L;
9715: if(type(SS)==4)
9716: S=xybezier(L|opt=SS[0],cmd=SS[1],verb=Vb);
9717: else
9718: S=xybezier(L|opt=SS,verb=Vb);
1.1 takayama 9719: }
9720: if(getopt(dviout)!=1) return S;
9721: xyproc(S|dviout=1);
9722: }
9723:
1.3 takayama 9724: def saveproc(S,Out)
9725: {
9726: if(type(Out)==4){
9727: Out=cons(S,Out);
9728: return Out;
9729: }else{
9730: str_tb(S,Out);
9731: return Out;
9732: }
9733: }
9734:
1.1 takayama 9735: def xy2graph(F0,N,Lx,Ly,Lz,A,B)
9736: {
9737: /* (x,y,z) -> ( -x sin A + y cos A, z cos B - x cos A sin B - y sin A sin B) */
1.3 takayama 9738: if((Proc=getopt(proc))==1||Proc==2){
9739: OPT0=[["proc",3]];
9740: }else{
9741: Proc=0;OPT0=[];
9742: }
9743: if(type(DV=getopt(dviout))==4){
1.4 ! takayama 9744: S=["ext","shift","cl","dviout"];
1.3 takayama 9745: OL=delopt(getopt(),S);
9746: OL=cons(["proc",1],OL);
1.4 ! takayama 9747: R=xy2graph(F0,N,Lx,Ly,Lz,A,B|option_list=OL);
1.3 takayama 9748: OL=delopt(getopt(),S|inv=1);
9749: return execdraw(R,DV|optilon_list=OL);
9750: }
1.1 takayama 9751: if(N==0 || N>100 || N<-100) N=-16;
9752: if(N<0){
9753: N=-N;N1=-1;N2=NN+1;
9754: }else{
9755: N1=0;N2=NN=N;
9756: }
1.3 takayama 9757:
9758: Ratio=Ratio2=1;
9759: if(type(Sc=Sc0=getopt(scale))!=1 && type(Sc)!=4) Sc=1;
9760: if(type(Sc)==4){
9761: Ratio=Sc[1]/Sc[0];
9762: if(length(Sc)>2) Ratio2=Sc[2]/Sc[0];
9763: Sc=Sc[0];
9764: }
1.1 takayama 9765: if(type(Vw=getopt(view))!=1) Vw=0;
9766: if(type(Raw=getopt(raw))!=1) Raw=0;
9767: if(type(M1=getopt(dev))==1) M2=M1;
9768: else if(type(M1)==4){
9769: M2=M1[1];M1=M1[0];
9770: }else M1=0;
1.3 takayama 9771: if(type(M3=getopt(acc))!=1 || (M3<0.5 && M3>100)) M3=1;
1.1 takayama 9772: if(M1<=0) M1=16;
9773: if(M2<=0) M2=16;
1.3 takayama 9774: OL=[["para",1],["scale",Sc]];
1.1 takayama 9775: if(Raw==1) OL=cons(["raw",1],OL);
1.3 takayama 9776: if(type(Prec=getopt(prec))>=0) OL=cons(["prec",Prec],OL);
1.1 takayama 9777: L=newvect(4,[[Lx[1],Ly[0]],[Lx[1],Ly[1]],[Lx[0],Ly[1]],[Lx[0],Ly[0]]]);
1.3 takayama 9778: Lx=[deval(Lx[0]),deval(Lx[1])];
9779: Ly=[deval(Ly[0]),deval(Ly[1])];
9780: Lz=[deval(Lz[0]),deval(Lz[1])];
9781: A=(A0=A)%360;
9782: F00=F0;
9783: if(type(F0)<4){
9784: FC=f2df(F0);
9785: if(findin(z,Vars=vars(FC))>=0 && findin(x,Vars)<0 && findin(y,Vars)<0)
9786: F0=[w,[z,0,x+y*@i],[w,os_md.abs,FC]];
9787: }
9788: if(type(Org=getopt(org))==4){ /* shift origin */
9789: Lx=[Lx[0]-Org[0],Lx[1]-Org[0]];
9790: Ly=[Ly[0]-Org[1],Ly[1]-Org[1]];
9791: Lz=[Lz[0]-Org[2],Lz[1]-Org[2]];
1.4 ! takayama 9792: F0=mysubst(F0,[[x,x+Org[0]],[y,y+Org[1]]]);
1.3 takayama 9793: if(type(F0)==4){
9794: F0=cons(F0[0]-Org[2],cdr(F0));
9795: }
9796: else F0-=Org[2];
9797: }else Org=[0,0,0];
9798: Cpx=getopt(cpx);
9799: if(type(Cpx)<0){
9800: if(str_str(rtostr(F0),"@i")>=0) Cpx=1;
9801: else Cpx=0;
9802: }
9803: if(A<0) A+=360;
9804: if(A<90){
9805: Sh=1;F1=F0;Cx=x-Org[0];Cy=y-Org[1];
9806: }else if(A<180){ /* x -> y, y -> -x */
9807: Sh=2;A-=90; F1=mulsubst(F0,[[x,-y],[y,x]]);
9808: LL=Ly;Ly=[-Lx[1],-Lx[0]];Lx=LL;Cx=y-Org[1];Cy=-x+Org[0];
9809: }else if(A<270){
1.4 ! takayama 9810: Sh=3;A-=180; F1=subst(F0,[[x,-x],[y,-y]]);
1.3 takayama 9811: Lx=[-Lx[1],-Lx[0]];Ly=[-Ly[1],-Ly[0]];Cx=-x+Org[0];Cy=-y+Org[1];
9812: }else{
9813: Sh=4;A-=270;F1=mulsubst(F0,[[x,y],[y,-x]]);
9814: LL=Lx;Lx=[-Ly[1],-Ly[0]];Ly=LL;Cx=-y+Org[1];Cy=x-Org[0];
1.1 takayama 9815: }
1.3 takayama 9816: A=@pi*A/180; B=@pi*B/180;
1.1 takayama 9817: if(A==0) A=@pi/3;
1.3 takayama 9818: if(B==0) B=@pi/12;
9819: NN=N*M2;
9820: Ac=dcos(deval(A)); As=dsin(deval(A));
1.1 takayama 9821: if(Ac<=0.087 || As<=0.087){
9822: mycat(["Unsuitable angle",A0,"(6-th argument)!"]);
9823: return -1;
9824: }
1.3 takayama 9825: Bc=Ratio*dcos(deval(B)); Bs=dsin(deval(B));
1.1 takayama 9826: if(Bc<0){
9827: mycat("Unsuitable angle (7-th argument)!");
9828: return -1;
9829: }
1.3 takayama 9830: /*
9831: z = f(x,y) => X=-As*x+Ac*y, Y= Bc*f(x,y)-Bsc*x-Bss*y
9832: Out X-coord is in [X0,X1], dvided by Dev segments
9833: J-th segment of Y-coord : ZF[J]==1 => [Z0[0],Z1[J]]
9834: */
1.1 takayama 9835: Bsc=Bs*Ac;Bss=Bs*As;
1.3 takayama 9836: if(Ratio2!=1){
9837: if(Sh%2==1){
9838: Ac*=Ratio2;Bss*=Ratio2;
9839: }else{
9840: As*=Ratio2;Bsc*=Ratio2;
9841: }
9842: }
9843: CX=-As*Cx+Ac*Cy;CY=Bc*(z-Org[2])-Bsc*Cx-Bss*Cy;
9844: if(type(Dvi=getopt(dviout))!=1 && getopt(trans)==1) return [CX*Sc,CY*Sc];
9845: if(type(N1=getopt(inf))==1){
9846: if(Proc) Dvi=N1;
9847: else if(Dvi<=0) Dvi=-N1;
9848: }
9849: X0=-As*Lx[1]+Ac*Ly[0];X1=-As*Lx[0]+Ac*Ly[1];
1.4 ! takayama 9850: F1=mysubst(F1,[@pi,deval(@pi)]);
1.3 takayama 9851: Tf=type(F1=f2df(F1|opt=0));
9852: if(Tf!=4) F=Bc*F1-Bsc*x-Bss*y;
9853: else F=append([Bc*F1[0]-Bsc*x-Bss*y],cdr(F1));
1.1 takayama 9854: Dx=(Lx[1]-Lx[0])/NN; Dy=(Ly[1]-Ly[0])/NN;
9855: if(type(Err=getopt(err))==1)
1.4 ! takayama 9856: F=mysubst(F,[[x,x+Err*Dx/1011.23],[y,y+Err*Dy/1101.34]]);
1.3 takayama 9857: Out=(Proc)?[]:str_tb(0,0);
9858: Dev=N*M1;
9859: XD=(X1-X0)/Dev;
9860: OLV=newvect(2,[OL,OL]);
9861: if(type(Ura=getopt(opt))==4 || type(Ura)==7){
9862: if(type(Ura)==7) Ura=[Ura,Ura];
9863: else{
9864: OLV[0]=cons(["opt",Ura[0]],OL);
9865: OLV[1]=cons(["opt",Ura[1]],OL);
9866: }
9867: }
9868: for(KC=0; KC<=1; KC++){ /* draw curves */
1.1 takayama 9869: Z0=newvect(Dev+1); Z1=newvect(Dev+1); ZF=newvect(Dev+1);
9870: for(I=0; I<=NN; I++){
9871: FV=I%M2;
9872: if(KC==0){
1.4 ! takayama 9873: X=x; Y=Ly[1]-I*Dy; LX=Lx; DD=Dx; G=mysubst(F,[y,Y]);
1.3 takayama 9874: if(!FV){
9875: if(!Proc) str_tb(["%y=",rtostr(Y),"\n"],Out);
9876: else Out=cons([-2,"y="+rtostr(Y)],Out);
9877: }
1.1 takayama 9878: }else{
1.4 ! takayama 9879: X=Lx[1]-I*Dx; Y=x; LX=Ly; DD=Dy; G=mysubst(F,[[x,X],[y,Y]]);
1.3 takayama 9880: if(!FV){
9881: if(!Proc) str_tb(["%x=",rtostr(X),"\n"],Out);
9882: else Out=cons([-2,"x="+rtostr(X)],Out);
9883: }
1.1 takayama 9884: }
9885: XX=-As*X+Ac*Y; A1=coef(XX,1,x); A0=coef(XX,0,x); /* XX = A1*x + A0, x = (XX-A0)/A1 */
9886: if(!FV && Vw==1){
1.3 takayama 9887: if(Proc) Out=cons(xygraph([XX,G],N,LX,[X0,X1],Lz|scale=Sc,para=1,proc=3),Out);
9888: else str_tb(xygraph([XX,G],N,LX,[X0,X1],Lz|scale=Sc,para=1),Out);
1.1 takayama 9889: continue;
9890: }
9891: V=VT=LX[1];
9892: J0=(subst(XX,x,LX[0])-X0)/XD; J1=(subst(XX,x,LX[1])-X0)/XD;
9893: if(J0<J1){
1.3 takayama 9894: J0=ceil(J0); J1=floor(J1); JD=1; /* fixed x: y: dec => (x,z):(dec,inc) */
1.1 takayama 9895: }else{
1.3 takayama 9896: J0=floor(J0); J1=ceil(J1); JD=-1; /* fixed y: x: dec => (x,z):(inc,inc) */
1.1 takayama 9897: }
9898: for(FF=1,J=J1;;J-=JD){
1.3 takayama 9899: V1=VT;
1.4 ! takayama 9900: VT=(X0+J*XD-A0)/A1;GG=mysubst(G,[x,VT]);
1.3 takayama 9901: if(Cpx>=1) VV=myeval(GG);
9902: else VV=(Tf==4)? mydeval(GG):deval(GG); /* J -> V */
9903: if(ZF[J]==0 || VV<=Z0[J] || VV>=Z1[J]){ /* visible */
1.1 takayama 9904: if(FF==0){
9905: V0=(VT+V1)/2;
1.3 takayama 9906: if(!FV && Vw==-1 && Raw!=1){ /* draw doted line */
9907: K=ceil(M3*(V-V0)/(M2*DD));
9908: if(N1<0) K=-K;
9909: OPT=append(OPT0,[["opt",(TikZ)?"dotted":"~*=<3pt>{.}"],["scale",Sc],["para",1]]);
9910: Out=saveproc(xygraph([XX,G],K,[V0,V],[X0-1,X1+1],Lz|
9911: option_list=OPT),Out);
9912: }
1.1 takayama 9913: V=V0;
9914: }
9915: if(ZF[J]==0){
9916: ZF[J]=1; Z0[J]=Z1[J]=VV;
9917: }else if(VV<=Z0[J]) Z0[J]=VV;
9918: else Z1[J]=VV;
1.3 takayama 9919:
9920: if(VV>=Z1[J]) FF=1;
9921: else if(VV<=Z0[J]) FF=-1;
1.1 takayama 9922: }else{
1.3 takayama 9923: if(FF!=0){
1.1 takayama 9924: V0=(VT+V1)/2;
9925: K=ceil(M3*(V-V0)/(M2*DD));
9926: if(N1<0) K=-K;
1.3 takayama 9927: if(!FV){
9928: OPT=append(OPT0,OLV[(1-FF)/2]);
9929: Out=saveproc(xygraph([XX,G],K,[V0,V],[X0-1,X1+1],Lz|option_list=OPT),Out);
9930: }
1.1 takayama 9931: V=V0;
9932: }
9933: FF=0;
9934: }
9935: if(J==J0) break;
9936: }
9937: if(FV) continue;
1.3 takayama 9938: V0=LX[0];K=ceil(M3*(V-V0)/(M2*DD));
1.1 takayama 9939: if(N1<0) K=-K;
1.3 takayama 9940: if(FF!=0){
9941: if(Raw!=1){
9942: OPT=append(OPT0,OLV[(1-FF)/2]);
9943: Out=saveproc(xygraph([XX,G],K,[V0,V],[X0-1,X1+1],Lz|option_list=OPT),Out);
9944: }else if(Vw==-1 && Raw!=1){
9945: OPT=append(OPT0,[["opt",(TikZ)?"dotted":"~*=<3pt>{.}"]]);
9946: Out=saveproc(xygraph([XX,G],K,[V0,V],[X0-1,X1+1],Lz|option_list=OPT),Out);
9947: }
9948: }
9949: }
9950: }
1.4 ! takayama 9951: OptSc=(Sc==1)?[]:[["scale",Sc]];
1.3 takayama 9952: if(type(LZ=getopt(ax))==4){ /* draw box */
9953: FC=0;
9954: if(length(LZ)==3) FC=LZ[2];
9955: P0=newvect(2,[-As*Lx[1]+Ac*Ly[1],Bc*(LZ[0]-Org[0])-Bsc*Lx[1]-Bss*Ly[1]]);
9956: Vx=newvect(2,[As*(Lx[1]-Lx[0]),Bsc*(Lx[1]-Lx[0])]);
9957: Vy=newvect(2,[Ac*(Ly[0]-Ly[1]),Bss*(Ly[1]-Ly[0])]);
9958: Vz=newvect(2,[0,Bc*(LZ[1]-LZ[0])]);
1.4 ! takayama 9959: OL=OL0=append(OPT0,OL);
! 9960: if(TikZ && type(Ura)==4 && length(Ura)>2) OL0=cons(["opt",Ura[2]],OL);
! 9961: Out=saveproc(xylines([P0,P0+Vx]|option_list=OL0),Out);
! 9962: Out=saveproc(xylines([P0+Vz,P0+Vx+Vz]|option_list=OL0),Out);
1.3 takayama 9963: if(Bs>0){
1.4 ! takayama 9964: Out=saveproc(xylines([P0+Vy+Vz,Pz=P0+Vx+Vy+Vz]|option_list=OL0),Out);
! 9965: Out=saveproc(xylines([P0+Vx+Vz,Pz]|option_list=OL0),Out);
1.3 takayama 9966: PP=Pz-Vz;
9967: }else{
1.4 ! takayama 9968: Out=saveproc(xylines([P0+Vy,Pz=P0+Vx+Vy]|option_list=OL0),Out);
! 9969: Out=saveproc(xylines([P0+Vx,Pz]|option_list=OL0),Out);
1.3 takayama 9970: PP=Pz+Vz;
9971: }
9972: J=ceil((PP[0]-X0)/XD+0.5);
1.4 ! takayama 9973: Out=saveproc(xylines([P0,P0+Vy]|option_list=OL0),Out);
! 9974: Out=saveproc(xylines([P0+Vz,P0+Vy+Vz]|option_list=OL0),Out);
! 9975: Out=saveproc(xylines([P0,P0+Vz]|option_list=OL0),Out);
! 9976: Out=saveproc(xylines([P0+Vx,P0+Vx+Vz]|option_list=OL0),Out);
! 9977: Out=saveproc(xylines([P0+Vy,P0+Vy+Vz]|option_list=OL0),Out);
! 9978: Out=saveproc(xylines([P0+Vy,P0+Vy+Vz]|option_list=OL0),Out);
1.3 takayama 9979: if(Dev>4) Dev2=ceil(Dev/2);
9980: if(FC<0 && Raw!=1){
1.4 ! takayama 9981: if(TikZ){
! 9982: if(type(Ura)==4 && length(Ura)>2)
! 9983: OL1=cons(["opt",Ura[2]+",dotted"],OL);
! 9984: else OL1=cons(["opt","dotted"],OL);
! 9985: }else OL1=cons(["opt","@{.}"],OL);
1.3 takayama 9986: if(FC==-8) FC=0;
9987: }
9988: for(I=0;I<3;I++){ /* box with hidden part */
9989: if(I==1) Pz=PP-Vx;
9990: else if(I==2) Pz=PP-Vy;
9991: LP=Pz-PP;
9992: for(FV=-1,K=0;K<=Dev2; K++){
9993: PPx=PP[0]+(K/Dev2)*LP[0]; PPy=PP[1]+(K/Dev2)*LP[1];
9994: J=ceil((PPx-X0)/XD);
9995: if(K!=Dev2 && (J<0||J>Dev)) continue;
9996: if(K!=Dev2 && (ZF[J]==0 || PPy<Z0[J] || PPy>Z1[J])){ /* visible */
9997: if(FV!=1){
9998: FV=1;
9999: PPP=[PPx,PPy];
10000: }
10001: }else{
10002: if(FV!=0){
10003: if(FV==1) Out=saveproc(xylines([PPP,[PPx,PPy]]|option_list=OL1),Out);
10004: FV=0;
10005: }
10006: }
10007: }
10008: }
10009: if(FC!=0 && Raw!=1){ /* show coordinate*/
10010: if(iand(FC,4)){
10011: Sub=1;
10012: if(TikZ){
10013: S0="\\scriptsize";S1="";
10014: }else{
10015: S0="{}_{"; S1="}";
10016: }
10017: }else Sub=0;
10018: if(iand(FC,2))
10019: LLL=[[1,0,P0+Vx,(TikZ)?"right":"+!L"],[3,0,P0+Vy,(TikZ)?"left":"+!R"]];
10020: else LL=[];
10021: if(Bs>0){
10022: LLL=cons([0,0,P0,(TikZ)?"below":"+!U"],LLL);
10023: LLL=cons([2,1,P0+Vx+Vy+Vz,(TikZ)?"above":"+!D"],LLL);
10024: }else{
10025: LLL=cons([2,0,P0+Vx+Vy,(TikZ)?"below":"+!U"],LLL);
10026: LLL=cons([0,1,P0+Vz,(TikZ)?"above":"+!D"],LLL);
10027: }
10028: for(TLL=LLL;TLL!=[];TLL=cdr(TLL)){
10029: TL=car(TLL);LL=L[(Sh+TL[0])%4];
1.4 ! takayama 10030: if(Cpx==0 || Cpx==3){
1.3 takayama 10031: S=ltotex([LL[0],LL[1],LZ[TL[1]]]|opt="coord");
1.4 ! takayama 10032: SS="("+rtostr(LL[0]) +","+rtostr(LL[1])+","+rtostr(LZ[TL[1]])+")";
! 10033: }else{
1.3 takayama 10034: S=ltotex([LL[0]+LL[1]*@i,LZ[TL[1]]]|opt="coord",cpx=Cpx);
1.4 ! takayama 10035: SS="("+rtostr(LL[0])+"+"+rtostr(LL[1])+"i,"+ rtostr(LZ[TL[1]])+")";
! 10036: }
1.3 takayama 10037: if(TikZ) S="$"+S+"$";
10038: if(Sub) S=S0+S+S1;
10039: if(!TikZ) S="$"+S+"$";
1.4 ! takayama 10040: if(Proc) Out=cons([2,OptSc,[TL[2][0],TL[2][1]],[[TL[3],S]],SS],Out);
! 10041: else str_tb(xyput([TL[2][0],TL[2][1],[TL[3],S]]|option_list=OptSc),Out);
1.3 takayama 10042: }
10043: }
10044: }
10045: if(type(Pt=getopt(pt))==4){ /* option pt=[] */
10046: if(type(Pt[0])<4 || (length(Pt[0])==3 && type(Pt[0][0])<2 && type(Pt[0][2])<2))
10047: Pt=[Pt];
10048: for(PT=Pt;PT!=[];PT=cdr(PT)){
10049: PP=car(PT);
10050: /* if(type(PP[0])!=4) PP=[PP]; */
10051: P=car(PP);
10052: if(type(P)==7) Q=[P,0];
10053: else if(P==1) Q=["_",0];
1.4 ! takayama 10054: else Q=mysubst([CX,CY],[[x,deval(P[0])],[y,deval(P[1])],[z,deval(P[2])]]);
1.3 takayama 10055: if(length(PP)>1 && type(PP[1])==4 && length(PP[1])==3){ /* draw line */
10056: PP=cdr(PP);P=car(PP);
10057: if(type(P)==7) Q1=P;
10058: else if(P==1) Q="_";
1.4 ! takayama 10059: else Q1=mysubst([CX,CY],[[x,deval(P[0])],[y,deval(P[1])],[z,deval(P[2])]]);
1.3 takayama 10060: if(length(PP)<2 || PP[1]==0 || iand(PP[1],1)) OL2=="";
10061: else OL2=(TikZ)?"dotted":"@{.}";
10062: if(length(PP)>2 && type(PP[2])==7){
10063: if(OL2=="") OL2=PP[2];
10064: else{
10065: if(TikZ) OL2=OL2+",";
10066: OL2=OL2+PP[2];
10067: }
10068: }
10069: OL1=OL;
10070: if(OL2!="") OL1=cons(["opt",OL2],OL1);
10071: if(length(PP)<2 || PP[1]>=0)
10072: Out=saveproc(xylines([Q,Q1]|option_list=OL1),Out);
10073: else{
10074: LP0=Q1[0]-Q[0];LP1=Q1[1]-Q[1];
10075: for(FV=-1,K=0;K<=Dev2; K++){
10076: PPx=Q[0]+(K/Dev2)*LP0; PPy=Q[1]+(K/Dev2)*LP1;
10077: J=ceil((PPx-X0)/XD);
10078: if(K!=Dev2 && (J<0 || J>Dev || ZF[J]==0 || PPy<Z0[J] || PPy>Z1[J])){
10079: /* visible */
10080: if(FV!=1){
10081: FV=1;
10082: PPP=[PPx,PPy];
10083: }
10084: }else{
10085: if(FV!=0){
10086: if(FV==1) Out=saveproc(xylines([PPP,[PPx,PPy]]|option_list=OL1),Out);
10087: FV=0;
10088: }
10089: }
10090: }
10091: }
10092: continue;
10093: }
10094: if(length(PP)==1) S="$\\bullet$";
10095: else if(type(PP[1])==7) S=PP[1];
10096: else if(type(PP[1])==4){
10097: if(length(PP[1])>1 && type(PP[1][1])!=7)
10098: S=cons(car(PP),cons("$\\bullet$",cdr(cdr(PP))));
10099: else S=PP[1];
10100: }else S="$\\bullet$";
10101: if(length(PP)<=2){
1.4 ! takayama 10102: if(Proc) Out=cons([2,OptSc,[Q[0],Q[1]],[S]],Out);
! 10103: else str_tb(xyput([Q[0],Q[1],S]|optilon_list=OptSc),Out);
1.3 takayama 10104: }else if(!TikZ){
1.4 ! takayama 10105: if(Proc) Out=cons([2,OptSc,[Q[0],Q[1]],[S,"",PP[2]]],Out);
! 10106: else str_tb(xyput([Q[0],Q[1],S,"",PP[2]]|optilon_list=OptSc),Out);
1.3 takayama 10107: }else{
1.4 ! takayama 10108: if(Proc) Out=cons([2,OptSc,[Q[0],Q[1]],cons(S,cdr(cdr(PP)))],Out);
! 10109: else str_tb(xyput(append([Q[0],Q[1],S],cdr(cdr(PP)))|optilon_list=OptSc),Out);
1.3 takayama 10110: }
10111: }
10112: }
10113: if(Proc){
10114: S=reverse(Out);
10115: if(Proc==1||Proc==3){
10116: for(W=[],I=0;I<2;I++) for(J=0;J<2;J++) for(K=0;K<2;K++)
1.4 ! takayama 10117: W=cons(mysubst([CX*Sc,CY*Sc],[[x,Lx[I]],[y,Ly[J]],[z,Lz[K]]]),W);
1.3 takayama 10118: W=ptbbox(W);
10119: S=cons([0,W[0],W[1],(TikZ)?1:1/10],S);
10120: }
10121: }else S=str_tb(0,Out);
10122: if(type(Dvi)!=1||(Proc&&abs(Dvi)<2)) return S;
10123: Lout=[];
10124: if(abs(Dvi)>=2){
10125: /* show title */
10126: L0=[];
10127: Title=getopt(title);
10128: if(type(Title)!=7)
10129: Title=(type(F00)==4)?("\\texttt{"+verb_tex_form(F00)+"}"):my_tex_form(F00);
10130: if(type(Title)==7){
10131: T=my_tex_form(L[3][0])+"\\le x\\le "+my_tex_form(L[1][0])+",\\,"+
10132: my_tex_form(L[3][1])+"\\le y\\le "+my_tex_form(L[1][1])+")";
10133: if(Proc){
10134: if(Cpx>=1) L0=[[5,[["eq",1]],"|"+Title+"|\\quad(z=x+yi,\\ "+T]];
10135: else L0=[[5,[["eq",1]],"z="+Title+"\\ \\ ("+T]];
10136: }else{
10137: if(Cpx>=1) dviout("|"+Title+"|\\quad(z=x+yi,\\ "+T|eq=1,keep=1);
10138: else dviout("z="+Title+"\\ \\ ("+T|eq=1,keep=1);
10139: }
10140: }
10141: A=rint(deval(180*A/@pi))+90*(Sh-1);
10142: if(A>=180) A-=180;
10143: B=rint(deval(180*B/@pi));
10144: if(abs(Dvi)>=3){
10145: T="\\text{angle } ("+my_tex_form(A)+"^\\circ,"+my_tex_form(B)+"^\\circ)";
10146: if(Ratio!=1 || Ratio2!=1) T=T+"\\quad\\text{ratio }1:"
10147: +my_tex_form(sint(Ratio2,2))+":"+my_tex_form(sint(Ratio,2));
10148: if(Proc) L0=cons([5,[["eq",1]],T],L0);
10149: else dviout(T|eq=1,keep=1);
10150: }
10151: SS="% range "+rtostr([L[3][0],L[1][0]])+"x"+rtostr([L[3][1],L[1][1]])+
10152: " angle ("+ rtostr(A) +","+ rtostr(B)+") dev=";
10153: if(M1==M2) SS=SS+rtostr(M1);
10154: else SS=SS+rtostr([M1,M2]);
10155: if(M3!=1) SS=SS+" acc="+rtostr(M3);
10156: if(type(Sc0)>=0) SS=SS+" scale="+rtostr(Sc0);
10157: if(Proc){
10158: S=cons([5,[],SS],S);
10159: for(;L0!=[];L0=cdr(L0)) S=cons(car(L0),S);
10160: return S;
10161: }
10162: if(Dvi>0){
10163: dviout(SS|keep=1);
10164: dviout(xyproc(S)|eq=8);
10165: }else Lout=[SS,S];
10166: }else{
10167: if(Dvi>0) dviout(xyproc(S));
10168: else Lout=[S];
10169: }
10170: if(getopt(trans)==1) return cons([CX*Sc,CY*Sc],Lout);
10171: if(Dvi<0) return Lout;
10172: }
10173:
1.4 ! takayama 10174: def fouriers(A,B,X)
1.3 takayama 10175: {
1.4 ! takayama 10176: if(A!=[]&&type(car(A))>1){
! 10177: for(C=[],I=A[1];I>=0;I--) C=cons(myfeval(car(A),I),C);
! 10178: A=C;
! 10179: }
! 10180: if(B!=[]&&type(car(B))>1){
! 10181: for(C=[],I=B[1];I>0;I--) C=cons(myfeval(car(B),I),C);
! 10182: B=C;
! 10183: }
! 10184: R=0;
! 10185: if(getopt(cpx)==1){
! 10186: if(type(X=eval(X))>1) return todf([os_md.fouriers,[["cpx",1]]],[[A],[B],[X]]);
! 10187: V=dexp(@i*X);
! 10188: for(C=A,P=1,I=0;C!=[];C=cdr(C),I++){
! 10189: R+=car(C)*P;
! 10190: P*=V;
! 10191: }
! 10192: V=dexp(-@i*X);
! 10193: for(C=B,P=1,I=0;C!=[];C=cdr(C),I++){
! 10194: P*=V;
! 10195: R+=car(C)*P;
! 10196: }
! 10197: return R;
! 10198: }
! 10199: if(type(X=eval(X))>1) return todf(os_md.fouriers,[[A],[B],[X]]);
! 10200: for(C=A,I=0;C!=[];C=cdr(C),I++)
! 10201: R+=car(C)*mycos(I*X);
! 10202: for(C=B,I=1;C!=[];C=cdr(C),I++)
! 10203: R+=car(C)*mysin(I*X);
! 10204: return R;
! 10205: }
! 10206:
! 10207:
! 10208: def myexp(Z)
! 10209: {
! 10210: if(type(Z=eval(Z))>1) return todf(os_md.myexp,[Z]);
1.3 takayama 10211: if((Im=imag(Z))==0) return dexp(Z);
10212: return dexp(real(Z))*(dcos(Im)+@i*dsin(Im));
10213: }
10214:
10215: def mycos(Z)
10216: {
1.4 ! takayama 10217: if(type(Z=eval(Z))>1) return todf(os_md.mycos,[Z]);
1.3 takayama 10218: if((Im=imag(Z))==0) return dcos(Z);
10219: V=myexp(Z*@i);
10220: return (V+1/V)/2;
10221: }
10222:
10223: def mysin(Z)
10224: {
1.4 ! takayama 10225: if(type(Z=eval(Z))>1) return todf(os_md.mysin,[Z]);
1.3 takayama 10226: if((Im=imag(Z))==0) return dsin(Z);
10227: V=myexp(Z*@i);
10228: return (1/V-V)*@i/2;
10229: }
10230:
10231: def mytan(Z)
10232: {
1.4 ! takayama 10233: if(type(Z=eval(Z))>1) return todf(os_md.mytan,[Z]);
1.3 takayama 10234: if((Im=imag(Z))==0) return dsin(Z);
10235: V=myexp(2*Z*@i);
10236: return @i*(1-V)/(1+V);
10237: }
10238:
10239: def mylog(Z)
10240: {
1.4 ! takayama 10241: if(type(Z=eval(Z))>1) return todf(os_md.mylog,[Z]);
1.3 takayama 10242: if((Im=imag(Z))==0) return dlog(Z);
10243: return dlog(dabs(Z))+@i*myarg(Z);
10244: }
10245:
1.4 ! takayama 10246: def mypow(Z,R)
! 10247: {
! 10248: if(type(Z=eval(Z))>1||type(R=eval(R))>1) return todf(os_md.mypow,[Z,R]);
! 10249: if(Z==0) return 0;
! 10250: if(isint(2*R)){
! 10251: if(R==0) return 1;
! 10252: if(isint(R)) return Z^R;
! 10253: V=dsqrt(Z);
! 10254: if(R==1/2) return V;
! 10255: return Z^(R-1/2)*V;
! 10256: }
! 10257: return myexp(R*mylog(Z));
! 10258: }
! 10259:
1.3 takayama 10260: def myarg(Z)
10261: {
1.4 ! takayama 10262: if(type(Z=map(eval,Z))==4){
! 10263: if(length(Z)!=2) return todf(os_md.myarg,[Z]);
1.3 takayama 10264: Re=Z[0];Im=Z[1];
1.4 ! takayama 10265: }else if(type(Z)>1){
! 10266: return todf(os_md.myarg,[Z]);
! 10267: }else {
1.3 takayama 10268: Im=imag(Z);Re=real(Z);
10269: }
10270: if(Re==0) return (Im<0)?-deval(@pi)/2:deval(@pi)/2;
10271: V=datan(Im/Re);
10272: if(Re>0) return V;
10273: return (V>0)?(V-deval(@pi)):(V+deval(@pi));
10274: }
10275:
10276: def myatan(Z)
10277: {
1.4 ! takayama 10278: if(type(Z=eval(Z))>1) return todf(os_md.myatan,[Z]);
1.3 takayama 10279: if((Im=imag(Z))==0) return datan(Z);
10280: mylog((1-Z*@i)/(1+Z*@i))*@i/2;
10281: }
10282:
10283: def myasin(Z)
10284: {
1.4 ! takayama 10285: if(type(Z=eval(Z))>1) return todf(os_md.myasin,[Z]);
1.3 takayama 10286: return deval(@pi/2)-myacos(Z);
10287: }
10288:
1.4 ! takayama 10289: def frac(X)
! 10290: {
! 10291: if(type(X=eval(X))>1) return todf(os_md.frac,[X]);
! 10292: return (ntype(X)==3)? pari(frac,X):(X-floor(X));
! 10293: }
! 10294:
1.3 takayama 10295: def myacos(Z)
10296: {
1.4 ! takayama 10297: if(type(Z=eval(Z))>1) return todf(os_md.myacos,[Z]);
1.3 takayama 10298: if(imag(Z)==0 && Z<=1 && Z>=-1) return dacos(Z);
10299: return mylog(Z-dsqrt(Z^2-1))*@i;
10300: }
10301:
1.4 ! takayama 10302: def arg(Z)
! 10303: {
! 10304: if(vars(Z=map(eval,Z))!=[]) return todf(os_md.arg,[Z]);
! 10305: return (type(Z)==4)?pari(arg,Z[0],Z[1]):arg(sqrt,Z);
! 10306: }
! 10307:
! 10308: def sqrt(Z){
! 10309: if(vars(Z=map(eval,Z))!=[]) return todf(os_md.sqrt,[Z]);
! 10310: R=(type(Z)==4)?Z[1]:Z;
! 10311: if(ntype(R)==0){
! 10312: if(R==0) return 0;
! 10313: if(R>0){
! 10314: if(pari(issquare,R)) return pari(isqrt,nm(R))/pari(isqrt,dn(R));
! 10315: }else{
! 10316: R=-R;
! 10317: if(pari(issquare,R)) return pari(isqrt,nm(R))/pari(isqrt,dn(R))*@i;
! 10318: }
! 10319: }
! 10320: return (type(Z)==4)?pari(sqrt,Z[0],Z[1]):pari(sqrt,Z);
! 10321: }
! 10322:
1.3 takayama 10323: def gamma(Z)
10324: {
1.4 ! takayama 10325: if(vars(Z=map(eval,Z))!=[]) return todf(os_md.gamma,[Z]);
! 10326: return (type(Z)==4)?pari(gamma,Z[0],Z[1]):pari(gamma,Z);
1.3 takayama 10327: }
10328:
10329: def lngamma(Z)
10330: {
1.4 ! takayama 10331: if(vars(Z=map(eval,Z))!=[]) return todf(os_md.lngamma,[Z]);
! 10332: return (type(Z)==4)?pari(lngamma,Z[0],Z[1]):pari(lngamma,Z);
1.3 takayama 10333: }
10334:
10335: def digamma(Z)
10336: {
1.4 ! takayama 10337: if(vars(Z=map(eval,Z))!=[]) return todf(os_md.digamma,[Z]);
! 10338: return (type(Z)==4)?pari(digamma,Z[0],Z[1]):pari(digamma,Z);
1.3 takayama 10339: }
10340:
10341: def dilog(Z)
10342: {
1.4 ! takayama 10343: if(vars(Z=map(eval,Z))!=[]) return todf(os_md.dilog,[Z]);
! 10344: return (type(Z)==4)?pari(dilog,Z[0],Z[1]):pari(dilog,Z);
1.3 takayama 10345: }
10346:
10347: def erfc(Z)
10348: {
1.4 ! takayama 10349: if(vars(Z=map(eval,Z))!=[]) return todf(os_md.erfc,[Z]);
! 10350: return (type(Z)==4)?pari(erfc,Z[0],Z[1]):pari(erfc,Z);
1.3 takayama 10351: }
10352:
10353: def zeta(Z)
10354: {
1.4 ! takayama 10355: if(vars(Z=map(eval,Z))!=[]) return todf(os_md.zeta,[Z]);
! 10356: return (type(Z)==4)?pari(zeta,Z[0],Z[1]):pari(zeta,Z);
1.3 takayama 10357: }
10358:
10359: def eta(Z)
10360: {
1.4 ! takayama 10361: if(vars(Z=map(eval,Z))!=[]) return todf(os_md.eta,[Z]);
! 10362: return (type(Z)==4)?pari(eta,Z[0],Z[1]):pari(eta,Z);
1.3 takayama 10363: }
10364:
10365: def jell(Z)
10366: {
1.4 ! takayama 10367: if(vars(Z=map(eval,V))>1) return todf(os_md.jell,[Z]);
! 10368: return (type(Z)==4)?pari(jell,Z[0],Z[1]):jell(jell,Z);
1.3 takayama 10369: }
10370:
10371: def evals(F)
10372: {
10373: if(type(F)==7){
10374: if(type(Del=getopt(del))!= 7) return eval_str(F);
10375: S=strtoascii(Del);K=length(S);
10376: if(K==0) return [eval_str(F)];
10377: Raw=getopt(raw);
10378: F=strtoascii(F);L=[];T1=0;
10379: do{
10380: T2=str_str(F,S|top=T1);
10381: if(T2<0) T2=10000;
10382: FT=str_cut(F,T1,T2-1);
10383: L=cons((Raw==1)?FT:evals(FT),L);
10384: T1=T2+K;
10385: }while(T2!=10000);
10386: return reverse(L);
10387: }
10388: if(type(F)==4){
10389: if(type(S=car(F))==7){
10390: S+="(";
10391: for(I=0,FT=cdr(F); FT!=[]; I++,FT=cdr(FT)){
10392: if(type(ST=car(FT))!=7) ST=rtostr(ST);
10393: if(I>0) S=S+","+ST;
10394: else S=S+ST;
10395: }
10396: S=S+")";
10397: return eval_str(S);
10398: }else return call(S,cdr(F));
10399: }
10400: return F;
10401: }
10402:
1.4 ! takayama 10403: def myval(F)
! 10404: {
! 10405: if(type(F)!=4){
! 10406: F=f2df(sqrt2rat(F));
! 10407: if(type(F)!=4) return F;
! 10408: };
! 10409: if(length(F)==1) V=car(F);
! 10410: else for(V=car(F),F=cdr(F); F!=[];){
! 10411: FT=car(F);
! 10412: if(type(G=FT[1])==2){
! 10413: if(length(FT)>2){
! 10414: FT2=myval(FT[2]);
! 10415: if(length(FT)>3) FT3=myval(FT[3]);
! 10416: };
! 10417: X=red(FT2/@pi);Vi=-red(FT2*@i/@pi);W=red(FT2/@e);
! 10418: if(G==os_md.mypow && FT3==1/2){
! 10419: G=os_md.sqrt;
! 10420: FT=[FT[0],G,FT[2]];
! 10421: }
! 10422: if((T=findin(G,
! 10423: [sin,os_md.mysin,cos,os_md.mycos,tan,os_md.mytan]))>=0
! 10424: &&(isint(6*X)||isint(4*X))){
! 10425: if(T==2||T==3){
! 10426: T=0;X=1/2-X;
! 10427: }
! 10428: X=X-floor(X/2)*2;
! 10429: if(T==0||T==1){
! 10430: if(X>1){
! 10431: S=-1;X-=1;
! 10432: }else S=1;
! 10433: if(X>1/2) X=1-X;
! 10434: if(X==0) R=0;
! 10435: else if(X==1/6) R=1/2;
! 10436: else if(X==1/4) R=2^(1/2)/2;
! 10437: else if(X==1/3) R=3^(1/2)/2;
! 10438: else R=1;
! 10439: R*=S;
! 10440: }else{
! 10441: if(X>1) X-=1;
! 10442: if(X>1/2){
! 10443: S=-1;V=1-X;
! 10444: }else S=1;
! 10445: if(X==0) R=0;
! 10446: else if(X==1/6) R=3^(1/2)/3;
! 10447: else if(X==1/4) R=1;
! 10448: else if(X==1/3) R=3^(1/2);
! 10449: else R=2^512;
! 10450: R*=S;
! 10451: }
! 10452: }else if((G==exp||G==os_md.myexp)&&(isint(FT2)||isint(6*Vi)||isint(4*Vi))){
! 10453: if(isint(FT2)) R=@e^FT2;
! 10454: else R=myval([z+w*@i,[z,cos,Vi*@pi],[w,sin,Vi*@pi]]);
! 10455: }else if((G==pow||G==os_md.mypow) && (isint(FT3)||FT2==1||FT2==0)){
! 10456: if(FT2==0) R=0;
! 10457: else if(FT2==1) R=1;
! 10458: else R=FT2^FT3;
! 10459: }else if(G==os_md.abs&&ntype(P=eval(FT2))<4){
! 10460: R=FT2;
! 10461: if(P<0) R=-R;
! 10462: }else if((G==os_md.sqrt||G==dsqrt)&&type(FT2)<2&&ntype(FT2)==0)
! 10463: R=sqrtrat(FT2);
! 10464: else if((G==os_md.mylog||G==dlog)&&(FT2==@e||FT2==1))
! 10465: R=(FT2==1)?0:1;
! 10466: else if(length(FT)==3) R=eval((*G)(myeval(FT2)));
! 10467: #ifdef USEMODULE
! 10468: else R=call(G,map(os_md.myeval,cdr(cdr(FT))));
! 10469: #else
! 10470: else R=call(G,map(myeval,cdr(cdr(FT))));
! 10471: #endif
! 10472: }
! 10473: else if(G==0) R=FT[2];
! 10474: #ifdef USEMODULE
! 10475: else R=eval(call(G[0],map(os_md.myeval,cdr(cdr(FT)))|option_list=G[1]));
! 10476: #else
! 10477: else R=eval(call(G[0],map(myeval,cdr(cdr(FT)))|option_list=G[1]));
! 10478: #endif
! 10479: V=mysubst(V,[FT[0],R]);
! 10480: F=mysubst(cdr(F),[FT[0],R]);
! 10481: }
! 10482: if(type(V)<4 && !iscoef(V,os_md.iscrat)) V=eval(V);
! 10483: #if 0
! 10484: return (type(V)<4)?myeval(V):mtransbys(os_md.myeval,V,[]);
! 10485: #else
! 10486: return V;
! 10487: #endif
! 10488: }
! 10489:
! 10490: /* -1:空 0:整数 1:有理数 2:Gauss整数 3:Gauss有理数 4:それ以外の複素数 */
! 10491: /* def vntype(F)
! 10492: {
! 10493: if((T=type(F))<2){
! 10494: if(T<0) return -1;
! 10495: if((Tn=ntype(F))==0){
! 10496: return (isint(F))?0:1;
! 10497: }
! 10498: if(Tn==4){
! 10499: if(ntype(real(F))==0&&ntype(real(F))==0)
! 10500: return (isint(F)&&isint(F))?2:3;
! 10501: return 4;
! 10502: }
! 10503: }
! 10504: if(T==2){
! 10505: V=vars(F);
! 10506: if((VV=lsort(V,[@e,@pi],1))==[]){
! 10507: FT=mycoef(
! 10508: }else{
! 10509: if(length(VV)==1){
! 10510: }else
! 10511: }
! 10512: }else if(T==3){
! 10513:
! 10514: }
! 10515: }
! 10516: */
! 10517:
! 10518:
1.3 takayama 10519: def myeval(F)
10520: {
10521: if(type(F)!=4) V=F;
1.4 ! takayama 10522: else if(length(F)==1) V=car(F);
1.3 takayama 10523: else for(V=car(F),F=cdr(F); F!=[];){
10524: FT=car(F);
10525: if(type(G=FT[1])==2){
10526: if(length(FT)==3) R=(*G)(myeval(FT[2]));
10527: #ifdef USEMODULE
10528: else R=call(G,map(os_md.myeval,cdr(cdr(FT))));
10529: #else
10530: else R=call(G,map(myeval,cdr(cdr(FT))));
10531: #endif
10532: }
10533: else if(G==0) R=myeval(FT[2]);
10534: #ifdef USEMODULE
10535: else R=call(G[0],map(os_md.myeval,cdr(cdr(FT)))|option_list=G[1]);
10536: #else
10537: else R=call(G[0],map(myeval,cdr(cdr(FT)))|option_list=G[1]);
10538: #endif
1.4 ! takayama 10539: V=mysubst(V,[FT[0],R]);
! 10540: F=mysubst(cdr(F),[FT[0],R]);
1.3 takayama 10541: }
1.4 ! takayama 10542: return (type(V)<4)?eval(V):mtransbys(eval,V,[]);
1.3 takayama 10543: }
10544:
10545: def mydeval(F)
10546: {
10547: if(type(F)!=4) V=F;
1.4 ! takayama 10548: else if(length(F)==1) V=car(F);
1.3 takayama 10549: else for(V=car(F),F=cdr(F); F!=[]; ){
10550: FT=car(F);
10551: if(type(G=FT[1])==2){
10552: if(length(FT)==3) R=(*G)(myeval(FT[2]));
10553: #ifdef USEMODULE
10554: else R=call(G,map(os_md.mydeval,cdr(cdr(FT))));
10555: #else
10556: else R=call(G,map(mydeval,cdr(cdr(FT))));
10557: #endif
10558: }
10559: else if(G==0) R=mydeval(FT[2]);
10560: #ifdef USEMODULE
10561: else R=call(G[0],map(os_md.mydeval,cdr(cdr(FT)))|option_list=G[1]);
10562: #else
10563: else R=call(G[0],map(mydeval,cdr(cdr(FT)))|option_list=G[1]);
10564: #endif
1.4 ! takayama 10565: V=mysubst(V,[FT[0],R]);
! 10566: F=mysubst(cdr(F),[FT[0],R]);
1.3 takayama 10567: }
1.4 ! takayama 10568: return (type(V)<4)?deval(V):mtransbys(deval,V,[]);
1.3 takayama 10569: }
10570:
10571: def myfeval(F,X)
10572: {
1.4 ! takayama 10573: if(type(X)==4){
! 10574: if(isvar(X[0])&&length(X)==2)
! 10575: return mydeval(mysubst(F,[X[0],X[1]]));
! 10576: if(type(X[0])==4&&isvar(X[0][0])&&length(X[0])==2){
! 10577: for(Y=X;Y!=[];Y=cdr(Y))
! 10578: F=mysubst(F,[car(Y)[0],car(Y)[1]]);
! 10579: return myeval(F);
! 10580: }
! 10581: }
! 10582: return myeval(mysubst(F,[x,X]));
1.3 takayama 10583: }
10584:
10585: def myf2eval(F,X,Y)
10586: {
1.4 ! takayama 10587: return myeval(mysubst(F,[[x,X],[y,Y]]));
1.3 takayama 10588: }
10589:
10590: def myf3eval(F,X,Y,Z)
10591: {
1.4 ! takayama 10592: return myeval(mysubst(F,[[x,X],[y,Y],[z,Z]]));
1.3 takayama 10593: }
10594:
10595: def myfdeval(F,X)
10596: {
1.4 ! takayama 10597: if(type(X)==4){
! 10598: if(isvar(X[0])&&length(X)==2)
! 10599: return mydeval(mysubst(F,[X[0],X[1]]));
! 10600: if(type(X[0])==4&&isvar(X[0][0])&&length(X[0])==2){
! 10601: for(Y=X;Y!=[];Y=cdr(Y))
! 10602: F=mysubst(F,[car(Y)[0],car(Y)[1]]);
! 10603: return mydeval(F);
! 10604: }
! 10605: }
! 10606: return mydeval(mysubst(F,[x,X]));
1.3 takayama 10607: }
10608:
10609: def myf2deval(F,X,Y)
10610: {
1.4 ! takayama 10611: return mydeval(mysubst(F,[[x,X],[y,Y]]));
1.3 takayama 10612: }
10613:
10614: def myf3deval(F,X,Y,Z)
10615: {
1.4 ! takayama 10616: return mydeval(mysubst(F,[[x,X],[y,Y],[z,Z]]));
! 10617: }
! 10618:
! 10619: def df2big(F)
! 10620: {
! 10621: AG=[[os_md.mysin,sin],[os_md.mycos,cos],[os_md.mytan,tan],[os_md.myasin,asin],
! 10622: [os_md.acos,acos],[os_md,atan,atan],[os_md.myexp,exp],[os_md.mylog,log],[os_md.mypow,pow]];
! 10623: if(getopt(inv)!=1) return mysubst(F,AG);
! 10624: else return mysubst(F,AG|inv=1);
! 10625:
1.3 takayama 10626: }
10627:
10628: def f2df(F)
10629: {
10630: if(type(Opt=getopt(opt))!=1) Opt=0;
10631: if(iand(Opt,1)){
10632: if(Opt>0) F=map(eval,F);
10633: else F=map(deval,F);
10634: }
10635: Cpx=getopt(cpx);
10636: if(type(F)==4 && iand(Opt,2)==0) return F;
10637: K=getopt(level);
10638: if(type(K)!=1) K=0;
10639: AG=[sin,cos,tan,asin,acos,atan,exp,sinh,cosh,tanh,log,pow];
1.4 ! takayama 10640: AGd=[os_md.mysin,os_md.mycos,os_md.mytan,os_md.myasin,os_md.myacos,
1.3 takayama 10641: os_md.myatan,os_md.myexp,os_md.myexp,os_md.myexp,os_md.myexp,
1.4 ! takayama 10642: os_md.mylog,os_md.sqrt,os_md.myexp];
1.3 takayama 10643: for(R=[],I=0,Arg=vars(F);Arg!=[];Arg=cdr(Arg)){
10644: Fn=functor(car(Arg));
10645: if(vtype(Fn)!=3) continue;
10646: V=args(car(Arg));
10647: for(PAG=AG,PAGd=AGd;PAG!=[];PAG=cdr(PAG),PAGd=cdr(PAGd)){
10648: if(Fn==car(PAG)){
10649: if(K==0) L="z__";
10650: else L="z"+rtostr(K)+"__";
10651: if(I==0) VC=makev([L]);
10652: else VC=makev([L,I]);
10653: I++;
10654: VC0=VC;
10655: if(Fn==sinh || Fn==cosh || Fn==tanh){
10656: VC=makev([L,I++]);
10657: if(Fn==sinh)
10658: R=cons([VC0,0,(VC^2-1)/(2*VC)],R);
10659: else if(Fn==cosh)
10660: R=cons([VC0,0,(VC^2+1)/(2*VC)],R);
10661: else
10662: R=cons([VC0,0,(VC^2-1)/(VC^2+1)],R);
10663: }
10664: if(Fn==pow && (V[1]!=1/2||Cpx==1)){
1.4 ! takayama 10665: #if 0
1.3 takayama 10666: R0=f2df(V[1]*((type(V[0])==1)?dlog(V[0]):log(V[0]))|level=K+1);
10667: PAGd=cdr(PAGd);
1.4 ! takayama 10668: #else
! 10669: R=cons([VC,os_md.mypow,V[0],V[1]],R);
! 10670: F=mysubst(F,[car(Arg),VC0]);
! 10671: Arg=cons(0,vars(F));
! 10672: break;
! 10673: #endif
1.3 takayama 10674: }else R0=f2df(V[0]|level=K+1);
10675: R=cons([VC,car(PAGd),R0],R);
1.4 ! takayama 10676: F=mysubst(F,[car(Arg),VC0]);
1.3 takayama 10677: Arg=cons(0,vars(F));
10678: break;
10679: }
10680: }
10681: }
10682: if(R==[]) return F;
10683: if(Cpx==1){
10684: for(PAG=P,PAGd=AGd;PAG!=[];PAG=cdr(PAG),PAGd=cdr(PAGd))
1.4 ! takayama 10685: R=mysubst(R,[car(PADd),car(PAG)]);
1.3 takayama 10686: }
10687: return cons(F,reverse(R));
10688: }
10689:
1.4 ! takayama 10690: def todf(F,V)
! 10691: {
! 10692: if(type(V)!=4) V=[V];
! 10693: for(R=[];V!=[];V=cdr(V)){
! 10694: R=cons(f2df(car(V)),R);
! 10695: }
! 10696: V=reverse(R);
! 10697: Z=makenewv([F,V]);
! 10698: return [Z,cons(Z,cons(F,V))];
! 10699: }
! 10700:
1.3 takayama 10701: def compdf(F,V,G)
10702: {
10703: FL=["abs","floor","rint","zeta","gamma","arg","real","imag","conj"];
10704: FS=[os_md.abs,floor,rint,os_md.zeta,os_md.gamma,os_md.myarg,real,imag,conj];
10705: if(type(V)==4){
10706: for(;V!=[];V=cdr(V),G=cdr(G)) F=compdf(F,car(V),car(G));
10707: return F;
10708: }
10709: if(type(F)==7){
10710: if(str_str(F,"|")==0){
10711: F="abs("+str_cut(F,1,str_len(F)-2)+")";
10712: }else if(str_str(F,"[")==0){
10713: F="floor("+str_cut(F,1,str_len(F)-2)+")";
10714: }
10715: I=str_str(F,"(");
10716: Var=x;
10717: if(I>0){
10718: J=str_pair(F,I+1,"(",")");
10719: if(J<0) return 0;
10720: Var=eval_str(str_cut(F,I+1,J-1));
10721: Var=f2df(Var);
10722: F0=str_cut(F,0,I-1);
10723: }
10724: if((I=findin(F0,FL))<0&&(I=findin(F,FL))<0) F=f2df(eval_str(F));
10725: else F=[z__,[z__,FS[I],Var]];
10726: }
10727: if(type(F)!=4) F=f2df(F);
10728: if(type(G)!=4) G=f2df(G);
10729: VF=vars(F);VG=vars(G);
10730: for(E=I=0;I<30;I++){
10731: for(J=0;J<30;J++){
10732: X=makev(["z__",I,J]);
10733: if(findin(X,VF)<0 && findin(X,VG)<0){
10734: E=1;break;
10735: }
10736: }
10737: if(E) break;
10738: }
10739: if(!E) return 0;
10740: if(V==G) return F; /* subst(F(V),V,G) */
1.4 ! takayama 10741: if(type(G)<4) return mysubst(F,[V,G]);
1.3 takayama 10742: if(type(F)<4) F=[F]; /* return compdf([X,[X,0,F]],V,G); */
1.4 ! takayama 10743: F=mysubst(F,[V,X]);
! 10744: if(isvar(G[0])){
! 10745: G=mysubst(G,[G[0],X]);
! 10746: if(length(G)==2&&type(G[1])==4&&G[1][0]==X) G=G[1];
! 10747: G=cons(G,cdr(F));
! 10748: }
! 10749: else G=cons([X,0,G],cdr(F));
1.3 takayama 10750: return cons(car(F),G);
10751: }
10752:
10753: def fzero(F,LX)
10754: {
1.4 ! takayama 10755: if(length(LX)==3){
! 10756: V=LX[0];LX=cdr(LX);
! 10757: }else V=x;
! 10758: LX1=eval(LX[0]);LX2=eval(LX[1]);
1.3 takayama 10759: if(getopt(zero)==1){
10760: if(getopt(cont)==1) CT=1;
10761: else CT=0;
10762: if(getopt(trans)!=1 && type(F)<4) F=f2df(F);
1.4 ! takayama 10763: F=mysubst(F,[[@pi,deval(@pi)],[@e,deval(@e)]]);
1.3 takayama 10764: if(type(Dev=getopt(dev))!=1 || Dev<2) Dev=16;
1.4 ! takayama 10765: V1=myeval(mysubst(F,[V,X1=LX1]));
! 10766: V2=myeval(mysubst(F,[V,X2=LX2]));
1.3 takayama 10767: if(V1>0){
10768: V0=V1;V1=V2;V2=V0;
10769: X0=X1;X1=X2;X2=X0;
10770: }
10771: if(V1<0 && V2>0){
10772: D=(V2-V1)*1024;
10773: for(I=0; I<Dev; I++){
10774: /* mycat([D,X1,V1,X2,V2]) ; */
10775: if(iand(I,1)) X0=(X1+X2)/2;
10776: else X0=(V2*X1-V1*X2)/(V2-V1);
1.4 ! takayama 10777: V0=myeval(mysubst(F,[V,X0]));
1.3 takayama 10778: if(V0==0||V0==V1||V0==V2) return [X0,V0];
10779: if(V0<0){
10780: if(!CT && V0+D<0) return [];
10781: V1=V0;X1=X0;
10782: }else{
10783: if(!CT && V0>D) return [];
10784: V2=V0;X2=X0;
10785: }
10786: }
10787: X0=(V2*X1-V1*X2)/(V2-V1);
1.4 ! takayama 10788: return [X0,myeval(mysubst(F,[V,X0]))];
1.3 takayama 10789: }
10790: if(V0==0) return [X0,V0];
10791: if(V1==0) return [X1,V1];
10792: return [];
10793: }
10794: if(type(F)<4) F=f2df(F);
1.4 ! takayama 10795: F=mysubst(F,[[@pi,deval(@pi)],[@e,deval(@e)]]);
1.3 takayama 10796: L=[];
10797: if(type(F)<4){
10798: if(type(F)==3) F=nm(red(F));
1.4 ! takayama 10799: if((Deg=deg(F,V))<=2){
1.3 takayama 10800: if(Deg==2){
1.4 ! takayama 10801: D=(C1=coef(F,1,V))^2-4*(C2=coef(F,2,V))*coef(F,0,V);
1.3 takayama 10802: if(D>=0){
10803: R=dsqrt(D);
1.4 ! takayama 10804: if((S=(-C1+R)/(2*C2))>=LX1&&S<=LX2) L=[[S,mysubst(F,[V,S])]];
! 10805: if(D!=0 && (S=(-C1-R)/(2*C2))>=LX1&&S<=LX2) L=cons([S,mysubst(F,[V,S])],L);
1.3 takayama 10806: }
1.4 ! takayama 10807: L=qsort(L);
! 10808: }else if(Deg==1&&(S=-coef(F,0,V)/coef(F,1,V))>=LX1&&S<=LX2)
! 10809: L=[[S,mysubst(F,[V,S])]];
1.3 takayama 10810: return L;
10811: }
10812: for(L=[];S!=[];S=cdr(S))
1.4 ! takayama 10813: if(car(S)>=LX1&&car(S)<=LX2) L=cons([car(S),mysubst(F,[V,car(S)])],L);
1.3 takayama 10814: return qsort(L);
10815: }
10816: if(type(Div=getopt(mesh))!=1 || Div<=0)
10817: Div = 2^(10);
10818: W=(LX2-LX1)/Div;
10819: for(I=V2=0;I<=Div;I++){
10820: X1=X2;X2=LX1+I*W;V1=V2;
1.4 ! takayama 10821: if((V2=myeval(mysubst(F,[V,X2])))==0)
1.3 takayama 10822: L=cons([X2,V2],L);
10823: if(V1*V2<0){
1.4 ! takayama 10824: L0=fzero(F,[V,X1,X2]|zero=1,trans=1);
1.3 takayama 10825: if(L0!=[]) L=cons(L0,L);
10826: }
10827: }
10828: return reverse(L);
10829: }
10830:
10831: def fmmx(F,LX)
10832: {
1.4 ! takayama 10833: if(length(LX)==3){
! 10834: V=LX[0];LX=cdr(LX);
! 10835: }else V=x;
! 10836: LX1=eval(LX[0]);LX2=eval(LX[1]);
! 10837: FT=F;
! 10838: if(getopt(trans)!=1 && type(F)<4) FT=f2df(FT);
! 10839: FT=mysubst(FT,[[@pi,eval(@pi)],[@e,eval(@e)]]);
1.3 takayama 10840: if(type(G=getopt(dif))>=1){
1.4 ! takayama 10841: if(G==1) G=os_md.mydiff(F,V);
! 10842: L=fzero(G,[V,LX1,LX2]|option_list=getopt());
! 10843: R=[[LX1,myeval(mysubst(FT,[V,LX1]))]];
1.3 takayama 10844: for(I=0;L!=[];L=cdr(L),I++){
10845: X=car(L)[0];
10846: if(X==LX1) continue;
1.4 ! takayama 10847: R=cons([X,myeval(mysubst(FT,[V,X]))],R);
! 10848: }
! 10849: if(X!=LX2) R=cons([LX2,myeval(mysubst(FT,[V,LX2]))],R);
! 10850: if(getopt(mmx)!=1) return reverse(R);
! 10851: for(Mi=Ma=car(R);R!=[];R=cdr(R)){
! 10852: if(car(R)[1]>Ma[1]) Ma=car(R);
! 10853: else if(car(R)[1]<Mi[1]) Mi=car(R);
1.3 takayama 10854: }
1.4 ! takayama 10855: return [Mi,Ma];
1.3 takayama 10856: }
10857: if(type(Div=getopt(mesh))!=1 || Div<=0)
10858: Div = 2^(10);
10859: if(type(Dev=getopt(dev))!=1 || Dev<2) Dev=16;
10860: W=(LX2-LX1)/Div;
10861: for(I=V2=V3=0;I<=Div;I++){
10862: X1=X2;X2=X3;X3=LX1+I*W;V1=V2;V2=V3;
1.4 ! takayama 10863: V3=myeval(mysubst(FT,[V,X3]));
1.3 takayama 10864: if(I==0) L=[[X3,V3]];
10865: if(I<2) continue;
10866: /* mycat([X1,X2,X3,V1,V2,V3]); */
10867: if((V1-V2)*(V2-V3)<0){
10868: X02=X2;V02=V2;X03=X3;V03=V3;
10869: for(J=0; J<Dev && X1!=X3; J++){
10870: /* mycat([J,X1,X2,X3,V1,V2,V3,V1-V2,V2-V3]); */
1.4 ! takayama 10871: X12=(X1+X2)/2;V12=myeval(mysubst(FT,[V,X12]));
1.3 takayama 10872: if((V1-V12)*(V12-V2)<=0){
10873: X3=X2;V3=V2;X2=X12;V2=V12;continue;
10874: }
1.4 ! takayama 10875: X23=(X2+X3)/2;V23=myeval(mysubst(FT,[V,X23]));
1.3 takayama 10876: if((V12-V2)*(V2-V23)<=0){
10877: X1=X12;V1=V12;X3=X23;V3=V23;continue;
10878: }
10879: if((V2-V23)*(V23-V3)<=0){
10880: X1=X2;V1=V2;X2=X23;V2=V23;continue;
10881: }
10882: }
10883: L=cons([X2,V2],L);
10884: X2=X02;V2=V02;X3=X03;V3=V03;
10885: }
10886: }
1.4 ! takayama 10887: L=cons([LX2,myeval(mysubst(FT,[V,LX2]))],L);
! 10888: if(getopt(mmx)!=1) return L;
! 10889: for(Mi=Ma=car(L);L!=[];L=cdr(L)){
! 10890: if(car(L)[1]>Ma[1]) Ma=car(L);
! 10891: else if(car(L)[1]<Mi[1]) Mi=car(L);
! 10892: }
! 10893: return [Mi,Ma];
! 10894: }
! 10895:
! 10896: def flim(F,L)
! 10897: {
! 10898: FD=f2df(F);
! 10899: Lim0=4;Lim=12;FS=1;
! 10900: if(type(Pc=getopt(prec))==1){
! 10901: if((Pc>1&&Pc<31)||Pc>-5) Lim+=Pc;
! 10902: }
! 10903: if(type(Pc=getopt(init))==1 && Pc>0) FS*=Pc;
! 10904: if(type(L)==7) L=[L];
! 10905: else if(type(L)<2){
! 10906: K=flim(F,["+",L]|option_list=getopt());
! 10907: if(K=="") return K;
! 10908: K1=flim(F,["-",L]|option_list=getopt());
! 10909: if(K1=="") return K1;
! 10910: if(type(K)==7||type(K1)==7){
! 10911: if(K!=K1) return "";
! 10912: return K;
! 10913: }
! 10914: if(abs(K)<10^(-5)){
! 10915: if(abs(K1)<10^(-5)) return (K1+K)/2;
! 10916: else return "";
! 10917: }
! 10918: if(abs((K1-K)/K)<10^(-4)) return (K1+K)/2;
! 10919: return "";
! 10920: }
! 10921: if(type(L)!=4||type(L[0])!=7) return "";
! 10922: if(L[0]=="-"){
! 10923: FS=-FS;
! 10924: }else if(L[0]!="+") return "";
! 10925: FI=(length(L)==1)?1:0;
! 10926: for(Inf=0,I=Lim0;I<Lim;I++){
! 10927: D1=FS*8^I;D2=8*D1;
! 10928: if(FI==0){
! 10929: D1=1/D1;D2=1/D2;
! 10930: }
! 10931: if(D1>D2){
! 10932: D=D1;D1=D2;D1=D;
! 10933: X1=D1;X2=D2;
! 10934: }
! 10935: if(FI==0){
! 10936: D1+=L[1];D2+=L[1];
! 10937: }
! 10938: K=fmmx(FD,[D1,D2]|mmx=1,mesh=16,dev=4);
! 10939: /* mycat([FD,DF,K,Inf]); */
! 10940: if(I>Lim0){
! 10941: if(DF<K[1][1]-K[0][1]){
! 10942: if(I>Lim0+1){
! 10943: if(Inf==0) return "";
! 10944: }else Inf=1;
! 10945: }else if(Inf==1) return "";
! 10946: }
! 10947: DF=K[1][1]-K[0][1];
! 10948: }
! 10949: if(Inf==1){
! 10950: if(K[0][1]>10^8) return "+";
! 10951: else if(K[1][1]<-10^8) return "-";
! 10952: return "";
! 10953: }
! 10954: V=(myfeval(FD,D1)+1.0)-1.0;
! 10955: if(V!=0 && abs(V)<10^(-9)) return 0;
! 10956: return V;
1.3 takayama 10957: }
10958:
10959: def fcont(F,LX)
10960: {
1.4 ! takayama 10961: if(length(LX)==3){
! 10962: V=LX[0];LX=cdr(LX);
! 10963: }else V=x;
! 10964: LX1=eval(LX[0]);LX2=eval(LX[1]);
1.3 takayama 10965: if(getopt(trans)!=1 && type(F)<4) FT=f2df(F);
10966: if(type(Div=getopt(mesh))!=1 || Div<=0)
10967: Div = 2^(10);
10968: if(type(Dev=getopt(dev))!=1 || Dev<2) Dev=16;
10969: W=(LX2-LX1)/Div;
10970: if((Df=getopt(dif))!=1){
10971: Df=0;
10972: }else{
10973: if(Dev==16) Dev=6;
10974: WD=W/2^(Dev+1);
10975: }
10976: F=FT;
10977: C=2;
10978: for(I=V2=V3=0;I<=Div;I++){
10979: X1=X2;X2=X3;X3=LX1+I*W;V1=V2;V2=V3;
1.4 ! takayama 10980: V3=myeval(mysubst(F,[V,X3]));
1.3 takayama 10981: if(Df){
10982: if(I==Div) break;
1.4 ! takayama 10983: V3=(myeval(mysubst(F,[V,X3+WD]))-V3)/WD;
1.3 takayama 10984: }
10985: if(I==0) L=[[X3,V3]];
10986: if(I<2) continue;
10987: /* mycat([X1,X2,X3,V1,V2,V3]); */
10988: if(C*dabs(2*V2-V1-V3) > dabs(V1-V3)){
10989: X01=X1;V01=V1;X02=X2;V02=V2;X03=X3;V03=V3;
10990: for(J=0; X01!=X03; J++){
10991: /* mycat([J,X01,X02,X03,V01,V02,V03,V01-V02,V02-V03]); */
10992: if(dabs(V01-V02)>dabs(V02-V03)){
10993: X03=X02;V03=V02;
10994: }else{
10995: X01=X02;V01=V02;
10996: }
10997: if(J==Dev) break;
10998: X02=(X01+X02)/2;
1.4 ! takayama 10999: V02=myeval(mysubst(F,[V,X02]));
! 11000: if(Df) V02=(myeval(mysubst(F,[V,WD]))-V02)/WD;
1.3 takayama 11001: if(C*dabs(2*V02-V01-V03) < dabs(V01-V03)) break;
11002: }
11003: if(J==Dev||X01==X03) L=cons([X01,X03,V03-V01],L);
11004: }
11005: }
11006: return reverse(L);
11007: }
11008:
11009: def xygraph(F,N,LT,LX,LY)
11010: {
11011: if((Proc=getopt(proc))!=1&&Proc!=2&&Proc!=3) Proc=0;
11012: if(type(DV=getopt(dviout))==4){
11013: OL=delopt(getopt(),["dviout","shift","ext","cl"]);
11014: OL=cons(["proc",1],OL);
11015: R=xygraph(F,N,LT,LX,LY|option_list=OL);
11016: OL=delopt(getopt(),["shift","ext","cl"]|inv=1);
11017: return execdraw(R,DV|optilon_list=OL);
11018: }
11019: if(N==0) N=32;
11020: if(N<0){
11021: N=-N;
11022: N1=-1; N2=N+1;
11023: }else{
11024: N1=0; N2=N;
11025: }
11026: if(length(LT)==3 && isvar(LT[0])==1){
11027: TT=LT[0]; LT=cdr(LT);
1.4 ! takayama 11028: F=mysubst(F,[TT,x]);
! 11029: }
! 11030: if(LX==0) LX=LT;
! 11031: if((Acc=getopt(Acc))!=1) Acc=0;
! 11032: if(Acc){
! 11033: LX=[eval(LX[0]),eval(LX[1])];
! 11034: LY=[eval(LY[0]),eval(LY[1])];
! 11035: LT=[eval(LT[0]),eval(LT[1])];
! 11036: }else{
! 11037: LX=[deval(LX[0]),deval(LX[1])];
! 11038: LY=[deval(LY[0]),deval(LY[1])];
! 11039: LT=[deval(LT[0]),deval(LT[1])];
1.3 takayama 11040: }
11041: TD=(LT[1]-LT[0])/N;
11042: if(type(Mul=getopt(scale))!=1){
11043: if(type(Mul)==4){
11044: MulX=Mul[0]; MulY=Mul[1];
11045: }else MulX=MulY=1;
11046: }else MulX=MulY=Mul;
11047: if(type(Org=getopt(org))==4){
11048: Orgx=Org[0];Orgy=Org[1];
11049: }else Orgx=Orgy=0;
11050: if(type(F)!=4 || (getopt(para)!=1 && length(F)>1 && type(F[0])<4 && type(F[1])==4)) {
11051: if(getopt(rev)!=1){
11052: F1=x; /* LX[0]+(LX[1]-LX[0])*(x-LT[0])/(TD*N); */
11053: F2=F;
11054: }else{
11055: F1=F;
11056: F2=x; /* LY[0]+(LY[1]-LY[0])*(x-LT[0])/(TD*N); */
11057: }
11058: }else{
11059: F1=F[0]; F2=F[1];
11060: }
11061: if(F1==0 || F2==0) LT=[];
11062: if(length(LT)==2){
1.4 ! takayama 11063: if(Acc){
! 11064: for(LTT=[],I=N2;I>=N1;I--)
! 11065: LTT=cons(eval(LT[0]+I*(LT[1]-LT[0])/N),LTT);
! 11066: }else{
! 11067: for(LTT=[],I=N2;I>=N1;I--)
! 11068: LTT=cons(deval(LT[0]+I*(LT[1]-LT[0])/N),LTT);
! 11069: }
1.3 takayama 11070: LT=LTT;
11071: }
11072: Cpx=getopt(cpx);
11073: if(Cpx!=1 && (str_str(rtostr(F1),"@i")>=0 || str_str(rtostr(F2),"@i")>=0))
11074: Cpx=1;
11075: if(type(Cpx)<0) Cpx=0;
1.4 ! takayama 11076: if(!Acc){
! 11077: if(type(F1)<4) F1=f2df(F1);
! 11078: if(type(F2)<4) F2=f2df(F2);
! 11079: }
1.3 takayama 11080: if(type(Err=getopt(err))==1){
1.4 ! takayama 11081: F1=mysubst(F1,[x,x+Err*TD/1001.23]);
! 11082: F2=mysubst(F2,[x,x+Err*TD/1001.23]);
1.3 takayama 11083: }
11084: if(type(F1)==4 || type(F2)==4){
11085: Dn=1;
11086: }else Dn=dn(F1)*dn(F2);
11087: for(V=[],PT=LT;PT!=[]; PT=cdr(PT)){
11088: T=car(PT);
11089: if(myfeval(Dn,T)==0){
11090: V=cons(0,V); continue;
11091: }
1.4 ! takayama 11092: if(Cpx>0||Acc){
1.3 takayama 11093: X=myfeval(F1,T);Y=myfeval(F2,T);
11094: }else{
11095: X=myfdeval(F1,T);Y=myfdeval(F2,T);
11096: }
11097: if((N1==0||(PT!=LT&&length(PT)!=1)) && (X<LX[0]||X>LX[1]||Y<LY[0]||Y>LY[1]))
11098: V=cons(0,V);
11099: else
11100: V=cons([MulX*(X-Orgx),MulY*(Y-Orgy)],V);
11101: }
11102: V=reverse(V);
11103: Gap0=Gap=Arg=0;
11104: if(type(Prec=getopt(prec))<0)
11105: Level=0;
11106: else if(Prec==0) Level=4;
11107: else if(type(Prec)==1){
11108: Level=Prec;
11109: if(Level<0){
11110: Level=-Level;
11111: Gap0=1;
11112: }
11113: }else if(type(Prec)==4){
11114: Level=Prec[0];
11115: if(length(Prec)>1) Arg=Prec[1];
11116: if(length(Prec)>2) Gap0=Prec[2];
11117: }
11118: if(Level>0){
11119: if(Level>16) Level=16;
11120: if(Arg<=0) Arg=30;
11121: else if(Arg>120) Arg=120;
1.4 ! takayama 11122: Arg=Acc?eval(@pi*Arg/180):deval(@pi*Arg/180);
1.3 takayama 11123: SL=dcos(Arg);
11124: }
11125: if(Gap0>0){
11126: if(Gap0<2) Gap0=16;
11127: else if(Gap0>512) Gap0=512;
11128: Gap=((MulX*(LX[1]-LX[0]))^2+(MulY*(LY[1]-LY[0]))^2)/(Gap0^2);
11129: }
11130: for(I=0;I<Level;I++){
11131: for(F=K=G=0,NV=NLT=[],PLT=LT,PV=V;PLT!=[];K++,PLT=cdr(PLT),PV=cdr(PV)){
11132: TG=0;D0=D1;CLT0=CLT;CV0=CV;CV=car(PV);CLT=car(PLT);
11133: if(length(PV)>1){
11134: if((CV1=car(cdr(PV)))!=0 && CV!=0)
11135: D1=[CV[0]-CV1[0],CV[1]-CV1[1]];
11136: else D1=0;
11137: }else K=-1; /* ? */
11138: if(K>0 &&(((D1==0||D0==0)&&(CV0!=0||CV!=0||CV1!=0)) || dvangle(D0,D1)<SL ||
1.4 ! takayama 11139: (Gap>0 && type(D0)==4 && (TG=(D0[0]^2+D0[1]^2-Gap)>0)))){
1.3 takayama 11140: G++;T1=(CLT0+CLT)/2;
11141: if(F==0 && (CV0!=0 || CV!=0)){
11142: if(myfdeval(Dn,T1)==0){
11143: NV=cons(0,NV); NLT=cons(T1,NLT);
11144: }
1.4 ! takayama 11145: if(Cpx>0||Acc){
1.3 takayama 11146: X=myfeval(F1,T1);Y=myfeval(F2,T1);
11147: }else{
11148: X=myfdeval(F1,T1);Y=myfdeval(F2,T1);
11149: }
11150: if(K==1 && N1<0){
11151: NV=[];NLT=[];
11152: }
11153: if((K>1||N1==0)&&(X<LX[0]||X>LX[1]||Y<LY[0]||Y>LY[1])){
11154: NV=cons(0,NV);NLT=cons(T1,NLT);F=0;
11155: }else{
11156: NV=cons([MulX*(X-Orgx),MulY*(Y-Orgy)],NV);NLT=cons(T1,NLT);
11157: }
11158: }
11159: NV=cons(CV,NV);NLT=cons(CLT,NLT);
11160: if(!TG&&(CV0!=0||CV1!=0)){
11161: T2=(car(cdr(PLT))+CLT)/2;
11162: if(myfdeval(Dn,T2)==0){
11163: NV=cons(0,NV); NLT=cons(CLT,NLT);
11164: }
1.4 ! takayama 11165: if(Cpx>0||Acc){
1.3 takayama 11166: X=myfeval(F1,T2);Y=myfeval(F2,T2);
11167: }else{
11168: X=myfdeval(F1,T2);Y=myfdeval(F2,T2);
11169: }
11170: if((N1==0||length(PV)!=2)&&(X<LX[0]||X>LX[1]||Y<LY[0]||Y>LY[1])){
11171: NV=cons(0,NV);NLT=cons(T1,NLT);
11172: }else{
11173: NV=cons([MulX*(X-Orgx),MulY*(Y-Orgy)],NV);NLT=cons(T2,NLT);
11174: }
11175: }
11176: if(length(PV)==2 && N1==-1) break;
11177: F=1;
11178: }else{
11179: F=0;NV=cons(CV,NV);NLT=cons(CLT,NLT);
11180: }
11181: }
11182: V=reverse(NV);LT=reverse(NLT);
11183: if(G==0) break;
11184: }
11185: if(Gap>0){
11186: for(NV=[],PV=V;PV!=[];PV=cdr(PV)){
11187: NV=cons(P0=car(PV),NV);
11188: if(length(PV)>1 && P0!=0 && PV[1]!=0
11189: && (P0[0]-PV[1][0])^2+(P0[1]-PV[1][1])^2>Gap) NV=cons(0,NV);
11190: }
11191: V=reverse(NV);
11192: }
11193: if(getopt(raw)==1) return V;
11194: OL=[["curve",1]];OLP=[];
11195: if(type(C=getopt(ratio))==1){
11196: OL=cons(["ratio",C],OL);OLP=cons(["ratio",C],OLP);
11197: }
1.4 ! takayama 11198: if(Acc==1) OL=cons(["Acc",1],OL);
1.3 takayama 11199: if(N1<0) OL=cons(["close",-1],OL);
11200: if(type(Opt=getopt(opt))!=7 && type(Opt)!=4){
1.4 ! takayama 11201: if(Opt==0) return xylines(V|option_list=cons(["opt",0],OL));
1.3 takayama 11202: }
11203: OL=cons(["opt",(Proc)?0:Opt],OL);
11204: if(type(Opt)>=0) OLP=cons(["opt",Opt],OLP);
11205: if(type(Vb=getopt(verb))==1||type(Vb)==4){
11206: OL=cons(["verb",Vb],OL);OLP=cons(["verb",Vb],OL);
11207: }
11208: if(Proc){
11209: S=(Proc==1)?
11210: [[0,[MulX*(LX[0]-Orgx),MulX*(LX[1]-Orgx)],[MulY*(LY[0]-Orgy),MulY*(LY[1]-Orgy)],
11211: (TikZ)?1:1/10]]:[];
11212: S=cons([1,OLP,xylines(V|option_list=OL)],S);
11213: if(Proc==3) return car(S);
11214: }else S=xylines(V|option_list=OL);
11215: if(type(Pt=getopt(pt))==4){
11216: if(type(Pt[0])!=4) Pt=[Pt];
11217: if(length(Pt)>1 && type(Pt[1])!=4) Pt=[Pt];
11218: for(PT=Pt;PT!=[];PT=cdr(PT)){
11219: PP=car(PT);
11220: if(type(PP[0])!=4) PP=[PP];
11221: P=car(PP);PP=cdr(PP);
11222: Qx=MulX*(P[0]-Orgx);Qy=MulY*(P[1]-Orgy);
11223: if(length(PP)>0 && type(PP[0])==4){ /* draw line */
11224: P=car(PP);
11225: Q1x=MulX*(P[0]-Orgx);Q1y=MulY*(P[1]-Orgy);
11226: if(length(PP)<1 || car(PP)==0 || iand(car(PP),1))
11227: OL=["opt",(TikZ)?"-":"@{-}"];
11228: else OL=["opt",(TikZ)?".":"@{.}"];
11229: if(Proc) S=cons([1,OL,[[Qx,Qy],[Q1x,Q1y]]],S);
11230: else S=S+xylines([[Qx,Qy],[Q1x,Q1y]]|optilon_list=OL);
11231: continue;
11232: }
11233: if(length(PP)==0 || type(car(PP))!=7) SS="$\\bullet$";
11234: else SS=car(PP);
11235: if(length(PP)<=1){
1.4 ! takayama 11236: if(Proc) S=cons([2,[],[Qx,Qy],[SS]],S);
1.3 takayama 11237: else S=S+xyput([Qx,Qy,SS]);
11238: }else{
1.4 ! takayama 11239: if(Proc) S=cons([2,[],[Qx,Qy],[[SS],"",PP[1]]],S);
1.3 takayama 11240: S=S+xyput([Qx,Qy,SS,"",PP[1]]);
11241: }
11242: }
11243: }
11244: if(type(Ax=getopt(ax))==4){ /* draw axis */
11245: Adx0=Ady0=0; Adx1=Ady1=0.1;
11246: if(!TikZ){
11247: if(!XYcm) Adx1=Ady1=1;
11248: LOp="@{-}"; LxOp="+!U"; LyOp="+!R";
11249: }else{
11250: LOp="-"; LxOp="below"; LyOp="left";
11251: }
11252: LOp0=LOp1=LOp;
11253: LxOO=(Ax[1]==LY[0])?LxOp:(TikZ)?"below left":"+!UR";
11254: if(type(AxOp=getopt(axopt))>0){
11255: if(type(AxOp)==1){
11256: if(AxOp>0) Adx1=Ady1=AxOp;
11257: else if(AxOp<0){
11258: Adx1=Ady1=0; Adx0=Ady0=AxOp;
11259: }
11260: }else if(type(AxOp)==4){
11261: if(type(T=car(AxOp))==4 && length(AxOp)>1){
11262: if(type(T)==7){
11263: LxOp=T; LyOp=AxOp[1];
11264: }else if(type(T)==4){
11265: Ay0=T[0]; Ay1=T[1]; Ax0=AxOp[1][0]; Ax1=AxOp[1][1];
11266: if(length(T)>2) LxOp=T[2];
11267: if(length(AxOp[1])>2) LyOp=AxOp[1][2];
11268: }
11269: }
11270: if(length(AxOp)>2 && type(AxOp[2])==7) LxOO=AxOp[2];
11271: if(length(AxOp)>3 && type(AxOp[3])==7) LOp0=AxOp[3];
11272: if(length(AxOp)>4 && type(AxOp[4])==7) LOp1=AxOp[4];
11273: }
11274: if(type(AxOp)==7) LOp0=AxOp;
11275: }
11276: if(Ax[0]>=LX[0] && Ax[0]<=LX[1]){ /* draw marks on x-axis */
11277: if(Proc) S=cons([3,(type(LOp0)>=0)?[["opt",LOp0]]:[],
11278: [MulX*(Ax[0]-Orgx),MulY*(LY[0]-Orgy)],[MulX*(Ax[0]-Orgx),MulY*(LY[1]-Orgy)]],S);
11279: else S=S+xyarrow([MulX*(Ax[0]-Orgx),MulY*(LY[0]-Orgy)],
11280: [MulX*(Ax[0]-Orgx),MulY*(LY[1]-Orgy)]|opt=LOp0);
11281: if(length(Ax)>2){
11282: D=Ax[2];
11283: if(type(D)==1 && D>0){
11284: I0=ceil((LX[0]-Ax[0])/D); I1=floor((LX[1]-Ax[0])/D);
11285: for(DD=[],I=I0; I<=I1; I++){
11286: if(length(Ax)<5) DD=cons(I*D,DD);
11287: else if(Ax[4]==0) DD=cons([I*D,I*D+Ax[0]],DD);
11288: else if(Ax[4]==1) DD=cons([I*D,I*D],DD);
11289: else if(Ax[4]==2) DD=cons([I*D,I],DD);
11290: }
11291: D=DD;
11292: }
11293: if(type(D)==4){
11294: for(;D!=[]; D=cdr(D)){
11295: T=car(D);
11296: if(type(T)==4) T=car(T);
11297: X=MulX*(T+Ax[0]-Orgx); Y=MulY*(Ax[1]-Orgy);
11298: if(T!=0){
11299: if(Proc) S=cons([3,(type(LOp1)>=0)?[["opt",LOp1]]:[],[X,Y+Ady0],[X,Y+Ady1]],S);
11300: else S=S+xyarrow([X,Y+Ady0],[X,Y+Ady1]|opt=LOp1);
11301: }
11302: if(type(car(D))==4){
11303: Arg=[(T==0)?LxOO:LxOp,D[0][1]];
1.4 ! takayama 11304: if(Proc) S=cons([2,[],[X,Y+Ady0],[Arg]],S);
1.3 takayama 11305: else S=S+xyput([X,Y+Ady0,Arg]);
11306: }
11307: }
11308: }
11309: }
11310: }
11311: if(Ax[1]>=LY[0] && Ax[1]<=LY[1]){ /* draw marks on y-axis */
11312: if(Proc) S=cons([3,[["opt",LOp0]],
11313: [MulX*(LX[0]-Orgx),MulY*(Ax[1]-Orgy)],
11314: [MulX*(LX[1]-Orgx),MulY*(Ax[1]-Orgy)]],S);
11315: else S=S+xyarrow([MulX*(LX[0]-Orgx),MulY*(Ax[1]-Orgy)],
11316: [MulX*(LX[1]-Orgx),MulY*(Ax[1]-Orgy)]|opt=LOp0);
11317: if(length(Ax)>3){
11318: D=Ax[3];
11319: if(type(D)==1 && D>0){
11320: I0=ceil((LY[0]-Ax[1])/D); I1=floor((LY[1]-Ax[0])/D);
11321: for(DD=[],I=I0; I<=I1; I++){
11322: if(length(Ax)<5) DD=cons(I*D,DD);
11323: else if(I!=0){
11324: if(Ax[4]==0) DD=cons([I*D,I*D+Ax[1]],DD);
11325: if(Ax[4]==1) DD=cons([I*D,I*D],DD);
11326: if(Ax[4]==2) DD=cons([I*D,I],DD);
11327: }
11328: }
11329: D=DD;
11330: }
11331: if(type(D)==4){
11332: for(;type(D)==4&&D!=[]; D=cdr(D)){
11333: T=car(D);
11334: if(type(T)==4) T=car(T);
11335: X=MulX*(Ax[0]-Orgx); Y=MulY*(T+Ax[1]-Orgy);
11336: if(T!=0){
11337: if(Proc) S=cons([3,(type(LOp0)>=0)?[["opt",LOp1]]:[],
11338: [X+Adx0,Y],[X+Adx1,Y]],S);
11339: else S=S+xyarrow([X+Adx0,Y],[X+Adx1,Y]|opt=LOp1);
11340: }
11341: if(type(car(D))==4){
11342: if(Proc) S=cons([2,[],[X,Y+Ady0],[[LyOp,D[0][1]]]],S);
11343: else S=S+xyput([X,Y+Ady0,[LyOp,D[0][1]]]);
11344: }
11345: }
11346: }
11347: }
11348: }
11349: }
11350: if(Proc) return reverse(S);
11351: if(getopt(dviout)!=1) return S;
11352: xyproc(S|dviout=1);
11353: }
11354:
11355: def xyarrow(P,Q)
11356: {
11357: Cmd = ["fill","filldaw","shade","shadedraw","clip ","pattern","path ","node","coordinate"];
11358: if(type(P)<4) return "%\n";
11359: SS=getopt(opt);
11360: if(!TikZ){
11361: if(type(Q)<4) return "";
11362: S="{"+xypos(P)+" \\ar";
11363: if(type(SS)==7) S=S+SS;
11364: return S+" "+xypos(Q)+"};\n";
11365: }
11366: if(type(SS)==4 && length(SS)>1){
11367: if(length(SS)>2) SU=SS[2];
11368: ST=SS[1];
11369: SS=SS[0];
11370: }
11371: if(type(SS)!=7) SS="->";
11372: if(type(ST)!=7) ST=" -- ";
11373: if(type(SU)!=7) SU="";
11374: if(type(S=getopt(cmd))==7) S="\\"+S;
11375: else S="\\draw";
11376: if(type(Q)!=4){
11377: if(Q>0 && Q<=length(Cmd)) S="\\"+Cmd[Q-1]+"";
11378: if(SS!="-") S=S+"["+SS+"]";
11379: if(SU!="") SU="["+SU+"]";
11380: return S+xypos(P)+ST+SU+";\n";
11381: }
11382: if(SS!="-") S=S+"["+SS+"]";
11383: if(length(P)<3 && length(Q)<3)
11384: return S+xypos(P)+ST+xypos(Q)+SU+";\n";
11385: if(length(P)==2) P=[P[0],P[1],"","_0"];
11386: else if(length(P)==3 || (length(P)==4 && P[3]==""))
11387: P=[P[0],P[1],P[2],"_0"];
11388: else if(P[3]=="")
11389: P=[P[0],P[1],P[2],"_0",P[4]];
11390: if(length(Q)==2) Q=[Q[0],Q[1],"","_1"];
11391: else if(length(Q)==3 || (length(Q)==4 && Q[3]==""))
11392: Q=[Q[0],Q[1],Q[2],"_1"];
11393: else if(Q[3]=="")
11394: Q=[Q[0],Q[1],Q[2],"_1",Q[4]];
11395: return S+xypos(P)+" "+xypos(Q)+"("+P[3]+")"+ST+"("+Q[3]+")"+SU+";\n";
11396: }
11397:
11398: def polroots(L,V)
11399: {
11400: INIT=1;
11401: if(type(CF=getopt(comp))!=1) CF=0;
11402: OL=getopt();
11403: if(CF>32){
11404: CF-=64;
11405: INIT=0;
11406: }else OL=cons(["comp",CF+64],delopt(OL,"comp"));
11407: if(type(V)==4&&length(V)==1){
11408: L=L[0];V=V[0];
11409: }
11410: Lim=Lim2=[];
11411: if(type(L)<4){
11412: if(type(Lim=getopt(lim))==4){
11413: if(type(Lim[0])!=4) Lim=[Lim];
11414: Lim=delopt(Lim,V|inv=1);
11415: if(Lim!=[]){
11416: Lim=Lim[0];
11417: if(length(Lim)==3) Lim2=Lim[2];
11418: Lim=Lim[1];
11419: }
11420: }else{
11421: Lim=Lim2=[];
11422: }
1.4 ! takayama 11423: /* mycat([V,Lim,Lim2]); */
! 11424: if((CF==-2||CF==-1||CF==2)&&iscoef(L,os_md.israt)){ /* Rat+Comp, Rat+Real or Rat */
! 11425: S=(CF==-1)?getroot(L,V|cpx=1):getroot(L,V);
1.3 takayama 11426: for(RR=[],F=x;S!=[];S=cdr(S)){
11427: if(findin(V,vars(C=car(S)))<0){ /* Rational solution */
11428: if(type(C)<2){
11429: if(Lim!=[]&&(real(C)<Lim[0]||real(C)>Lim[1])) continue;
11430: if(Lim2!=[]&&(imag(C)<Lim2[0]||imag(C)>Lim2[1])) continue;
11431: }
11432: if(F!=C) RR=cons(F=C,RR);
11433: }else if(CF<0){ /* Irrational solution */
1.4 ! takayama 11434: if((R=pari(roots,mysubst(C,[V,x])))!=0){
1.3 takayama 11435: for(R=vtol(R);R!=[];R=cdr(R))
1.4 ! takayama 11436: if((C=car(R))!=F && ntype(C)<CF+6){
1.3 takayama 11437: if(Lim!=[]&&(real(C)<Lim[0]||real(C)>Lim[1])) continue;
11438: if(Lim2!=[]&&(imag(C)<Lim2[0]||imag(C)>Lim2[1])) continue;
11439: RR=cons(F=C,RR);
11440: }
11441: }
11442: }
11443: }
11444: return qsort(RR);
11445: }
11446: R=pari(roots,subst(L,V,x));
1.4 ! takayama 11447: if(R==0){
! 11448: R=[0];
! 11449: if(CF==1){
! 11450: for(R=[0],I=mydeg(L,V);I>1; I--)
! 11451: R=cons(0,R);
! 11452: }
! 11453: return R;
! 11454: }
1.3 takayama 11455: if(CF==1){ /* Complex */
11456: if(Lim==[]&&Lim2==[]) return vtol(R);
11457: for(L=[],I=length(R)-1;I>=0;I--){
11458: C=R[I];
11459: if(Lim!=[]&&(real(C)<Lim[0]||real(C)>Lim[1])) continue;
11460: if(Lim2!=[]&&(imag(C)<Lim2[0]||imag(C)>Lim2[1])) continue;
11461: L=cons(C,L);
11462: }
11463: return L;
11464: }
11465: for(L=[],F=x,I=length(R)-1;I>=0;I--){ /* Real */
11466: if(ntype(R[I])<4 && F!=R[I]){
11467: if(Lim!=[] && (R[I]<Lim[0]||R[I]>Lim[1])) continue;
11468: L=cons(F=R[I],L);
11469: }
11470: }
11471: return qsort(L);
11472: }
11473: if(SS==0&&INIT==1){
11474: SS=polroots(L,V|option_list=OL);
11475: if(SS!=0) return SS;
11476: for(C=0;SS==0&&C<4;C++){
11477: I=(C==0)?1:(iand(random(),0xff)-0x80);
11478: for(LL=[],K=length(L)-1;K>=0;K--){
11479: for(Q=0,J=length(L)-1;J>=0;J--)
11480: Q+=L[J]*(I+K)^J;
11481: LL=cons(Q,LL);
11482: }
11483: SS=polroots(LL,V|option_list=OL);
11484: if(SS!=0) return SS;
11485: }
11486: return SS;
11487: }
11488: C=2^(-32);
11489: if(type(getopt(err))==1) C=err;
11490: if((N=length(V))!=length(L)) return [];
11491: if(N==1) return polroots(L[0],V[0]|option_list=OL);
11492: for(L1=[],I=1;I<N;I++){
11493: Res=res(V[0],L[I-1],L[I]);
11494: if(type(Res)<2) return Res;
11495: L1=cons(res(V[0],L[I-1],L[I]),L1);
11496: }
11497: R=polroots(L1,V1=cdr(V)|option_list=OL);
11498: if(type(R)<2) return R;
11499: for(SS=[];R!=[];R=cdr(R)){
11500: RS=(N==2)?[car(R)]:car(R);
1.4 ! takayama 11501: for(I=0,L0=L[0];I<N-1;I++) L0=mysubst(L0,[V1[I],RS[I]]);
1.3 takayama 11502: S0=polroots(L0,V[0]|option_list=OL);
11503: if(type(S0)<2) return S0;
11504: for(S=S0;S!=[];S=cdr(S)){
11505: S0=cons(car(S),RS);
11506: for(LT=cdr(L);LT!=[];LT=cdr(LT)){
1.4 ! takayama 11507: for(I=0,TV=car(LT);I<N;I++) TV=mysubst(TV,[V[I],S0[I]]);
1.3 takayama 11508: if(abs(TV)>C) break;
11509: }
11510: if(LT==[]) SS=cons(S0,SS);
11511: }
11512: }
11513: return reverse(SS);
11514: }
11515:
11516: def ptcommon(X,Y)
11517: {
11518: if(length(X)!=2 || length(Y)!=2) return 0;
11519: if(type(X[1])==4){ /* X is a line */
11520: if((In=getopt(in))==-1||In==-2||In==-3){
11521: X0=(X[0][0]+X[1][0])/2;X1=(X[0][1]+X[1][1])/2;
11522: X=[[X0,X1],[X0+X[1][1]-X[0][1],X1-X[1][0]+X[0][0]]];
11523: if(In==-1&&type(Y[1])==4) return ptcommon(Y,X|in=-2);
11524: /* for the second line */
11525: if(In==-3) In=1;
11526: else In=0;
11527: }else if(In==2||In==3){
11528: X=(X[1][0]-X[0][0])+(X[1][1]-X[0][1])*@i;
11529: if(X==0) return 0;
11530: Y=(Y[1][0]-Y[0][0])+(Y[1][1]-Y[0][1])*@i;
11531: X=myarg(Y/X);
11532: return (In==2)?X:(X*180/deval(@pi));
11533: }else if(In!=1) In=0;
1.4 ! takayama 11534: if(type(Y[0])<=3){
1.3 takayama 11535: if(In==1){
11536: return [(Y[1]*X[0][0]+Y[0]*X[1][0])/(Y[0]+Y[1]),
11537: (Y[1]*X[0][1]+Y[0]*X[1][1])/(Y[0]+Y[1])];
11538: }
11539: XX=X[1][0]-X[0][0];YY=X[1][1]-X[0][1];
11540: Arg=(length(Y)<2)?0:Y[1];
11541: Arg=deval(Arg);
11542: if(Arg!=0){
11543: S=dcos(Arg)*XX-dsin(Arg)*YY;
11544: YY=dsin(Arg)*XX+dcos(Arg)*YY;
11545: XX=S;
11546: }
11547: S=dnorm([XX,YY]);
11548: if(S!=0){
11549: XX*=Y[0]/S;YY*=Y[0]/S;
11550: }
11551: return [X[1][0]+XX,X[1][1]+YY];
11552: }
11553: S=[X[0][0]+(X[1][0]-X[0][0])*x_,X[0][1]+(X[1][1]-X[0][1])*x_];
11554: if(type(Y[1])==4){ /* Y is a line */
11555: T=[Y[0][0]+(Y[1][0]-Y[0][0])*y_-S[0],
11556: Y[0][1]+(Y[1][1]-Y[0][1])*y_-S[1]];
11557: R=lsol(T,[x_,y_]);
11558: if(type(R[0])==4&&type(R[1])==4&&R[0][0]==x_&&R[1][0]==y_){
11559: if(!In || (R[0][1]>=0&&R[0][1]<=1&&R[1][1]>=0&&R[1][1]<=1) )
11560: return subst(S,x_,R[0][1],y_,R[1][1]);
11561: }
11562: if((type(R[0])>0&&type(R[0])<4)||(type(R[1])>0&&type(R[1])<4)) return 0;
11563: if(!In) return 1;
11564: I=(X[0][0]==X[1][0]&&Y[0][0]==Y[1][0]&&X[0][0]==Y[0][0])?1:0;
11565: if(X[0][I]<=X[1][I]){
11566: X0=X[0][I];X1=X[1][I];
11567: }else{
11568: X1=X[0][I];X0=X[1][I];
11569: }
11570: return ((Y[0][I]<X0 && Y[1][I]<X0)||(Y[0][I]>X1&&Y[1][I]>X1))?0:1;
11571: }else if(Y[1]==0){ /* orth */
11572: T=[Y[0][0]+(X[1][1]-X[0][1])*y_-S[0],
11573: Y[0][1]-(X[1][0]-X[0][0])*y_-S[1]];
11574: R=lsol(T,[x_,y_]);
11575: if(type(R[0])==4&&type(R[1])==4&&R[0][0]==x_&&R[1][0]==y_){
11576: if(!In||(R[0][1]>=0&&R[0][1]<=1))
11577: return subst(S,x_,R[0][1],y_,R[1][1]);
11578: }
11579: return (X[0]==X[1])?0:1;
11580: }else if(type(Y[1])==1 && Y[1]>0){ /* circle */
11581: T=(S[0]-Y[0][0])^2+(S[1]-Y[0][1])^2-Y[1]^2;
11582: D=mycoef(T,1,x_)^2-4*mycoef(T,0,x_)*mycoef(T,2,x_);
11583: if(D==0){
11584: V=mycoef(T,1,x_)/(2*mycoef(T,2,x_));
11585: if(!in||(V>=0&&V<=1)) return [subst(S,x_,V)];
11586: }
11587: else if((type(D)==1&&D>0)){
11588: D=dsqrt(D);
11589: V=-(mycoef(T,1,x_)+D)/(2*mycoef(T,2,x_));
11590: if(!In||(V>=0&&V<=1)) L=[subst(S,x_,V)];
11591: else L=[];
11592: V=(D-mycoef(T,1,x_))/(2*mycoef(T,2,x_));
11593: if(!In||(V>=0&&V<=1)) L=cons(subst(S,x_,V),L);
11594: if(length(L)>0) return L;
11595: }
11596: }
11597: return 0;
11598: }
11599: if(type(Y[1])==4 || X[1]==0) return ptcommon(Y,X);
11600: /* X is a circle */
11601: if(Y[1]==0){ /* tangent line */
11602: if(Y[0][0]==X[0][0]+X[1] || Y[0][0]==X[0][0]-X[1]) L=[[Y[0][0],X[0][1]]];
11603: else L=[];
11604: P=(Y[0][0]+x_-X[0][0])^2+(Y[0][1]+x_*y_-X[0][1])^2-X[1]^2;
11605: Q=mycoef(P,1,x_)^2-4*mycoef(P,2,x_)*mycoef(P,0,x_);
11606: for(R=polroots(Q,y_);R!=[];R=cdr(R)){
11607: X0=-subst(mycoef(P,1,x_)/(2*mycoef(P,2,x_)),y_,car(R));
11608: L=cons([Y[0][0]+X0,Y[0][1]+car(R)*X0],L);
11609: }
11610: }else{ /* Y is a circle */
11611: P=(x_-X[0][0])^2+(y_-X[0][1])^2-X[1]^2;
11612: Q=(x_-Y[0][0])^2+(y_-Y[0][1])^2-Y[1]^2;
11613: V=(X[0][0]!=Y[0][0])?[x_,y_]:[y_,x_];
11614: R=subst(P,V[0],T=lsol(P-Q,V[0]));
11615: if(type(T[0])<4) return (T[0]==0)?1:0;
11616: S=polroots(R,V[1]);
11617: for(L=[];S!=[];S=cdr(S)){
11618: R=subst(T,V[1],car(S));
11619: if(V[0]==x_) L=cons([R,car(S)],L);
11620: else L=cons([S,R],L);
11621: }
11622: }
11623: if(length(L)!=0) return L;
11624: return 0;
11625: }
11626:
11627: def tobezier(L)
11628: {
11629: if((Div=getopt(div))==1||Div==2){
11630: if(length(L)!=4) return [tobezier(L|inv=[0,1/2]),tobezier(L|inv=[1/2,1])];
11631: if(type(L)==4) L=ltov(L);
11632: if(type(L[0])==4)
11633: L=[ltov(L[0]),ltov(L[1]),ltov(L[2]),ltov(L[3])];
11634: S=[(L[0]+3*L[1]+3*L[2]+L[3])/8];
11635: T=[L[3]];
11636: S=cons((L[0]+2*L[1]+L[2])/4,S);
11637: T=cons((L[2]+L[3])/2,T);
11638: S=cons((L[0]+L[1])/2,S);
11639: T=cons((L[1]+2*L[2]+L[3])/4,T);
11640: S=cons(L[0],S);
11641: T=cons((L[0]+3*L[1]+3*L[2]+L[3])/8,T);
11642: return [S,T];
11643: }
11644: if(Div>2&&Div<257){
11645: L=tobezier(L);
11646: for(R=[],I=Div-1;I>=0;I--)
11647: R=cons(tobezier(L|inv=[I/Div,(I+1)/Div]),R);
11648: return R;
11649: }
11650: if((V=getopt(inv))==1 || type(V)>3){
11651: if(type(L[0])>3 && type(V)>3) L=tobezier(L);
11652: if(type(V)>3 && length(V)>2) V2=V[2];
11653: if(type(V2)!=2) V2=t;
11654: if(type(V)>3) L=subst(L,V2,(V[1]-V[0])*V2+V[0]);
11655: N=mydeg(L,V2);
11656: for(R=[],I=0;I<=N;I++){
11657: RT=mycoef(L,I,V2);
11658: R=cons(RT/binom(N,I),R);
11659: L-=RT*V2^I*(1-V2)^(N-I);
11660: }
11661: return reverse(R);
11662: };
11663: N=length(L)-1;
11664: V=newvect(2);
11665: for(I=0;I<=N;I++,L=cdr(L)){
11666: if(type(X=car(L))==4) X=ltov(X);
11667: V+=X*binom(N,I)*t^I*(1-t)^(N-I);
11668: }
11669: return V;
11670: }
11671:
1.4 ! takayama 11672: def cutf(F,X,VV)
! 11673: {
! 11674: if(type(car(V=VV))==2){
! 11675: Y=[car(V),X];
! 11676: V=cdr(V);
! 11677: }else Y=X;
! 11678: if(type(X)>1){
! 11679: Y=(type(Y)==4)?Y[0]:x;
! 11680: V1=makenewv(F);
! 11681: if(X==Y||Y==x){
! 11682: V2=makenewv([F,V1]);
! 11683: F=mysubst(F,[Y,V2]);
! 11684: V=cons(V2,V);
! 11685: }
! 11686: return [V1,[V1,os_md.cutf,[F],X,[V]]];
! 11687: }
! 11688: if(car(V)!=[] && X<car(V)[0]) return myfeval(car(V)[1],Y);
! 11689: for(V=cdr(V); ;V=R){
! 11690: if((R=cdr(V))==[]){
! 11691: if(car(V)!=[] && car(V)[0]<X) return myfeval(car(V)[1],Y);
! 11692: return myfeval(F,Y);
! 11693: }
! 11694: if(X>car(V)[0]) continue;
! 11695: if(X==car(V)[0]) return car(V)[1];
! 11696: return myfeval(F,Y);
! 11697: }
! 11698: }
! 11699:
! 11700: def fsum(F,L,X)
! 11701: {
! 11702: if(type(L[0])==2){
! 11703: X=L[0];
! 11704: L=cdr(L);
! 11705: }else X=0;
! 11706: V=(length(L)>2)?L[2]:1;
! 11707: for(R=0,I=L[0];;I+=V){
! 11708: if(V==0||(I-L[1])*V>0) return R;
! 11709: R+=os_md.myfeval(F,X?[X,I]:I);
! 11710: }
! 11711: }
! 11712:
! 11713: def periodicf(F,L,X)
! 11714: {
! 11715: if(type(L)==4) L=[eval(L[0]),eval(L[1])];
! 11716: else L=eval(L);
! 11717: if(isvar(X)){
! 11718: Y=makenewv([X,V]);
! 11719: if(type(F)==5) return [Y,[Y,os_md.periodicf,[F],L,X]];
! 11720: Z=makenewv([X,Y,V]);
! 11721: return [Z,[Z,os_md.periodicf,[mysubst(F,[x,Y])],[L],[[Y,X]]]];
! 11722: }
! 11723: X=eval(X);
! 11724: if(type(F)==5)
! 11725: return myfeval(F[floor(X/L)%length(F)],X-floor(X/L)*L);
! 11726: if(type(L)==4){
! 11727: if(type(X)==4){
! 11728: V=X[0];
! 11729: X=X[1];
! 11730: }else V=x;
! 11731: X-=floor((X-L[0])/(L[1]-L[0]))*(L[1]-L[0]);
! 11732: return myfeval(F,[V,X]);
! 11733: }
! 11734: }
! 11735:
! 11736: def cmpf(X)
! 11737: {
! 11738: if(type(X)>3){
! 11739: if(type(L)==7) return [S_Fc,Dx,S_Ic,S_Ec,S_EC,S_Lc];
! 11740: S_Lc=0;
! 11741: if(type(S_Fc=X[0])!=4) S_Fc=f2df(S_Fc);
! 11742: S_Ic=X[1];
! 11743: if(length(S_Ic)>2){
! 11744: S_Fc=mysubst(S_Fc,[S_Ic[0],x]);
! 11745: S_Ic=cdr(S_Ic);
! 11746: }
! 11747: S_Dc=(type(S_Ic[0])==7)?1:0;
! 11748: if(type(S_Ic[1])==7) S_Dc=ior(S_Dc,2);
! 11749: if(type(S_Ec=getopt(exp))!=1) S_Ec=0;
! 11750: if(S_Ec<=0){
! 11751: S_EC=-S_Ec;
! 11752: if(S_EC==0) S_EC=1;
! 11753: if(S_Dc==3) S_EC*=2;
! 11754: else S_EC/=4;
! 11755: if(type(F=X[0])==3&&vars(F)==[x]&&(D=deg(nm(F),x))==deg(dn(F),x)-2){
! 11756: S_Lc=S_EC*coef(nm(F),D,x)/coef(dn(F),D+2,x);
! 11757: }
! 11758: }else{
! 11759: S_EC=S_Ec;
! 11760: if(S_Dc==3) S_EC*=12;
! 11761: else S_EC/=6;
! 11762: }
! 11763: if(type(S_Fc)==3) S_Fc=red(S_Fc);
! 11764: S_EC=1/S_EC;
! 11765: return [z_,[z_,os_md.cmpf,x]];
! 11766: }
! 11767: if(X<=0 && iand(S_Dc,1)) return S_Lc;
! 11768: if(X>=1 && iand(S_Dc,2)) return S_Lc;
! 11769: if(S_Dc==3){
! 11770: if(S_Ec>0){
! 11771: Y0=dexp(1/X)*S_EC;
! 11772: Y1=dexp(1/(1-X))*S_EC;
! 11773: return myfeval(S_Fc,Y1-Y0)*(Y0/X^2+Y1/(1-X)^2);
! 11774: }
! 11775: return myfeval(S_Fc,S_EC/(1-X)-S_EC/X)*(S_EC/(1-X)^2+S_EC/X^2);
! 11776: }
! 11777: if(S_Dc==1){
! 11778: if(S_Ec>0){
! 11779: Y=dexp(1-1/X);
! 11780: R=myfeval(S_Fc,S_EC*(Y-1)+I[1])*Y;
! 11781: }
! 11782: else R=myfeval(S_Fc,I[1]+(1-1/X)*S_EC);
! 11783: return R*S_EC/X^2;
! 11784: }
! 11785: if(S_Dc==2){
! 11786: if(S_Ec>0){
! 11787: Y=dexp(X/(1-X));
! 11788: R=myfeval(S_Fc,S_EC*(Y-1)+S_Ic[0])*Y;
! 11789: }else R=myfeval(S_Fc,S_EC*X/(1-X)+S_Ic[0]);
! 11790: return R*S_EC/(1-X)^2;
! 11791: }
! 11792: X=S_Ic[0]+(S_Ic[1]-S_Ic[0])*X;
! 11793: return myfeval(S_Fc,X)/(S_Ic[1]-Ic[0]);
! 11794: }
! 11795:
! 11796: def fresidue(P,Q)
! 11797: {
! 11798: if(iscoef(Q,os_md.israt)) S=fctr(Q);
! 11799: else S=[[Q,1]];
! 11800: for(R=[];S!=[];S=cdr(S)){
! 11801: T=car(S);
! 11802: if((D=mydeg(T[0],z))==0) continue;
! 11803: L=[];
! 11804: if(iscoef(T[0],os_md.iscrat)) L=getroot(T[0],z|cpx=2);
! 11805: if(findin(z,vars(L))>=0) L=[];
! 11806: if(L==[]) L=polroots(T[0],z|comp=-1);
! 11807: for(;L!=[];L=cdr(L)){
! 11808: QQ=Q;
! 11809: for(I=T[1]; I>1;I--) QQ=mydiff(QQ,z);
! 11810: for(U=0,W=I=T[1];I>0;I--,W++){
! 11811: QQ=diff(QQ,z);
! 11812: U+=subst(QQ,z,L[0])*(z-L[0])^(W-T[1])/fac(W);
! 11813: }
! 11814: UD=mydiff(U,z);
! 11815: for(I=T[1],K=1,PP=P; I>1;I--,K++)
! 11816: PP=diff(PP,z)*U-K*PP*UD;
! 11817: QQ=subst(PP,z,L[0])/subst(U,z,L[0])^K;
! 11818: /* if(D==2) QQ=sqrt2rat(QQ); */
! 11819: R=cons([L[0],sqrt2rat(QQ)],R);
! 11820: }
! 11821: }
! 11822: if(type(L=getopt(cond))==4){
! 11823: for(S=[];R!=[];R=cdr(R)){
! 11824: Z=car(R);
! 11825: for(LL=L;LL!=[];LL=cdr(LL)){
! 11826: X=real(car(Z));Y=imag(car(Z));
! 11827: if(myf3eval(car(LL),X,Y,car(Z))<=0) break;
! 11828: }
! 11829: if(LL==[]) S=cons(Z,S);
! 11830: }
! 11831: R=reverse(S);
! 11832: }
! 11833: if((Sum=getopt(sum))==1||Sum==2){
! 11834: for(S=0;R!=[];R=cdr(R)) S+=car(R)[1];
! 11835: if(Sum==2) S*=2*@pi*@i;
! 11836: return sqrt2rat(S);
! 11837: }
! 11838: return R;
! 11839: }
! 11840:
! 11841: def fint(F,D,V)
! 11842: {
! 11843: if(((L=length(V))==2 || (L==3&&isvar(V[0])<3))
! 11844: && (type(V[L-1])==7||(type(V[L-1])<3&&type(eval(V[L-1]))<2)))
! 11845: /* real integral */
! 11846: return areabezier([F,D,V]|option_list=getopt());
! 11847: /* complex integral */
! 11848: if(L>1&&type(V[1])==4&&type(V[1][1])<4){
! 11849: if(type(V[0])==4&&type(V[0][0])<2){
! 11850: for(R=[],VT=car(V),VV=cdr(V);VV!=[];VV=cdr(VV),VT=VU){
! 11851: if((VU=car(VV))==-1) VU=car(V);
! 11852: R=cons([ptcommon([VT,VU],[t,1-t]|in=1),[0,1]],R);
! 11853: }
! 11854: V=reverse(R);
! 11855: }
! 11856: else if(L==2) V=[V];
! 11857: }
! 11858: Opt=cons(["cpx",1],getopt());
! 11859: for(R=0;V!=[];V=cdr(V)){
! 11860: VT=car(V);
! 11861: X=car(VT)[0];XD=red(diff(X,t));
! 11862: Y=car(VT)[1];YD=red(diff(Y,t));
! 11863: F=mysubst(F,[[x,X],[y,Y],[z,X+@i*Y]]);
! 11864: if(type(F)==4)
! 11865: FF=cons(F[0]*(XD+@i*YD),cdr(F));
! 11866: else FF=red(F*(XD+@i*YD));
! 11867: R+=areabezier([FF,D,cons(t,VT[1])]|option_list=Opt);
! 11868: }
! 11869: return R;
! 11870: }
! 11871:
! 11872: def areabezier(V)
! 11873: {
! 11874: if(getopt(cpx)==1){
! 11875: Opt=delopt(getopt(),"cpx");
! 11876: F=V[0];
! 11877: if(!isvar(Var=V[2][0])) Var=x;
! 11878: if(type(F)==3 && vars(F)==[Var] && imag(dn(F))!=0){
! 11879: F=(nm(F)*conj(dn(F)))/(dn(F)*conj(dn(F)));
! 11880: V0=red(real(nm(F))/dn(F));
! 11881: R=areabezier([V0,V[1],V[2]]|option_list=Opt);
! 11882: V0=red(imag(nm(F))/dn(F));
! 11883: return R+@i*areabezier([V0,V[1],V[2]]|option_list=Opt);
! 11884: }
! 11885: if(getopt(Acc)!=1) F=f2df(F);
! 11886: V0=compdf([o,[o,real,o_]],o_,F);
! 11887: R=areabezier([V0,V[1],V[2]]|option_list=Opt);
! 11888: V0=compdf([o,[o,imag,o_]],o_,F);
! 11889: return R+@i*areabezier([V0,V[1],V[2]]|option_list=Opt);
! 11890: }
! 11891: if(type(V[0])!=4 || vars(V[0][0])!=0){
! 11892: Mx=[-2.0^(512),2.0^(512)];
! 11893: I=length(V[2]);
! 11894: if(type(V[2][I-1])==7||type(V[2][I-2])==7){ /* infinite interval */
! 11895: if(type(Ec=getopt(exp))==1) R=cmpf([V[0],V[2]]|exp=Ec);
! 11896: else R=cmpf([V[0],V[2]]);
! 11897: V=[R,V[1],[0,1]];
! 11898: }
! 11899: if(type((Int=getopt(int)))==1 && type(V[0])<4 && (V1=V[1])>=0){
! 11900: if(Int==2&&iand(V1,1)) V1++;
! 11901: if(!V1) V1=32;
! 11902: Opt=cons(["raw",1],getopt());
! 11903: W=xygraph(V[0],V[1],V[2],Mx,Mx|option_list=Opt);
! 11904: SS=W[0][1];
! 11905: for(S0=S1=0,I=0,L=W;L!=[] && I<=V1;I++, L=cdr(L)){
! 11906: if(iand(I,1)) S1+=car(L)[1];
! 11907: else S0+=car(L)[1];
! 11908: if (I==V1) SS+=car(L)[1];
! 11909: }
! 11910: VV=deval(V[2][1]-V[2][0]);
! 11911: if(Int==2)
! 11912: return (2*S0+4*S1-SS)*VV/(3*V1);
! 11913: else
! 11914: return (2*S0+2*S1-SS)*VV/(2*V1);
! 11915: }
! 11916: Opt=cons(["opt",0],getopt());
! 11917: V=xygraph(V[0],V[1],V[2],Mx,Mx|option_list=Opt);
! 11918: }
! 11919: if(type(V[0][0])!=4) V=os_md.lbezier(V);
! 11920: for(S=0; V!=[]; V=cdr(V)){
! 11921: B=tobezier(car(V));
! 11922: P=intpoly(B[1]*diff(B[0],t),t);
! 11923: S+=mysubst(P,[t,1]);
! 11924: }
! 11925: return S;
! 11926: }
! 11927:
1.3 takayama 11928: def velbezier(V,L)
11929: {
11930: if(L==0) L=[t,0,1];
11931: else L=[(length(L)==3)?L[2]:t,L[0],L[1]];
11932: for(R=[],II=length(V)-1;II>=0;II--){
11933: S=fmmx(diff(V[II],L[0]|dif=1),L|dif=1);
11934: for(U=0;S!=[];S=cdr(S)) if((T=abs(car(S)[1]))>U) U=T;
11935: R=cons(U,R);
11936: }
11937: return R;
11938: }
11939:
1.4 ! takayama 11940: def ptbezier(V,L)
! 11941: {
! 11942: if(type(V[0])==4&&type(V[0][0])!=4) V=lbezier(V);
! 11943: K=length(V);
! 11944: if(type(L)<2){
! 11945: if(L<0) return K;
! 11946: if(L>=K-1) L=[K-1,1];
! 11947: else{
! 11948: L0=floor(L);
! 11949: if(L0>=K-1) L0=K-1;
! 11950: L=[L0,L-L0];
! 11951: }
! 11952: }
! 11953: if(L[0]>=0) B=V[L[0]];
! 11954: else B=V[K+L[0]];
! 11955: B=tobezier(B);
! 11956: BB=[diff(B[0],t),diff(B[1],t)];
! 11957: return [subst(B,t,L[1]),subst(BB,t,L[1])];
! 11958: }
! 11959:
1.3 takayama 11960: def ptcombezier(P,Q,T)
11961: {
11962: if(type(T)<2){
11963: if(T<2) T=20; /* default */
11964: return ptcombezier(P,Q,[0,0,1,T]);
11965: }
11966: V=T[2]/2;;
11967: /* mycat(["IN",P,Q,T]); */
11968: PB=tobezier(P|div=1);
11969: PP=[ptbbox(PB[0]),ptbbox(PB[1])];
11970: QB=tobezier(Q|div=1);
11971: QQ=[ptbbox(QB[0]),ptbbox(QB[1])];
11972: for(L=[],I=0;I<2;I++){
11973: for(J=0;J<2;J++){
11974: /* mycat([I,J,PP[I],QQ[J]]); */
11975: if(!iscombox(PP[I],QQ[J])) continue;
11976: if(T[3]<=1) return
11977: [[T[0]+(I+0.5)*V,T[1]+(J+0.5)*V,
11978: [(PP[I][0][0]+PP[I][0][1])/2,(PP[I][1][0]+PP[I][1][1])/2]]];
11979: else{
11980: #if 0
11981: U=PB[I][0];V=PB[I][length(PB[I])-1];
11982: if(abs(A=(U[0]-V[0]))>abs(B=(U[1]-V[I])))
11983: M=mat([1,0],[-B/A,1]);
11984: else if(U!=V)
11985: M=mat([1,-A/B],[0,1]);
11986: else continue;
11987: if(!iscombox(ptbox(ptaffine(M,PB[I])),ptbox(ptaffine(M,QB[J])))) continue;
11988: #endif
11989:
11990: LN=ptcombezier(PB[I],QB[J],[T[0]+I*V,T[1]+J*V,V,T[3]-1]);
11991: #if 0
11992: L=append(LN,L);
11993: #else
11994: if(LN!=[]){
11995: if(L==[]) L=LN;
11996: else for(VV=3*V/2^T[3];LN!=[];LN=cdr(LN)){
11997: for(LT=L;LT!=[];LT=cdr(LT)){
11998: if(abs(car(LN)[0]-car(LT)[0])<VV&&abs(car(LN)[1]-car(LT)[1])<VV) break;
11999: }
12000: }
12001: }
12002: if(length(L)>32){ /* Too many points */
12003: I=J=2;
12004: }
12005: #endif
12006: }
12007: }
12008: }
12009: return L;
12010: }
12011:
12012:
12013: def ptcombz(P,Q,T)
12014: {
12015: if(P==Q) Q=0;
12016: if(type(P[0][0])!=4) P=P0=lbezier(P);
12017: if(Q==0){
12018: Q=P;F=1;
12019: }
12020: else if(type(Q[0][0])!=4) Q=lbezier(Q);
12021: for(R=[],I=0,Q0=Q;P!=[];P=cdr(P),I++){
12022: for(J=0,Q=Q0;Q!=[];Q=cdr(Q),J++){
12023: if(F==1&&I<J+2) break;
12024: if((RT=ptcombezier(car(P),car(Q),T))!=[]){
12025: RT=cons([I,J],RT);
12026: R=cons(RT,R);
12027: }
1.1 takayama 12028: }
12029: }
1.3 takayama 12030: if((Red=getopt(red))==1||Red==2){
12031: if(type(M=getopt(prec))!=1) M=12;
12032: for(F=0,T=P0;T!=[];T=cdr(T)){
12033: for(S=car(T);S!=[];S=cdr(S)){
12034: if(type(ST=car(S))==4 && type(ST[0])<2){
12035: if(F++==0){
12036: X0=X1=ST[0];Y0=Y1=ST[1];
12037: }else{
12038: if(ST[0]<X0) X0=ST[0];
12039: if(ST[0]>X1) X1=ST[0];
12040: if(ST[1]<Y0) Y0=ST[1];
12041: if(ST[1]>Y1) Y1=ST[1];
12042: }
12043: }
12044: }
1.1 takayama 12045: }
1.3 takayama 12046: V0=(X1-X0)/2^M;V1=(Y1-Y2)/2^M;
12047: for(RR=[],RT=R;RT!=[];RT=cdr(RT))
12048: for(S=cdr(car(RT));S!=[];S=cdr(S)) RR=cons(car(S)[2],RR);
12049: RR=ltov(RR);L=length(RR);
12050: for(I=0;I<L;I++)
12051: for(K=1,J=I+1;K!=0&&J<L;J++)
12052: if(abs(RR[I][0]-RR[J][0])<V0 && abs(RR[I][1]-RR[J][1])<V1) RR[I]=K=0;
12053: R0=[];
12054: I=L-1;
12055: if(Red==2){
12056: for(;I>=0;I--) if(RR[I]!=0) R0=cons(RR[I],R0);
1.1 takayama 12057: }else{
1.3 takayama 12058: for(RT=R;RT!=[];RT=cdr(RT)){
12059: R00=[car(RT)[0]];
12060: for(S=cdr(car(RT));S!=[];S=cdr(S),I--)
12061: if(RR[L-I-1]!=0) R00=cons(car(S),R00);
12062: if(length(R00)>1) R0=cons(reverse(R00),R0);
1.1 takayama 12063: }
12064: }
1.3 takayama 12065: return R0;
1.1 takayama 12066: }
1.3 takayama 12067: return reverse(R);
1.1 takayama 12068: }
12069:
1.3 takayama 12070: def draw_bezier(ID,IDX,B)
1.1 takayama 12071: {
1.3 takayama 12072: if(getopt(init)==1){
1.4 ! takayama 12073: S_FDot=0;
1.3 takayama 12074: return;
1.1 takayama 12075: }
1.3 takayama 12076: if(type(Col=getopt(col))!=1&&Col!=0) Col=0;
12077: Dot=0;
12078: if(type(Opt=getopt(opt))==7){
12079: if(!Col){
12080: Col=drawopt(Opt,0);
12081: if(Col==-1) Col=0;
12082: }
12083: T=drawopt(Opt,3);
12084: if(iand(T,2)){
12085: M=iand(T,1)?1/8:1/4;
12086: for(C=Col,Col=I=0;I<20;I+=8)
12087: Col+=ishift(0xff-(floor((0xff-iand(0xff,ishift(C,I)))*M)),-I);
12088: }
12089: if(iand(T,4)) Dot=2; /* 2 or 3 or 4 or 6 */
12090: else if(iand(T,8)) Dot=4;
12091: }
1.4 ! takayama 12092: if(type(B)==4 && (type(B[0])==4||type(B[0])==5) && type(B[0][0])<2) B=lbezier(B);
! 12093: else if(type(B)==5) B=[vtol(B)];
1.3 takayama 12094: for(;B!=[];B=cdr(B)){
12095: if(vars(F=car(B))==[]){
1.4 ! takayama 12096: #if 1
1.3 takayama 12097: if(length(F)<3&&!Dot){ /* line or point */
12098: if(length(F)>0){
12099: G=[rint(F[0][0]),rint(F[0][1])];
12100: if(length(F)==1) draw_obj(ID,IDX,G,Col);
12101: else{
12102: G=[G[0],G[1],rint(F[1][0]),rint(F[1][1])];
12103: draw_obj(ID,IDX,G,Col);
12104: }
12105: }
12106: continue;
12107: }
1.4 ! takayama 12108: #endif
! 12109: if(length(F)<2) continue;
1.3 takayama 12110: F=tobezier(F);
12111: }
12112: N=velbezier(F,0);
12113: N=(N[0]>N[1])?N[0]:N[1];
1.4 ! takayama 12114: if(!N) N=1;
! 12115: for(I=0;I<=N;I++,S_FDot++){
! 12116: if(Dot!=iand(S_FDot,Dot)) continue;
1.3 takayama 12117: G=subst(F,t,I/N);
12118: G=[rint(G[0]),rint(G[1])];
12119: if(G!=G0){
12120: draw_obj(ID,IDX,G,Col);
12121: G0=G;
12122: }
1.1 takayama 12123: }
12124: }
1.4 ! takayama 12125: if(S_FDot-->=2^32) S_FDot=0;
1.3 takayama 12126: return 0;
12127: }
12128:
12129: def lbezier(L)
12130: {
12131: if((In=getopt(inv))==1||In==2||In==3){
12132: for(F=0,R=[];L!=[];L=cdr(L)){
12133: LT=car(L);
12134: if(F==car(LT)) R=cons(1,R);
12135: else{
12136: if(R!=[]&&F!=0) R=cons(0,R);
12137: R=cons(G=car(LT),R);
12138: if(In==3) In==2;
12139: }
12140: for(LT=cdr(LT);LT!=[];LT=cdr(LT))
12141: R=cons(car(LT),R);
12142: if((F=car(R))==G&&In==1){
12143: R=cons(-1,cdr(R));
12144: F=0;
12145: }
1.1 takayama 12146: }
1.3 takayama 12147: if(In==3 && car(R)==G) R=cons(-1,cdr(R));
12148: return reverse(R);
1.1 takayama 12149: }
1.3 takayama 12150: for(F=0,RT=R=[];L!=[];L=cdr(L)){
1.4 ! takayama 12151: if(type(T=car(L))==4||type(T)==5){
1.3 takayama 12152: if(F==0){
12153: FT=T;F=1;
1.1 takayama 12154: }
1.3 takayama 12155: RT=cons(T,RT);
12156: }else if(T==0){
12157: if(RT==[]) R=cons(reverse(RT),R);
12158: RT=[];F=0;
12159: }else if(T==1){
12160: if(RT!=[]){
12161: R=cons(reverse(RT),R);
12162: RT=[car(RT)];
12163: }else{
12164: RT=[];F=0;
1.1 takayama 12165: }
1.3 takayama 12166: }else if(T==-1){
12167: RT=cons(FT,RT);
12168: R=cons(reverse(RT),R);
12169: RT=[];F=0;
1.1 takayama 12170: }
12171: }
1.3 takayama 12172: if(RT!=[]) R=cons(reverse(RT),R);
12173: return reverse(R);
12174: }
12175:
12176:
12177: def xybezier(L)
12178: {
12179: if(L==0 || (LS=length(L))==0) return "";
12180: Out=str_tb(0,0);
12181: if(type(VF=getopt(verb))==4){
12182: if(type(car(VF))>3){
12183: VFS=VF;VF=1;
12184: }else{
12185: VFS=cdr(VF);VF=car(VF);
12186: }
12187: }else VFS=["$\\bullet$","$\\times$"];
12188: if(VF!=1 && VF!=2) VF=0;
12189: if(!TikZ){
12190: if(VF) Ob=str_tb(0,0);
12191: T="\n**\\crv{";
12192: if(type(Opt=getopt(opt))==7 && Opt!="") T=T+Opt;
12193: L00=Q=L[I0=0];S=S1="";
12194: for(F=0,I=1;I<=LS;I++){
12195: P=Q;Q=(I==LS)?0:L[I];
12196: if(type(Q)==4){
12197: if(F==0){
12198: S1="";L0=P;F=1;
12199: continue;
12200: }else if(F==1)
12201: F=2;
12202: else if(F==2){
12203: S1=S1+"&";
1.1 takayama 12204: }
1.3 takayama 12205: S1=S1+xypos(P);
12206: if(VF&&length(VFS)>1) str_tb(xyput([P[0],P[1],VFS[1]]),Ob);
12207: }else{
12208: if(Q==0){
12209: if(F>0){
12210: str_tb("{"+xypos(L0)+";"+xypos(P)+T+S1+"}};\n",Out);
12211: if(VF){
12212: str_tb(xyput([L[0][0],L[0][1],VFS[0]]),Ob);
12213: if(VF==1) str_tb(xyput([P[0],P[1],VFS[0]]),Ob);
12214: }
12215: F=0;
1.1 takayama 12216: }
1.3 takayama 12217: }else if(Q==1){
12218: str_tb("{"+xypos(L0)+";"+xypos(P)+T+S1+"}};\n",Out);
12219: if(VF){
12220: str_tb(xyput([L[0][0],L[0][1],VFS[0]]),Ob);
12221: if(VF==1) str_tb(xyput([P[0],P[1],VFS[0]]),Ob);
1.1 takayama 12222: }
1.3 takayama 12223: F=1;
12224: }else if(Q==-1){
12225: if(F==2)
12226: S1=S1+"&";
12227: str_tb("{"+xypos(L0)+";"+xypos(L00)+T+S1+xypos(P)+"}};\n",Out);
12228: if(VF) str_tb(xyput([L[0][0],L[0][1],VFS[0]]),Ob);
12229: F=0;
12230: }
12231: if(F==1){
12232: if(I<LS-1 && type(L[I+1])<2){
12233: if(L[I+1]==-1){
12234: str_tb("{"+xypos(P)+";"+xypos(L00)+T+"}};\n",Out);
12235: }
12236: if(VF) str_tb(xyput([P[0][0],P[0][1],VFS[0]]),Ob);
12237: F=0;
1.1 takayama 12238: }
12239: }
1.3 takayama 12240: while(++I<LS && type(L[I])<2);
12241: if(I>=LS) break;
12242: if(F==1){
12243: Q=P;I--;F=0;
12244: }else L00=Q=L[I];
1.1 takayama 12245: }
12246: }
1.3 takayama 12247: }else{
12248: if(type(T=getopt(cmd))==7){
12249: if(T!="") T="\\"+T;
12250: }else T="\\draw";
12251: if((Rel=getopt(relative))==1) VF=0;
12252: if(VF) Ob=str_tb(0,0);
12253: if(type(Opt=getopt(opt))==7 && Opt!="") T=T+"["+Opt+"]";
12254: Out=str_tb(T,0);
12255: Q=L[0];
12256: for(F=M=0,I=1;I<=LS;I++){
12257: P=Q; Q=(I==LS)?0:L[I];
12258: if(++M>XYLim){
12259: str_tb("\n",Out);M=1;
12260: }
12261: if(type(Q)==4 || type(Q)==5 || type(Q)==7){
12262: if(F==0){
12263: str_tb(" ",Out);
12264: F=1;
12265: }else if(F==1){
12266: str_tb(" .. controls ",Out);
12267: F=2;
12268: }else if(F==2){
12269: str_tb(" and ",Out);
12270: F=2;
12271: }
12272: PP=xypos(P);
12273: if(Rel==1 && F==2) PP="+"+PP;
12274: str_tb(PP,Out);
12275: if(VF&&((F<2)||length(VFS)>1))
12276: str_tb(xyput([P[0],P[1],(F<2)?VFS[0]:VFS[1]]),Ob);
12277: }else{
12278: /* if(I<LS-1) VF=0; */
12279: if(Q==0||Q==1){
12280: PP=xypos(P);
12281: if(Rel==1) PP="+"+PP;
12282: str_tb(((F==0)?" ":((F==1)?" -- ":" .. "))+PP,Out);
12283: if(VF) str_tb(xyput([P[0],P[1],VFS[0]]),Ob);
12284: F=Q;
12285: }else if(Q==-1){
12286: PP=xypos(P);
12287: if(Rel==1) PP="+"+PP;
12288: if(F==1)
12289: str_tb("..controls "+PP+" .. cycle",Out);
12290: else if(F==2)
12291: str_tb(" and "+PP+" .. cycle",Out);
12292: if(VF&&length(VFS)>1) str_tb(xyput([P[0],P[1],VFS[1]]),Ob);
12293: F=0;
12294: }
12295: if(F==1){
12296: if(I<LS-1){
12297: if(L[I+1]==-1){
12298: str_tb(" -- cycle",Out);
12299: I=I+1;
12300: F=0;
12301: }
12302: else if(type(L[I+1])<2) F=0;
1.1 takayama 12303: }
12304: }
1.3 takayama 12305: while(++I<LS && type(L[I])<2);
12306: if(I>=LS) break;
12307: Q=L[I];
1.1 takayama 12308: }
12309: }
1.3 takayama 12310: str_tb(";\n",Out);
1.1 takayama 12311: }
1.3 takayama 12312: if(VF) str_tb(str_tb(0,Ob),Out);
12313: return str_tb(0,Out);
1.1 takayama 12314: }
12315:
12316: def xybox(L)
12317: {
12318: K=length(L);
12319: P=L[0];Q=L[1];
12320: if(K==2)
12321: LL=[ P, [P[0],Q[1]], Q, [Q[0],P[1]] ];
12322: else{
12323: R=L[2];
12324: LL=[ P, R, Q, [P[0]+Q[0]-R[0],P[1]+Q[1]-R[1]] ];
12325: }
1.4 ! takayama 12326: Opt=getopt();
1.1 takayama 12327: SS=getopt(opt);
1.4 ! takayama 12328: if(type(SS)!=7&&!TikZ) Opt=cons(["opt","@{-}"],Opt);
! 12329: Opt=cons(["close",1],Opt);
! 12330: return xylines(LL|option_list=Opt);
1.1 takayama 12331: }
12332:
1.3 takayama 12333: def xyang(S,P,Q,R)
12334: {
12335: Opt=getopt();
12336: if(type(Prec=getopt(prec))!=1) Prec=0;
12337: if(type(Q)>2){
12338: if(R==1||R==-1){ /* 直角 */
12339: P1=ptcommon([Q,P],[-S,0]);
12340: S*=R;
12341: P2=ptcommon([P,P1],[S,@pi/2]);
12342: P3=ptcommon([P1,P2],[S,@pi/2]);
12343: return xylines([P1,P2,P3]|option_list=Opt);
12344: }else if((AR=abs(R))==0||AR==2||AR==3||AR==4){ /* 矢印 */
12345: Ang=myarg([Q[0]-P[0],Q[1]-P[1]]);
12346: if(R<0) Ang+=3.14159;
12347: ANG=[0.7854,0.5236,1.0472];
12348: X=(AR==0)?1.5708:ANG[AR-2];
12349: U=[P[0]+S*dcos(Ang+X),P[1]+S*dsin(Ang+X)];
12350: V=[P[0]+S*dcos(Ang-X),P[1]+S*dsin(Ang-X)]; /* 矢先 */
12351: V=(X==0)?[U,V]:[U,P,V];
12352: if(getopt(ar)==1) V=append([Q,P,0],V); /* 心棒 */
12353: return xylines(V|option_list=Opt);
1.4 ! takayama 12354: }else if(AR>4&&AR<9){
! 12355: Ang=myarg([Q[0]-P[0],Q[1]-P[1]]);
! 12356: ANG=[0.7854,0.5236,0.3927,0.2618];
! 12357: X=ANG[AR-5];
! 12358: U=[P[0]+S*dcos(Ang+X),P[1]+S*dsin(Ang+X)];
! 12359: V=[P[0]+S*dcos(Ang-X),P[1]+S*dsin(Ang-X)];
! 12360: W=ptcommon([P,U],[P,Q]|in=-2);
! 12361: W1=[(U[0]+P[0]+W[0])/3,(U[1]+P[1]+W[1])/3];
! 12362: W2=[(V[0]+P[0]+W[0])/3,(V[1]+P[1]+W[1])/3];
! 12363: L=[U,W1,P,1,W2,V];
! 12364: if(getopt(ar)==1) L=append([Q,P,0],L);
! 12365: if(type(Sc=getopt(scale))>0){
! 12366: if(type(Sc)==1) Sc=[Sc,Sc];
! 12367: L=ptaffine(diagm(2,Sc),L);
! 12368: }
! 12369: Opt=getopt(opt);
! 12370: if(type(Opt)>0) OL=[["opt",Opt]];
! 12371: else OL=[];
! 12372: if(getopt(proc)==1) return append([2,OL],L);
! 12373: S=xybezier(L|optilon_list=OL);
! 12374: if(getopt(dviout)!=1) return S;
! 12375: dviout(S);
! 12376: return 1;
1.3 takayama 12377: }
12378: }
12379: if(type(Q)<3){
12380: X=deval(Q); Y=deval(R);
12381: }else{
12382: X=myarg([Q[0]-P[0],Q[1]-P[1]]);
12383: Y=myarg([R[0]-P[0],R[1]-P[1]]);
12384: }
12385: if(Prec>2) N=8;
12386: else if(Prec==2) N=6;
12387: else if(Prec==1) N=4;
12388: else N=3;
12389: U=deval(@pi)*2/N;
12390: if(X==Y||Y-X>6.28318){
12391: for(L=[],I=N-1;I>=0;I--) L=cons([P[0]+S*dcos(I*U),P[1]+S*dsin(I*U)],L);
12392: return xylines(L|option_list=append([["curve",1],["close",1]],Opt));
12393: }
12394: for(M=1;(Y-X)/M>U;M++);
12395: for(L=[],I=M+1;I>-2;I--){
12396: Ang=X+(Y-X)*I/M;
12397: L=cons([P[0]+S*dcos(Ang),P[1]+S*dsin(Ang)],L);
12398: }
12399: if(getopt(ar)!=1) return xylines(L|option_list=append([["curve",1],["close",-1]],Opt));
12400: OL=delopt(Opt,["dviout","opt","proc"]);
12401: S=xylines(L|option_list=append([["curve",1],["close",-1],["opt",0]],OL));
12402: T=xylines([P,L[1]]|option_list=cons(["opt",0],OL));
12403: S=ptaffine("close",[S,T]); /* connect curves */
12404: if(getopt(opt)==0) return S;
12405: OL=(type(SS=getopt(opt))>1)?[["opt",SS]]:[];
12406: if(type(T=getopt(proc))==1 && T>=1 && T<=3) return [1,OL,S];
12407: if(OL==[]) S=xybezier(S);
12408: else S=(type(SS)==7)? xybezier(S|opt=SS):xybezier(S|opt=SS[0],cmd=SS[1]);
12409: if(getopt(dviout)==1) return xyproc(S|dviout=1);
12410: return S;
12411: }
12412:
12413: def xyoval(P,L,R)
12414: {
12415: if(type(Arg=getopt(arg))!=4 && type(Arg=getopt(deg))==4){
12416: if(length(Arg)>2)
12417: Arg=[@pi*Arg[0]/180,@pi*Arg[1]/180,@pi*Arg[2]/180];
12418: else
12419: Arg=[@pi*Arg[0]/180,@pi*Arg[1]/180];
12420: }
12421: if(type(Arg)==4){
12422: Arg0=deval(Arg[0]); Arg1=deval(Arg[1]);
12423: if(length(Arg)>2) Arg2=deval(Arg[2]);
12424: if(Arg1<Arg0 || Arg0<-7) return 0;
12425: }
12426: if(type(Prec=getopt(prec))!=0) Prec=0;
12427: if((Ar=getopt(ar))!=1) Ar=0;
12428: L=xyang(L,[0,0],Arg0,Arg1|prec=Prec,opt=0,ar=Ar);
12429: Sc=getopt(scale);
12430: if(type(Sc=getopt(scale))<1) Sc=[1,1];
12431: else if(type(Sc)==1) Sc=[Sc,Sc];
12432: M=mat([1,0],[0,R]);
12433: L=ptaffine(M,L|shift=P);
12434: M=mat([Sc[0],0],[0,Sc[1]]);
12435: L=ptaffine(M,L|arg=Arg2);
12436: if((Opt=getopt(opt))==0) return L;
1.4 ! takayama 12437: Opt=(type(Opt)>1)? [["opt2",Opt]]:[];
1.3 takayama 12438: if(getopt(proc)==1) return [1,Opt,L];
12439: S=xybezier(L|option_list=getopt());
12440: if(getopt(dviout)==1){
12441: xyproc(S|dviout=1);
12442: return 1;
12443: }
12444: return S;
12445: }
12446:
1.1 takayama 12447: def xycirc(P,R)
12448: {
12449: ST=getopt(opt);
1.3 takayama 12450: if(type(ST)<0) ST="";
1.1 takayama 12451: if(type(Arg=getopt(arg))!=4 && type(Arg=getopt(deg))==4){
12452: Arg=[@pi*Arg[0]/180,@pi*Arg[1]/180];
12453: }
1.3 takayama 12454: /* Is it OK?
12455: if(TikZ==0 && XYcm==1){
12456: R*=10; P=[P[0]*10,P[1]*10];
12457: }
12458: */
12459: if(type(Arg)==4){
1.1 takayama 12460: Arg0=deval(Arg[0]); Arg1=deval(Arg[1]);
12461: if(Arg1<=Arg0 || Arg0<-7 || Arg1-Arg0>7) return 0;
12462: if(type(ST)==7)
1.3 takayama 12463: S=xygraph([R*cos(x)+P[0],R*sin(x)+P[1]],-4,[Arg0,Arg1],[P[0]-R-1,P[0]+R+1],
1.1 takayama 12464: [P[1]-R-1,P[1]+R+1]|opt=ST);
12465: else
12466: S=xygraph([R*cos(x)+P[0],R*sin(x)+P[1]],-4,[Arg0,Arg1],[P[0]-R-1,P[0]+R+1],
12467: [P[1]-R-1,P[1]+R+1]);
12468: if(getopt(close)==1){
12469: S=S+xyline([0,0],
12470: [deval(subst(R*cos(x)+P[0],x,Arg0)),deval(subst(R*sin(x)+P[0],x,Arg0))]);
12471: S=S+xyline([0,0],
12472: [deval(subst(R*cos(x)+P[0],x,Arg1)),deval(subst(R*sin(x)+P[0],x,Arg1))]);
12473: }
12474: return S;
12475: }
1.3 takayama 12476: if(TikZ){
12477: SP="";
12478: if(length(P)>2) SP=P[2];
12479: if(type(SP)!=7) SP="$"+my_tex_form(SP)+"$";
12480: if(R==0){
12481: if(ST!="") ST=ST+",";
12482: return "\\node ["+ST+"circle,draw]"+xypos([P[0],P[1]])+ "{"+SP+"};\n";
12483: }
12484: if(type(R)!=7) R=rtostr((R+0.1)-0.1);
12485: if(ST!="") ST="["+ST+"]";
12486: S="\\draw "+ST+xypos([P[0],P[1]])+" circle [radius="+R+"]";
12487: if(SP!="") S=S+" node at"+xypos([P[0],P[1]])+" {"+SP+"}";
12488: return S+";\n";
12489: }
1.1 takayama 12490: S="{"+xypos([P[0],P[1]]);
12491: if(length(P)>2){
12492: SP=P[2];
12493: if(type(P)!=7) SP=my_tex_form(SP);
12494: S=S+" *+{"+SP+"}";
12495: }
12496: S =S+" *\\cir";
12497: if(R!=0){
12498: R=(R+0.1)-0.1;
1.3 takayama 12499: S=S+"<"+rtostr(R)+((XYcm)?"cm>":"mm>");
1.1 takayama 12500: }
12501: S = S+"{";
12502: if(type(ST)==7) S=S+ST;
12503: return S+"}};\n";
12504: }
12505:
12506: def ptaffine(M,L)
12507: {
1.4 ! takayama 12508: if(type(L)!=4&&type(L)!=5){
1.3 takayama 12509: erno(0);return L;
12510: }
1.4 ! takayama 12511: if(type(M)==7){ /* connect lists */
1.3 takayama 12512: if(M=="reverse"){
12513: for(LO=LR=[],F=0,LT=L; LT!=[]; LT=cdr(LT)){
12514: if(type(P=car(LT))==4 || type(P)==7){
12515: LR=cons(P,LR);
12516: continue;
12517: }else{
12518: if(P==-1){
12519: LL=reverse(LR);
12520: LO=append(reverse(cons(-1,cdr(LL))),LO);
12521: LO=cons(car(LL),LO);
12522: LR=[];
12523: }else if(P==1){
12524: LR=cons(car(LR),cons(1,cdr(LR)));
12525: }else if(P==0 || length(LT)==1){
12526: if(LO!=[] && car(LO)!=0 && (type(car(LO))==4 || car(LO)==1))
12527: LO=cons(0,LO);
12528: LO=append(LR,LO);
12529: if(length(LT)>1&&length(LO)>0&&car(LO)!=0) LO=cons(0,LO);
12530: LR=[];
12531: }
12532: }
12533: }
12534: return append(LR,LO);
12535: }
12536: if(type(L[0][0])!=4) L=[L];
12537: LO=[];
12538: if(M=="connect" || M=="close" || M=="loop"){
12539: Top=car(car(L));
12540: for(K=1,LL=L; LL!=[]; LL=cdr(LL)){
12541: for(F=0,LT=car(LL); LT!=[]; LT=cdr(LT),F++){
12542: if((LTT=car(LT))==0) LTT=1;
12543: if(F==0 && LO!=[]){
12544: LO0=car(LO);
12545: if(car(LO)!=1&&length(LO)>1) LO=cons(1,LO);
12546: if(LTT==LO0) continue;
12547: else LO=cons(1,cons(LTT, LO));
12548: }else LO=cons(LTT, LO);
12549: }
12550: }
12551: if(M!="connect"){
12552: if(Top==car(LO) || car(LO)==1 || M=="loop")
12553: LO=cons(-1,cdr(LO));
12554: else
12555: LO=cons(-1,cons(1,LO));
12556: }
12557: return reverse(LO);
12558: }
12559: if(M=="union"){
12560: for(LL=reverse(L); LL!=[]; LL=cdr(LL)){
12561: if(LO!=[]) LO=cons(0,LO);
12562: LO=append(car(LL),LO);
12563: }
12564: L=LO;
12565: }
12566: return L;
12567: }
1.1 takayama 12568: if(type(Arg=getopt(deg))==1)
12569: Arg=@pi*Arg/180;
12570: else Arg=getopt(arg);
12571: if(type(Arg)==2) Arg=deval(Arg);
12572: if(type(Arg)==1)
12573: M=M*mat([dcos(Arg),-dsin(Arg)],[dsin(Arg),dcos(Arg)]);
12574: if(type(Sft=getopt(org))==4){
12575: Sft=ltov(Sft);
12576: Sft-=M*Sft;
1.3 takayama 12577: }else Sft=ltov([0,0]);
1.1 takayama 12578: if(type(V=getopt(shift))==4)
12579: Sft+=ltov(V);
1.3 takayama 12580: if(getopt(proc)==1){
12581: if(Sft!=0&<ov(Sft)!=[0,0]) Sft=[["shift",vtol(Sft)]];
12582: else Sft=[];
12583: for(LO=[],LT=L;LT!=[];LT=cdr(LT)){
12584: if(type(car(T=car(LT)))<2){
1.4 ! takayama 12585: if((P=car(T))==0){ /* exedraw 0 */
1.3 takayama 12586: 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]]];
12587: V=ptbbox(ptaffine(M,V|option_list=Sft));
12588: L1=cdr(cdr(cdr(T)));
12589: LO=cons(append([0,V[0],V[1]],L1),LO);
12590: continue;
1.4 ! takayama 12591: }else if(P==1){ /* exedraw 1 */
1.3 takayama 12592: L1=[];
12593: for(TT=cdr(cdr(T));TT!=[];TT=cdr(TT)){
12594: D=car(TT);
12595: if(type(D[0][0])==4){
12596: for(L2=[],DT=D;DT!=[];DT=cdr(DT))
12597: L2=cons(ptaffine(M,car(DT)|option_list=Sft),L2);
12598: L1=cons(reverse(L2),L1);
12599: }else L1=cons(ptaffine(M,D|option_list=Sft),L1);
12600: }
12601: LO=cons(append([1,T[1]],reverse(L1)),LO);
12602: continue;
12603: }else if(P>=2 && P<=5){
12604: L1=ptaffine(M,cdr(cdr(T))|optilon_list=Sft);
12605: LO=cons(append([P,T[1]],L1),LO);
12606: continue;
12607: }
12608: }
12609: LO=cons(T,LO);
12610: }
12611: return reverse(LO);
12612: }
1.4 ! takayama 12613: F=0;
! 12614: if(type(L)==4){
! 12615: for(LT=L; LT!=[]; LT=cdr(LT)){
! 12616: if((T=type(car(LT)))==4||T==5){
! 12617: F=1; break;
! 12618: }
1.1 takayama 12619: }
12620: }
12621: if(F==0) return (Sft==0)?ptaffine(M,[L])[0]:ptaffine(M,[L]|shift=vtol(Sft))[0];
12622: for(LO=[],LT=L; LT!=[]; LT=cdr(LT)){
1.3 takayama 12623: if(((T=type(P=car(LT)))!=4 && T!=5)||type(P[0])>3) LO=cons(P,LO);
12624: else{
12625: if(T==4) P=ltov(P);
12626: V=M*P;
1.1 takayama 12627: if(Sft!=0) V+=Sft;
1.3 takayama 12628: if(T==4) V=vtol(V);
12629: LO=cons(V,LO);
1.1 takayama 12630: }
12631: }
12632: return reverse(LO);
12633: }
12634:
12635: def ptlattice(M,N,X,Y)
12636: {
12637: if(type(S=getopt(scale))!=1) S=1;
12638: if(type(Cond=getopt(cond))!=4) Cond=[];
12639: Line=getopt(line);
12640: if(Line==1 || Line==2) F=newmat(M,N);
12641: else Line=0;
12642: if(type(Org=getopt(org))==4) Org=ltov(Org);
12643: else Org=newvect(length(X));
12644: X=ltov(X); Y=ltov(Y);
12645: for(L=[],I=M-1;I>=0;I--){
12646: for(P0=P1=0,J=N-1;J>=0;J--){
12647: P=Org+I*X+J*Y;
12648: for(C=Cond; C!=[]; C=cdr(C))
1.4 ! takayama 12649: if(subst(car(C),x,P[0],y,P[1])<0) break;
! 12650: if(C!=[]) continue;
1.1 takayama 12651: if(Line) F[I][J]=1;
12652: else L=cons(vtol(S*P),L);
12653: }
12654: }
12655: if(Line==0) return L;
12656: for(I=M-1;I>=0;I--){
12657: for(T0=0,T1=J=N-1;J>=0;J--){
12658: if((K=F[I][J])!=0){
12659: if(T0==0) T0=J;
12660: else T1=J;
12661: }
12662: if(K==0 || T1==0){
12663: if(T1<T0){
12664: L=cons(vtol(S*(Org+I*X+T0*Y)), L);
12665: L=cons(vtol(S*(Org+I*X+T1*Y)), L);
12666: L=cons(0,L);
12667: }
12668: T0=0; T1=N-1;
12669: }
12670: }
12671: }
12672: for(J=N-1;J>=0;J--){
12673: for(T0=0,T1=I=M-1;I>=0;I--){
12674: if((K=F[I][J])!=0){
12675: if(T0==0) T0=I;
12676: else T1=I;
12677: }
12678: if(K==0 || T1==0){
12679: if(T1<T0){
12680: L=cons(vtol(S*(Org+T0*X+J*Y)), L);
12681: L=cons(vtol(S*(Org+T1*X+J*Y)), L);
12682: L=cons(0,L);
12683: }
12684: T0=0; T1=M-1;
12685: }
12686: }
12687: }
12688: return cdr(L);
12689: }
12690:
12691: def ptpolygon(N,R)
12692: {
12693: if(type(S=getopt(scale))!=1) S=1;
12694: if(type(Org=getopt(org))!=4) Org=[0,0];
1.3 takayama 12695: Pi=deval(@pi);
1.1 takayama 12696: if(type(Arg=getopt(deg))==1)
1.3 takayama 12697: Arg=Pi*Arg/180;
1.1 takayama 12698: else Arg=getopt(arg);
12699: if(type(Arg)==2) Arg=deval(Arg);
12700: if(type(Arg)!=1) Arg=0;
12701: Arg -= Pi*(1/2+1/N);
12702: D=Pi*2/N;
12703: for(L=[],I=N-1; I>=0; I--)
12704: L=cons([S*(Org[0]+R*dcos(Arg+I*D)),S*(Org[1]+R*dsin(Arg+I*D))],L);
12705: return L;
12706: }
12707:
12708: def ptwindow(L,X,Y)
12709: {
12710: if(type(S=getopt(scale))==1){
12711: X=[S*X[0],S*X[1]]; Y=[S*Y[0],S*Y[1]];
12712: }
12713: for(R=[],LT=L;LT!=[];LT=cdr(LT)){
12714: P=car(LT);
12715: if(P[0]<X[0] || P[0]>X[1] || P[1]<Y[0] || P[1]>Y[1])
12716: R=cons(0,R);
12717: else R=cons(P,R);
12718: }
12719: return reverse(R);
12720: }
12721:
1.3 takayama 12722: def lninbox(L,W)
12723: {
12724: if(L[0]==L[1]) return 0;
12725: R=newvect(2);C=newvect(2);
12726: for(J=0;J<2;J++){
12727: C[J]=L[1][J]-L[0][J];
12728: if(C[J]!=0){
12729: R[J]=[(W[J][0]-L[0][J])/C[J],(W[J][1]-L[0][J])/C[J]];
12730: if(R[J][0]>R[J][1]) R[J]=[R[J][1],R[J][0]];
12731: }
12732: }
12733: if(R[0]==0) R[0]=R[1];
12734: if(R[1]==0) R[1]=R[0];
12735: S0=(R[0][0]<R[1][0])?R[1][0]:R[0][0];
12736: S1=(R[0][1]<R[1][1])?R[0][1]:R[1][1];
12737: if(getopt(in)==1){
12738: if(S0<0) S0=0;
12739: if(S1>1) S1=1;
12740: }
12741: if(S0>S1) return 0;
12742: 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]];
12743: }
12744:
12745: def ptbbox(L)
12746: {
12747: J=length(L[0]);
12748: if((Box=getopt(box))==1){
12749: for(R=[],I=0;I<J;I++){
12750: P=car(LT=L)[I][0];Q=car(LT)[I][1];
12751: for(;LT!=[];LT=cdr(LT)){
1.4 ! takayama 12752: if((type(T=car(LT))==4 || type(T)==5) && length(T)==J){
1.3 takayama 12753: if(T[I][0]<P) P=T[I][0];
12754: if(T[I][1]>Q) Q=T[I][1];
12755: }
12756: }
12757: R=cons([P,Q],R);
12758: }
12759: }else if(type(Box)==4) return ptbbox([ptbbox(L),Box]|box=1);
12760: else{
12761: for(R=[],I=0;I<J;I++){
12762: P=Q=car(LT=L)[I];LT=cdr(LT);
12763: for(;LT!=[];LT=cdr(LT)){
1.4 ! takayama 12764: if((type(T=car(LT))==4||type(T)==5) && type(T[0])<2 && length(T)==J){
1.3 takayama 12765: if((V=T[I])<P) P=V;
12766: else if(V>Q) Q=V;
12767: }
12768: }
12769: R=cons([P,Q],R);
12770: }
12771: }
12772: return reverse(R);
12773: }
12774:
12775: def iscombox(S,T)
12776: {
12777: for(;S!=[];S=cdr(S),T=cdr(T))
12778: if(car(S)[0]>car(T)[1] || car(S)[1]<car(T)[0]) return 0;
12779: return 1;
12780: }
1.1 takayama 12781:
12782: def ptcopy(L,V)
12783: {
12784: if(type(V[0])!=4) V=[V];
12785: for(F=0,LL=[]; V!=[]; V=cdr(V)){
12786: if(F) LL=append(LL,[0]);
12787: F++;
12788: LL=append(LL,ptaffine(1,L|shift=car(V)));
12789: }
12790: }
12791:
12792: def average(L)
12793: {
12794: L=os_md.m2l(L|flat=1);
12795: M0=M1=car(L);
12796: for(I=SS=0, LT=L; LT!=[]; LT=cdr(LT), I++){
12797: S+=(V=car(LT));
12798: SS+=V^2;
12799: if(V<M0) M0=V;
12800: else if(V>M1) M1=V;
12801: }
12802: SS=dsqrt(SS/I-S^2/I^2);
12803: S=((S+0.1)-0.1)/I;
12804: return [S,SS,I,M0,M1];
12805: }
12806:
12807: def m2ll(M)
12808: {
12809: for(R=[],I=size(M)[0]-1; I>=0; I--)
12810: R=cons(vtol(M[I]),R);
12811: return R;
12812: }
12813:
12814: def madjust(M,W)
12815: {
12816: if(type(Null=getopt(null))<0) Null=0;
12817: if(type(M)==4 && type(M[0])==4){
12818: M=lv2m(M|null=Null);
12819: return m2ll(madjust(M,W|null=Null));
12820: }
12821: S=size(M);
12822: if(W<0){
12823: W=-W;
12824: T0=ceil(S[0]/W);
12825: T1=S[1]*W;
12826: N=newmat(T0,T1);
12827: for(I=0; I<T0; I++){
12828: for(K=0; K<W; K++){
12829: II=K*T0+I;
12830: for(J=0; J<S[1]; J++)
12831: N[I][S[1]*K+J]=(II<S[0])?M[II][J]:Null;
12832: }
12833: }
12834: }else{
12835: T1=W;
12836: T0=S[0]*(D=ceil(S[1]/T1));
12837: N=newmat(T0,T1);
12838: for(K=0; K<D; K++){
12839: for(J=0; J<W;J++){
12840: JJ=W*K+J;
12841: for(I=0; I<S[0]; I++)
12842: N[S[0]*K+I][J]=(JJ<S[1])?M[I][JJ]:Null;
12843: }
12844: }
12845: }
12846: return N;
12847: }
12848:
1.3 takayama 12849: def texcr(N)
12850: {
12851: if(!isint(N) || N<0 || N>31) return N;
12852: S=(iand(N,8))? "\\allowdisplaybreaks":"";
12853: if(iand(N,2)) S=S+"\\\\";
12854: if(iand(N,16)) S=S+"\\pause";
12855: if(iand(N,1)) S=S+"\n";
12856: if(iand(N,4)) S=S+"& ";
12857: else if(!iand(N,1)) S=S+" ";
12858: return S;
12859: }
12860:
1.1 takayama 12861: def ltotex(L)
12862: {
12863: /* extern TeXLim; */
12864:
12865: if(type(L)==5)
12866: L = vtol(L);
12867: if(type(L) != 4)
12868: return my_tex_form(L);
12869: Opt=getopt(opt);
12870: Pre=getopt(pre);
1.3 takayama 12871: if(type(Var=getopt(var))<1) Var=0;
12872: Cr2="\n";
12873: if(type(Cr=getopt(cr))==4){
12874: Cr2=Cr[1];Cr=Cr[0];
12875: }
12876: if(isint(Cr)) Cr=texcr(Cr);
12877: if(type(Cr)!=7) Cr="\\\\\n & "; /* Cr=7 */
12878: if(type(Opt)==7) Opt=[Opt];
1.1 takayama 12879: if(type(Opt)!=4)
12880: Op = -1;
12881: else{
12882: Op=findin(Opt[0],["spt","GRS","Pfaff","Fuchs","vect","cr","text","spts","spts0",
1.3 takayama 12883: "dform","tab", "graph","coord"]);
1.1 takayama 12884: Opt=cdr(Opt);
12885: }
12886: if(Op==0){ /* spt */
12887: Out = str_tb("\\left\\{\n ",0);
12888: for(CC=0; L!=[]; L=cdr(L), CC++){
12889: if(CC>0) str_tb(",\\, ",Out);
12890: TP=car(L);
12891: if(Op!=0)
12892: str_tb(my_tex_form(TP),Out);
12893: else if(TP[0]==1)
12894: str_tb(my_tex_form(TP[1]),Out);
12895: else
12896: str_tb(["[", my_tex_form(TP[1]), "]_", rtotex(TP[0])],Out);
12897: }
12898: str_tb("%\n\\right\\}\n",Out);
12899: }else if(Op==1){ /* GRS */
12900: Out = string_to_tb("\\begin{Bmatrix}\n");
12901: if(type(Pre)==7) str_tb(Pre,Out);
12902: MC=length(M=ltov(L));
12903: for(ML=0, I=length(M); --I>=0; ){
12904: if(length(M[I]) > ML) ML=length(M[I]);
12905: }
12906: for(I=0; I<ML; I++){
12907: for(CC=J=0; J<MC; J++, CC++){
12908: if(length(M[J]) <= I){
12909: if(CC > 0) str_tb(" & ",Out);
12910: }else if(M[J][I][0] <= 1){
12911: if(M[J][I][0] == 0) str_tb(" & ",Out);
12912: else
12913: str_tb([(!CC)?" ":" & ", my_tex_form(M[J][I][1])], Out);
12914: }else
12915: str_tb([((!CC)?" [":" & ["), my_tex_form(M[J][I][1]), "]_",
12916: rtotex(M[J][I][0])], Out);
12917: }
12918: str_tb((I<ML-1)?"\\\\\n":"\n", Out);
12919: }
12920: str_tb("\\end{Bmatrix}",Out);
12921: }else if(Op==2){ /* Pfaff */
12922: V=monototex(Opt[0]);
12923: Out = string_to_tb("d"+V+"= \\Biggl(");
12924: Opt=cdr(Opt);
12925: II=length(Opt);
12926: for(I=0; I<II; I++){
12927: str_tb([(I>0)?" + ":" ",mtotex(L[I]),"\\frac{d",monototex(Opt[I]),"}{",
12928: my_tex_form(Opt[I]),(I==II-1)?"}\n":"}\n\\\\&\n"],Out);
12929: }
12930: str_tb(["\\Biggr)",V,"\n"],Out);
12931: }else if(Op==3){ /* Fuchs */
12932: Out = string_to_tb("\\frac{d");
12933: V=my_tex_form(Opt[0]);
12934: str_tb([V,"}{d",my_tex_form(Opt[1]),"}="] ,Out);
12935: Opt=cdr(Opt); Opt=cdr(Opt);
12936: II=length(Opt);
12937: for(I=0; I<II; I++){
12938: str_tb([(I>0)?" +":"\\Biggl(", " \\frac{",
12939: my_tex_form(L[I]),"}{", my_tex_form(Opt[I]),"}\n"],Out);
12940: }
12941: str_tb(["\\Biggr)",V,"\n"],Out);
12942: }else if(Op==4){ /* vect */
1.3 takayama 12943: Out=str_tb(mtotex(matc(L)|lim=0,var=Var),0);
1.1 takayama 12944: }else if(Op==5 || Op==6){ /* cr or text */
12945: Out = str_tb(0,0);
1.4 ! takayama 12946: if(type(Lim=getopt(lim))!=1) Lim=0;
! 12947: else if(Lim<30&&Lim>0) Lim=TeXLim;
1.1 takayama 12948: Str=getopt(str);
12949: if(length(Opt)==1 && (car(Opt)=="spts" || car(Opt)=="spts0") && type(Str)!=1)
12950: Str=2;
1.4 ! takayama 12951: for(K=I=0; L!=[]; I++, L=cdr(L)){
1.1 takayama 12952: LT=car(L);
1.4 ! takayama 12953: if((!Lim||Op==6)&&I>0) str_tb((Op==5)?Cr:"\n",Out);
1.1 takayama 12954: if(Op==6){
1.3 takayama 12955: if(type(LT)==7){
1.1 takayama 12956: str_tb([LT," "],Out);
12957: I=-1;
12958: continue;
12959: }
12960: str_tb("$",Out);
12961: }
1.4 ! takayama 12962: KK=0;
! 12963: if(Str>0 && type(LT)==4 && Opt!=[])
! 12964: S=ltotex(LT|opt=car(Opt),lim=0,str=Str,cr=Cr2,var=Var);
! 12965: else if(type(LT)==6){
! 12966: if(Lim>0){
! 12967: S=mtotex(LT|var=Var,lim=0,len=1);
! 12968: KK=S[1];
! 12969: S=S[0];
! 12970: }else S=mtotex(LT|var=Var,lim=0);
! 12971: }else if(type(LT)==3 || type(LT)==2)
! 12972: S=fctrtos(LT|TeX=2,lim=0,var=Var);
! 12973: else S=my_tex_form(LT);
! 12974: if(Op!=6&&I>0&&Lim){
! 12975: if(Lim<0){
! 12976: if(I%(-Lim)==0)
! 12977: str_tb((Op==5)?Cr:"\n",Out);
! 12978: }else if((K+=(KK=(KK)?KK:texlen(S)))>Lim){
! 12979: str_tb((Op==5)?Cr:"\n",Out);
! 12980: K=KK;
! 12981: }
! 12982: }
! 12983: str_tb(S,Out);
! 12984: if(Op==6) str_tb("$",Out);
1.1 takayama 12985: }
12986: }else if(Op==7||Op==8){ /* spts, spts0 */
12987: if(type(Lim=getopt(lim))!=1 || (Lim<30 && Lim!=0))
12988: Lim=TeXLim;
12989: Str=getopt(str);
12990: Out = str_tb(0,0);
12991: for(K=0; L!=[]; L=cdr(L)){
12992: LT=car(L);
1.4 ! takayama 12993: KK=0;
1.3 takayama 12994: if(type(LT)==7 && Str==1) S=LT;
12995: else if(type(LT)==3 || type(LT)==2)
12996: S=fctrtos(LT|TeX=2,lim=0,var=Var);
1.4 ! takayama 12997: else if(type(LT)==6){
! 12998: if(Lim){
! 12999: S=mtotex(LT|var=Var,lim=0,len=1);
! 13000: KK=S[1];
! 13001: S=S[0];
! 13002: }else S=mtotex(LT|var=Var,lim=0);
! 13003: }else
1.3 takayama 13004: S=my_tex_form(LT);
1.4 ! takayama 13005: if(Lim!=0){
! 13006: if(!KK) KK=texlen(S);
1.1 takayama 13007: if(K>0 && K+KK>Lim){
13008: str_tb(Cr,Out);
13009: K=0;
13010: }
13011: }
13012: if(K>0){
1.3 takayama 13013: str_tb((Op==7)?"\\ ":" ",Out);
1.1 takayama 13014: if(type(LT)>3 && type(LT)<7) str_tb("%\n",Out);
13015: }
13016: str_tb(S,Out);
13017: K+=KK;
13018: if(OP==7) K++;
13019: }
13020: }else if(Op==9){ /* dform */
13021: Out=str_tb(0,0);
13022: for(I=0;L!=[];L=cdr(L),I++){
13023: for(J=0,LT=car(L); LT!=[]; LT=cdr(LT),J++){
13024: if(J==0){
13025: if((V=car(LT))==0) continue;
13026: if(I>0){
13027: if(type(V)==1){
13028: if(V<0){
13029: str_tb("-",Out);
13030: V=-V;
13031: }
13032: else str_tb("+",Out);
13033: if(V==1 && length(LT)>1) continue;
13034: str_tb(monototex(V),Out);
13035: continue;
13036: }
13037: else str_tb("+",Out);
13038: }
13039: }else if(J>0) str_tb((J>1)?"\\wedge d":"\\,d",Out);
13040: V=monototex(car(LT));
13041: if(V<"-" || V>=".") str_tb(V,Out);
13042: else str_tb(["(",V,")"],Out);
13043: }
13044: }
1.3 takayama 13045: }else if(Op==10 && type(L)==4 && type(car(L))==4){ /* tab */
1.1 takayama 13046: if(type(Null=getopt(null))<0) Null="";
13047: if(getopt(vert)==1){
1.3 takayama 13048: M=lv2m(L|null=Null);
1.1 takayama 13049: L=m2ll(mtranspose(M));
13050: }
1.3 takayama 13051: if(type(W=getopt(width))==1)
13052: L=madjust(L,W|null=Null);
1.1 takayama 13053: LV=ltov(L);
13054: S=length(LV);
13055: for(I=CS=0; I<S; I++)
13056: if(length(LV[I])>CS) CS=length(LV[I]);
13057: if(type(Title=getopt(title))!=7) Title="";
13058: if(type(Vline=getopt(vline))!=4) Vline=[0,CS];
1.3 takayama 13059: else Vline=subst(Vline,z,CS);
13060: for(VV=[],VT=Vline;VT!=[];VT=cdr(VT)){
13061: if(type(T=car(VT))==4 && T[1]>0){
13062: for(I=T[0];I<=CS;I+=T[1]) VV=cons(I,VV);
13063: }else VV=cons(T,VV);
13064: }
13065: Vline=qsort(VV);
1.1 takayama 13066: Out=str_tb("\\begin{tabular}{",0);
1.3 takayama 13067: if(type(Al=getopt(align))==7 && str_len(Al)>1){
1.1 takayama 13068: str_tb(Al,Out);
13069: }else{
1.3 takayama 13070: if(type(Al)!=7 || str_len(Al)<1) Al="r";
1.1 takayama 13071: for(I=0;I<=CS;I++){
13072: if(I!=0) str_tb(Al,Out);
13073: while(Vline!=[] && car(Vline)==I){
13074: str_tb("|",Out);
13075: Vline=cdr(Vline);
13076: }
13077: }
13078: }
13079: str_tb("}",Out);
13080: if(Title!="")
13081: str_tb("\n\\multicolumn{"+rtostr(CS)+"}{c}{"+Title+"}\\\\",Out);
13082: if(type(Hline=getopt(hline))!=4) Hline=[0,S];
1.3 takayama 13083: else Hline=subst(Hline,z,S);
13084: for(VV=[],VT=Hline;VT!=[];VT=cdr(VT)){
13085: if(type(T=car(VT))==4 && T[1]>0){
13086: for(I=T[0];I<=CS;I+=T[1]) VV=cons(I,VV);
13087: }else VV=cons(T,VV);
13088: }
13089: Hline=qsort(VV);
1.1 takayama 13090: while(Hline!=[] && car(Hline)==0){
13091: str_tb(" \\hline\n",Out);
13092: Hline=cdr(Hline);
13093: }
1.3 takayama 13094: if(type(getopt(left))==4) CS++;
13095: if(type(getopt(right))==4) CS++;
13096: if(type(T=getopt(top))==4){
13097: LV=cons(str_times(T,CS),vtol(LV));
13098: S++;
13099: }
13100: if(type(T=getopt(last))==4){
13101: LV=append(vtol(LV),[str_times(T,CS)]);
13102: S++;
13103: }
13104: if(type(T=getopt(left))==4){
13105: T=str_times(T,S);
13106: for(L=[],I=0;I<S;I++){
13107: L=cons(cons(car(T),LV[I]),L);
13108: T=cdr(T);
13109: }
13110: LV=reverse(L);
13111: }
13112: if(type(T=getopt(right))==4){
13113: T=str_times(T,S);
13114: for(L=[],I=0;I<S;I++){
13115: L=cons(append(LV[I],[car(T)]),L);
13116: T=cdr(T);
13117: }
13118: LV=reverse(L);
13119: }
1.1 takayama 13120: for(I=0; I<S; I++){
13121: for(C=0,LT=LV[I];C<CS; C++){
13122: if(LT!=[]){
13123: P=car(LT);
13124: if(type(P)!=7) P="$"+my_tex_form(P)+"$";
13125: if(P!="") str_tb(P,Out);
13126: LT=cdr(LT);
13127: }
13128: if(C<CS-1) str_tb("& ",Out);
13129: }
13130: str_tb("\\\\",Out);
13131: while(Hline!=[] && car(Hline)==I+1){
13132: str_tb(" \\hline",Out);
13133: Hline=cdr(Hline);
13134: }
13135: str_tb("\n",Out);
13136: }
13137: str_tb("\\end{tabular}\n",Out);
13138: }else if(Op==11){ /* graph */
1.3 takayama 13139: Width=8; Hight=3; WRet=1/2; HMerg=0.2;
13140: if(!TikZ){
13141: Width*=10; Height*=10; HMerg*=10;
13142: }
1.1 takayama 13143: if(type(V=getopt(size))==4){
13144: Width=V[0];Hight=V[1];
13145: if(length(V)>2) WRet=V[2];
13146: if(length(V)>3) HMerg=V[3];
13147: }
13148: Val=getopt(value);
13149: if(!isint(Val)) Val=-1;
13150: if(type(Shift=getopt(shift))!=1)
13151: Shift=0;
13152: if(type(Line=getopt(line))!=1){
13153: if(type(Line)==4 && type(Line[0])==1 && (type(Line[1])==7 || type(Line[1])==1)){
13154: Opt=Line[1]; Line=Line[0];
13155: }else Line=0;
13156: }else Opt="@{-}";
13157: if(type(car(L))==4){
13158: LL=L[1]; L=L[0];
13159: }else LL=[];
13160: if(Line==-1){
13161: for(Sum=0, LT=L; LT!=[]; LT=cdr(LT)){
13162: if((S=car(LT))<=0) return 0;
13163: Sum+=S;
13164: }
13165: for(R=[],LT=L;LT!=[];LT=cdr(LT))
13166: R=cons(car(LT)/Sum,R);
13167: R=reverse(R);
13168: Opt0=Opt*2/3;
13169: Out=str_tb(xyproc(1),0);
13170: str_tb(xylines(ptpolygon(6,Opt)|close=1,curve=1),Out);
13171: for(S=0,RT=R,LT=LL;RT!=[];RT=cdr(RT)){
13172: str_tb(xyline([0,0],[Opt*dsin(S*6.2832),Opt*dcos(S*6.2832)]),Out);
13173: T=S+RT[0]/2;
13174: S+=RT[0];
13175: if(LT!=[]){
13176: str_tb(xyput([Opt0*dsin(T*6.2832),Opt0*dcos(T*6.2832),SS]),Out);
13177: LT=cdr(LT);
13178: }
13179: }
13180: str_tb(xyproc(0),Out);
13181: return str_tb(0,Out);
13182: }
13183: if(type(MX=getopt(max))!=1)
13184: MX=0;
13185: if(MX==0){
13186: for(MX=0,LT=L; LT!=[]; LT=cdr(LT))
13187: if(car(LT)>MX) MX=car(LT);
13188: }
13189: MX-=Shift;
13190: S=length(L);
13191: WStep=Width/S;
13192: WWStep=WStep*WRet;
13193: HStep=Hight/MX;
13194: Out=str_tb(xyproc(1),0);
13195: str_tb(xyline([0,0],[Width-WStep+WWStep,0]),Out);
13196: for(I=0,LT=L;LT!=[]; LT=cdr(LT),I++){
13197: XP=WStep*I; XPM=XP+WWStep/2; YP=(car(LT)-Shift)*HStep;
13198: if(Line!=0){
13199: if(I>0)
13200: str_tb(xyarrow([XPM-WStep,YPP],[XPM,YP]|opt=Opt),Out);
13201: if(Val!=0)
13202: str_tb(xyput([XPM,YP+HMerg,car(LT)]),Out);
13203: if(Line==2)
1.3 takayama 13204: str_tb(xyput([XPM,YP,"$\\bullet$"]),Out);
1.1 takayama 13205: YPP=YP;
13206: }else if(YP!=0 || Val==1){
13207: str_tb(xybox([[XP,0],[XP+WWStep,YP]]),Out);
13208: if(Val!=0){
13209: str_tb(xyput([XPM,(YP<0)?(YP-HMerg):(YP+HMerg),car(LT)]),Out);
13210: }
13211: }
1.3 takayama 13212: if(LL!=[]) str_tb(xyput([XPM,-HMerg,LL[I]]),Out);
13213: }
13214: str_tb(xyproc(0),Out);
13215: }else if(Op==12){ /* coord */
13216: Out=str_tb("(",0);
13217: for(LT=L;;){
13218: X=car(LT);
13219: if(type(X)>3 || imag(X)==0) str_tb(my_tex_form(X),Out);
13220: else{
13221: XR=real(X);XI=imag(X);
13222: S=monototex(imag(X));
13223: if(S=="1") S="";
13224: else if(S=="- 1") S="-";
13225: if(getopt(cpx)==2) S=S+"\\sqrt{-1}";
13226: else S=S+"i";
13227: if(XR!=0){
13228: if(str_char(S,0,"-")==0) S=monototex(XR)+S;
13229: else S=monototex(XR)+"+"+S;
13230: }
13231: str_tb(S,Out);
1.1 takayama 13232: }
1.3 takayama 13233: if((LT=cdr(LT))==[]) break;
13234: else str_tb(",",Out);
1.1 takayama 13235: }
1.3 takayama 13236: str_tb(")",Out);
1.1 takayama 13237: }
13238: else return my_tex_form(L);
13239: S = str_tb(0,Out);
13240: return (getopt(small)==1)?smallmattex(S):S;
13241: }
13242:
13243:
13244: def str_tb(L,TB)
13245: {
13246: if(type(TB) == 0) TB = "";
13247: if(L == 0)
13248: return (type(TB) == 7)?string_to_tb(TB):tb_to_string(TB);
13249: if(type(L) == 7)
13250: L = [L];
13251: else if(type(L) != 4){
13252: erno(0);
13253: return 0;
13254: }
13255: if(type(TB) <= 7)
13256: TB = string_to_tb((type(TB)==7)?TB:"");
13257: for(; L != []; L = cdr(L))
13258: write_to_tb(car(L), TB);
13259: return TB;
13260: }
13261:
13262: /*
13263: def redgrs(M,T)
13264: {
13265: L = [zzz];
13266: for(I=S=0,Eq=[],MT=M; MT!=[]; I++, MT=cdr(MT)){
13267: for(J=LS=0, N=car(MT); N!=[]; N=cdr(N)){
13268: X = makev([z,I,z,J]);
13269: L=cons(X,L);
13270: LS += X;
13271: S += car(N)[1]*X;
13272: }
13273: Eq = cons(LS-zzz,Eq);
13274: }
13275: Eq = cons(S-T,Eq);
13276: Sol= lnsol(Eq,L);
13277: for(LS=[],S=Sol; S!=[]; S=cdr(S)){
13278: T=car(S);
13279: if(type(S)!=4) return 0;
13280: LS=cons(car(S)[0],LS);
13281: }
13282: }
13283: */
13284:
13285: /* T=0 : all reduction
13286: =1 : construction procedure
13287: =2 : connection coefficient
13288: =3 : operator
13289: =4 : series expansion
13290: =5 : expression by TeX
13291: =6 : Fuchs relation
13292: =7 : All
13293: =8 : basic
13294: =9 : ""
13295: =10: irreducible
13296: =11: recurrence */
13297: def getbygrs(M, TT)
13298: {
13299: /* extern TeXEq; */
13300:
13301: if(type(M)==7) M=s2sp(M);
13302: if(type(M) != 4 || TT =="help"){
13303: mycat(
13304: ["getbygrs(m,t) or getbygrs(m,[t,s_1,s_2,...]|perm=?,var=?,pt=?,mat=?)\n",
13305: " m: generalized Riemann scheme or spectral type\n",
13306: " t: reduction, construct, connection, series, operator, TeX, Fuchs, irreducible, basic, recurrence,\n",
13307: " All\n",
13308: " s: TeX dviout simplify short general operator irreducible top0 x1 x2 sft\n",
13309: "Ex: getbygrs(\"111,21,111\", [\"All\",\"dviout\",\"operator\",\"top0\"])\n"]);
13310: return 0;
13311: }
13312: if(type(TT) == 4){
13313: T = TT[0];
13314: T1 = cdr(TT);
13315: }else{
13316: T = TT;
13317: T1 = [];
13318: }
13319: if(type(T) == 7)
13320: T = findin(T,["reduction","construct","connection", "operator", "series",
13321: "TeX", "Fuchs", "All", "basic", "", "irreducible", "recurrence"]);
13322: TeX = findin("TeX", T1);
13323: Simp = findin("simplify", T1);
13324: Short = findin("short", T1);
13325: Dviout= findin("dviout", T1);
13326: General=findin("general", T1);
13327: Op =findin("operator", T1);
13328: Irr =findin("irreducible", T1);
13329: Top0 =findin("top0",T1);
13330: X1 =findin("x1",T1);
13331: X2 =findin("x2",T1);
13332: Sft =findin("sft",T1);
13333: Title = getopt(title);
13334: Mat = getopt(mat);
1.3 takayama 13335: if(Mat!=1 || T<0 ||(T!=0&&T!=1&&T!=5&&T!=6&&T!=8&&T!=10&&T!=9)) Mat = 0;
1.1 takayama 13336: if(findin("keep",T1) >= 0)
13337: Keep = Dviout = 1;
13338: else Keep = 0;
13339: if(Dviout >= 0 || T == 5) TeX = 1;
13340: for(J = 0, MM = M; J == 0 && MM != []; MM = cdr(MM)){
13341: for(MI = car(MM); MI != []; MI = cdr(MI)){
13342: if(type(car(MI)) != 1 || car(MI) <= 0){
13343: J = 1; break;
13344: }
13345: }
13346: }
13347:
13348: /* spectral type -> GRS */
13349: if(J == 0){
13350: for(R = [], S = J = 0, MM = M; MM != []; MM = cdr(MM), J++){
13351: MT = qsort(car(MM));
13352: R = cons(reverse(MT), R);
13353: if(J == 1){
13354: S = length(MT)-1;
13355: if(MT[S] > MT[0]) S = 0;
13356: }
13357: }
13358: M = reverse(R);
13359: R = getopt(var);
13360: if(type(R)<1){
13361: for(R = [], I = J-1; I >= 0; I--)
13362: R = cons(asciitostr([97+I]), R);
13363: }
13364: Sft=(Sft>=0)?1:0;
13365: if(General < 0)
13366: Sft=-Sft-1;
13367: M = sp2grs(M,R,Sft|mat=Mat);
13368: }
1.3 takayama 13369: for(M0=[],MM=M;MM!=[];MM=cdr(MM)){ /* change "?" -> z_z */
13370: for(M1=[],Mm=car(MM);Mm!=[];Mm=cdr(Mm)){
13371: Mt=car(Mm);
13372: if(type(Mt)==4 && Mt[1]=="?"){
13373: M1=cons([Mt[0],z_z],M1);
13374: continue;
13375: }else if(type(Mt)==7 && Mt=="?"){
13376: M1=cons(z_z,M1);
13377: continue;
13378: }
13379: M1=cons(Mt,M1);
13380: }
13381: M0=cons(reverse(M1),M0);
13382: }
13383: M = fspt(reverse(M0),5); /* short -> long */
13384: if(findin(z_z,vars(M))>=0)
13385: M=subst(M,z_z,lsol(chkspt(M|mat=Mat)[3],z_z)); /* Fuchs relation */
1.1 takayama 13386: NP = length(M);
13387: Perm = getopt(perm);
13388: if(type(Perm) == 4)
13389: M = mperm(M,Perm,0);
13390: if(T == 9){ /* "" */
13391: if(Short >= 0)
13392: M = chkspt(M|opt=4,mat=Mat);
13393: return M;
13394: }
13395: R = [0,M];
13396: ALL = [R];
13397:
13398: while(type(R = redgrs(R[1]|mat=Mat)) == 4)
13399: ALL = cons(R, ALL);
13400: if(R < 0)
13401: return 0;
13402:
13403: /* TeX */
13404: if(TeX >= 0 && !chkfun("print_tex_form", "names.rr"))
13405: return 0;
13406: if(Dviout >= 0 && type(Title) == 7)
13407: dviout(Title|keep=1);
13408: if(T == 7 && Dviout >= 0){
13409: S=["keep","simplify"];
13410: if(Top0 >= 0)
13411: S = cons("top0",S);
13412: getbygrs(M,cons(5,S)|title="\\noindent Riemann Scheme",mat=Mat);
13413: Same = 0;
13414: if(R > 0){
13415: MM = getbygrs(M,8|mat=Mat); /* basic GRS */
13416: MS = chkspt(MM|opt=0,mat=Mat); /* spectral type */
13417: if(M != MM)
13418: getbygrs(MM,cons(5,S)|title="Basic Riemann Scheme",mat=Mat);
13419: else{
13420: dviout("This is a basic Riemann Scheme.\n\n\\noindent"|keep=1);
13421: Same = 1;
13422: }
13423: dviout(MS|keep=1);
13424: }
13425: if(chkspt(ALL[0][1]|mat=Mat)[3] != 0)
13426: getbygrs(M,cons(6,S)|title="Fuchs condition",mat=Mat);
13427: if(Same == 0){
13428: M1 = M[1];
13429: if(M1[length(M1)-1][0]==1 && Mat!=1){
13430: M1=M[2];
13431: if(M1[length(M1)-1][0] == 1){
13432: getbygrs(M,cons(2,S)|title="Connection formula");
13433: if(M1[length(M[0][0])-1][0] == 1 && R==0)
13434: getbygrs(M,cons(11,S)|title="Recurrence relation shifting the last exponents at $\\infty$, 0, 1");
13435: }
13436: getbygrs(M,cons(1,S)|title="Integral representation");
13437: getbygrs(M,cons(4,S)|title="Series expansion");
13438: }
13439: if(Irr < 0){
13440: TI="Irreduciblity $\\Leftrightarrow$ any value of the following linear forms $\\notin\\mathbb Z$";
13441: if(R > 0)
13442: TI += " + fundamental irreducibility";
13443: getbygrs(M,cons(10,S)|title=TI,mat=Mat);
13444: dviout("which coorespond to the decompositions"|keep=1);
13445: sproot(chkspt(M|opt=0),"pairs"|dviout=1,keep=1);
13446: }
13447: }
13448: if(Op >= 0 && Mat!=1) getbygrs(M,cons(3,S)|title="Operator");
13449: dviout(" ");
13450: return 1;
13451: }
13452: if(T == 0 && TeX >= 0){
13453: T = 1; TeX = 16;
13454: }
13455: /* Fuchs */
13456: Fuc = chkspt(ALL[0][1]|Mat=mat)[3];
13457: if(Fuc == 0) Simp = -1;
13458: if(type(Fuc) == 1){
13459: print("Violate Fuchs condition");
13460: return 0;
13461: }
13462: if(T == 6){
13463: if(Dviout >= 0) dviout(Fuc|eq=0,keep=Keep);
13464: return (TeX >= 0)?my_tex_form(Fuc):Fuc;
13465: }
13466: Fuc = [Fuc];
13467: /* Generelized Riemann scheme */
13468: if(T == 5){
13469: M = ltov(M);
13470: for(ML=0, I=0; I<NP; I++){
13471: L = length(M[I]);
13472: if(L > ML) ML = L;
13473: }
13474: Out = string_to_tb("P\\begin{Bmatrix}\nx=");
13475: if(Top0 < 0)
13476: write_to_tb("\\infty & ",Out);
13477: Pt = getopt(pt);
13478: if(type(Pt) == 4){
13479: for(J = 3; J < NP; J++){
13480: str_tb(["& ",rtotex(car(Pt))],Out);
13481: Pt = cdr(Pt);
13482: }
13483: }
13484: else if(X2>=0)
13485: str_tb("0 & x_2",Out);
13486: else
13487: str_tb((X1>=0)?"x_1 & x_2":"0 & 1",Out);
13488: for(J = 3; J < NP; J++)
13489: str_tb(["& x_",rtotex(J)],Out);
13490: if(Top0 >= 0)
13491: write_to_tb("& \\infty",Out);
13492: write_to_tb("\\\\\n",Out);
13493: for(I = 0; I < ML; I++){
13494: for(CC = 0, J = (Top0 >= 0)?1:0; ; J++, CC++){
13495: if(J == NP){
13496: if(Top0 < 0) break;
13497: J = 0;
13498: }
13499: if(length(M[J]) <= I){
13500: if(CC > 0) write_to_tb(" & ",Out);
13501: }else if(M[J][I][0] <= 1){
13502: if(M[J][I][0] == 0) str_tb(" & ",Out);
13503: else
13504: str_tb([(!CC)?" ":" & ", my_tex_form(M[J][I][1])], Out);
13505: }else{
13506: str_tb([((!CC)?"[":" & ["), my_tex_form(M[J][I][1]),
13507: (Mat==1)?"]_{":"]_{("],Out);
13508: str_tb([my_tex_form(M[J][I][0]),(Mat==1)?"}":")}"],Out);
13509: }
13510: if(Top0 >= 0 && J == 0)
13511: break;
13512: }
13513: if(I == 0)
13514: str_tb("&\\!\\!;x",Out);
13515: str_tb("\\\\\n",Out);
13516: }
13517: str_tb("\\end{Bmatrix}",Out);
13518: Out = str_tb(0,Out);
13519: if(Dviout >= 0)
13520: dviout(Out|eq=0,keep=Keep);
13521: return Out;
13522: }
13523:
13524: /* Reduction */
13525: if(T == 0){
13526: if(Simp >= 0)
13527: ALL = simplify(ALL,Fuc,4);
13528: return reverse(ALL);
13529: }
13530: LA = length(ALL) - 1;
13531: NP = length(ALL[0][1]);
13532:
13533: /* irreducible */
13534: if(T == 10){
13535: for(IR=[], I = 0; I < LA; I++){
13536: AI = ALL[I]; AIT = AI[1];
13537: K = AI[0][0];
13538: P = -AIT[0][K][1];
13539: P -= cterm(P);
13540: IR = cons(P, IR);
13541: for(J = 0; J < NP; J++){
13542: K = AI[0][J];
13543: for(L = length(AIT[J]) - 1; L >= 0 ; L--){
13544: if(L == K || AIT[J][L][0] <= AIT[J][K][0])
13545: continue;
13546: P = AIT[J][L][1] - AIT[J][K][1];
13547: Q = cterm(P);
13548: if(dn(Q)==1)
13549: P -= Q;
13550: IR = cons(P,IR);
13551: }
13552: }
13553: }
13554: P=Fuc[0];
13555: Q=cterm(P);
13556: if(type(Q)==1 && dn(Q)==1){
13557: for(F=0,V=vars(P);V!=[];V=cdr(V)){
13558: R=mycoef(P,1,car(V));
13559: if(type(R)!=1 || Q%R!=0){
13560: F=1; break;
13561: }
13562: }
13563: if(F==0){
13564: P-=Q;
13565: Simp=0;
13566: }
13567: }
13568: if(Simp >= 0){
13569: IR=simplify(IR,[P],4);
13570: for(R=[]; IR!=[]; IR=cdr(IR)){
13571: P=car(IR);
13572: Q=cterm(P);
13573: if(dn(Q)==1) P-=Q;
13574: R=cons(P,R);
13575: }
13576: IR=R;
13577: }
13578: for(R=[]; IR!=[]; IR=cdr(IR)){
13579: P=car(IR);
13580: if(str_len(rtostr(P)) > str_len(rtostr(-P)))
13581: P = -P;
13582: R = cons(P,R);
13583: }
13584: R = ltov(R);
1.3 takayama 13585: #ifdef USEMODULE
1.2 ohara 13586: R = qsort(R,os_md.cmpsimple);
13587: #else
1.4 ! takayama 13588: R = qsort(R,cmpsimple);
1.2 ohara 13589: #endif
1.1 takayama 13590: R = vtol(R);
13591: if(TeX >= 0){
13592: Out = string_to_tb("");
13593: for(I=L=K=0; R!=[]; R=cdr(R),I++){
13594: K1 = K;
13595: RS = my_tex_form(car(R));
13596: /* K = str_len(RS);
13597: L += K+4; */
13598: K = nmono(car(R));
13599: L += K;
13600: if(I){
13601: if(K1 == K && L < 30)
13602: str_tb("\\quad ",Out);
13603: else{
13604: L = K;
13605: str_tb((TeXEq==5)?["\\\\%\n &"]:["\\\\%\n "],Out);
13606: }
13607: }
13608: str_tb(RS,Out);
13609: }
13610: R = Out;
13611: if(Dviout>=0){
13612: dviout(R|eq=0,keep=Keep);
13613: return 1;
13614: }
13615: }
13616: return R;
13617: }
13618:
13619: AL = []; SS = 0;
13620: for(I = 0; I <= LA; I++){
13621: AI = ALL[I]; AIT = AI[1]; /* AIT: GRS */
13622: if(I > 0){
13623: for(S = J = 0; J < NP; J++){
13624: GE = AIT[J][AI0[J]][1];
13625: S += GE;
13626: if(J == 0)
13627: SS = [];
13628: else
13629: SS = cons(GE,SS);
13630: }
13631: SS = cons(1-Mat-S, reverse(SS));
13632: }
13633: AI0 = AI[0];
13634: AL = cons([SS, cutgrs(AIT)], AL);
13635: }
13636: AL = reverse(AL);
13637: AD = newvect(NP);
13638: ALT = AL[0][1];
13639: for(J = 1; J < NP; J++){
13640: /* AD[J] = ALT[J][0][1]; [J][?][1] <- [J][?][0]: max */
13641: for(MMX=0, K = KM = length(ALT[J])-1; K >= 0; K--){
13642: if(MMX <= ALT[J][K][0]){
13643: if(J == 1 && MMX == ALT[J][K][0])
13644: continue;
13645: KM = K;
13646: MMX = ALT[J][K][0];
13647: }
13648: }
13649: AD[J] = ALT[J][KM][1];
13650: }
13651: AL = cdr(AL);
13652: AL = cons([vtol(AD), ALT], AL);
13653: AL = cons([0, mcgrs(ALT, [vtol(-AD)]|mat=Mat)], AL);
13654: if(Simp >= 0 && T != 3)
13655: AL = simplify(AL,Fuc,4);
13656: /* Basic */
13657: if(T == 8){
13658: ALT = AL[0][1];
13659: if(TeX >= 0){
13660: if(Dviout >= 0){
13661: return getbygrs(ALT,["TeX","dviout","keep"]);
13662: }
13663: return getbygrs(ALT,"TeX");
13664: }
13665: if(Short >= 0)
13666: ALT = chkspt(ALT|opt=4);
13667: return ALT;
13668: }
13669:
13670: /* Construct */
13671: if(T == 1){
13672: if(TeX >= 0){
13673: L = length(AL);
13674: I = Done = 0; Out0=Out1=""; NM = DN = [];
13675: if(TeX != 16){
13676: AL11=AL[L-1][1][1];
13677: AT = AL11[length(AL11)-1];
13678: if(type(AT) == 4){
13679: PW = (AT[0] > 1)?"":AT[1];
13680: }else PW = AT;
13681: }
13682: Out = string_to_tb("");
13683: while(--L >= 0){
13684: if(TeX == 16){
13685: if(Done)
13686: write_to_tb(":\\ ", Out);
13687: write_to_tb(getbygrs(AL[L][1],(Top0>=0)?["TeX", "top0"]:"TeX"|mat=Mat), Out);
13688: Done = 1;
13689: if(L != 0) write_to_tb((TeXEq==5)?
13690: "\\\\%\n&\\leftarrow ":"\\\\%\n\\leftarrow ", Out);
13691: }
13692: ALT = AL[L][0];
13693: if(TeX != 16){
13694: V1 = (I==0)?"x":V2;
13695: V2 = /* (I==0 && L<=2)?"s": */
13696: "s_"+rtotex(I);
13697: }else V1=V2="x";
13698: JJ = (type(ALT) == 4)?length(ALT):0;
13699: if(I > 0 && L > 0)
13700: write_to_tb("\n ", Out);
13701: for(Outt = "", J = 1; J < JJ; J++){
13702: if(ALT[J] == 0) continue;
13703: if(J == 1) Outt += V1;
13704: else if(J == 2) Outt += "(1-"+V1+")";
13705: else Outt += "(x_"+rtotex(J)+"-"+V1+")";
13706: Outt += "^"+ rtotex(ALT[J]);
13707: }
13708: if(TeX != 16) write_to_tb(Outt, Out);
13709: else if(Outt != "")
13710: str_tb(["\\mathrm{Ad}\\Bigl(",Outt,"\\Bigr)"], Out);
13711: if(JJ == 0){
13712: if(I != 0)
13713: Out1 = "ds_"+rtotex(I-1)+Out1;
13714: continue;
13715: }
13716: if(ALT[0] == 0) continue;
13717: Out0 += "\\int_p^{"+V1+"}";
13718: if(TeX == 16)
13719: str_tb(["mc_",rtotex(ALT[0])], Out);
13720: else{
13721: str_tb(["(",V1,"-",V2,")^",rtotex(-1+ALT[0])], Out);
13722: AL11=AL[L-1][1][1];
13723: AT = AL11[length(AL11)-1];
13724: if(type(AT) == 4) AT = AT[1];
13725: DN = cons(ALT[0]+AT+1,DN);
13726: NM = cons(AT+1,cons(ALT[0],NM));
13727: }
13728: if(L != 2) Out1 += "d"+V2;
13729: I++;
13730: }
13731: if(R){
13732: if(I == 0) Ov = "x";
13733: else Ov = "s_"+rtotex(I-1);
13734: Out1 = "u_B("+Ov+")"+Out1;
13735: }
13736: if(TeX != 16){
13737: Out0 = string_to_tb(Out0);
13738: str_tb([Out, Out1], Out0);
13739: Out = Out0;
13740: NM = simplify(NM, Fuc, 4);
13741: DN = simplify(DN, Fuc, 4);
13742: DNT = lsort(NM,DN,"reduce");
13743: NMT = DNT[0]; DNT = DNT[1];
13744: if(NMT != [] && PW != ""){
13745: write_to_tb((TeXEq==5)?"\\\\\n &\\sim\\frac{\n"
13746: :"\\\\\n \\sim\\frac{\n", Out);
13747: for(PT = NMT; PT != []; PT = cdr(PT))
13748: str_tb([" \\Gamma(",my_tex_form(car(PT)), ")\n"], Out);
13749: write_to_tb(" }{\n", Out);
13750: for(PT = DNT; PT != []; PT = cdr(PT))
13751: write_to_tb(" \\Gamma("+my_tex_form(car(PT))+")\n", Out);
13752: write_to_tb(" }", Out);
13753: if(R > 0) write_to_tb("C_0", Out);
13754: write_to_tb("x^"+rtotex(PW) +"\\ \\ (p=0,\\ x\\to0)", Out);
13755: }
13756: }else
13757: Out = str_tb(0, Out);
13758: if(Dviout >= 0){
13759: dviout(Out|eq=0,keep=Keep);
13760: return 1;
13761: }
13762: return O;
13763: }
13764: if(Short >= 0){
13765: for(ALL = [] ; AL != []; AL = cdr(AL)){
13766: AT = car(AL);
13767: ALL = cons([AT[0], chkspt(AT[1]|opt=4)], ALL);
13768: }
13769: AL = reverse(ALL);
13770: }
13771: return AL; /* AL[0][1] : reduced GRS, R==0 -> rigid */
13772: }
13773:
13774: if(T == 2 || T == 4 || T == 11){
13775: for(I = (T==2)?2:1; I >= (T==11)?0:1; I--){
13776: ALT = M[I];
13777: if(ALT[length(ALT)-1][0] != 1){
13778: mycat(["multiplicity for",I,":",ALT[length(ALT)-1][1],
13779: "should be 1"]);
13780: return;
13781: }
13782: }
13783: }
13784: LA++;
13785: NM = DN = [];
13786:
13787: /* Three term relation */
13788: if(T == 11){
13789: if(R > 0){
13790: print("This is not rigid\n");
13791: return 0;
13792: }
13793: for(I = 0; I <= LA; I++){
13794: if(I > 0){
13795: AI = AL[I][0]; /* operation */
13796: if(AI[0] != 0){
13797: DN = cons(simplify(AI1+1,Fuc,4),DN);
13798: NM = cons(simplify(AI1+AI[0]+1,Fuc,4),NM);
13799: }
13800: }
13801: ALT = AL[I][1][1]; AI1 = ALT[length(ALT)-1][1];
13802: }
13803: DNT = lsort(NM,DN,"reduce");
13804: if(TeX < 0) return DNT;
13805: NMT = DNT[0]; DNT = DNT[1];
13806: Out = str_tb("u_{0,0,0}-u_{+1,0,-1}=\\frac{","");
13807: for(PT = NMT; PT != []; PT = cdr(PT))
13808: str_tb(["(",my_tex_form(car(PT)),")"], Out);
13809: str_tb(["}\n{"],Out);
13810: for(PT = DNT; PT != []; PT = cdr(PT))
13811: str_tb(["(",my_tex_form(car(PT)),")"], Out);
13812: write_to_tb("}u_{0,+1,-1}",Out);
13813: if(Dviout >= 0){
13814: dviout(Out|eq=0,keep=Keep);
13815: return 1;
13816: }
13817: return Out;
13818: }
13819:
13820: AD=newvect(NP);
13821: for(I = 0; I <= LA; I++){
13822: if(I > 0){
13823: AI = AL[I][0]; /* operation */
13824: if(T == 2 && AI[0] != 0){
13825: DN = cons(simplify(-AI2,Fuc,4), cons(simplify(AI1+1,Fuc,4),DN));
13826: NM = cons(simplify(-AI2-AI[0],Fuc,4), cons(simplify(AI1+AI[0]+1,Fuc,4),
13827: NM));
13828: }
13829: for(J = 1; J < NP; J++)
13830: AD[J] += simplify(AI[J],Fuc,4);
13831: }
13832: if(T == 2){
13833: ALT = AL[I][1][1]; AI1 = ALT[length(ALT)-1][1];
13834: ALT = AL[I][1][2]; AI2 = ALT[length(ALT)-1][1];
13835: if(I == 0){
13836: C3 = AI1; C4 = AI2;
13837: }
13838: }
13839: }
13840:
13841: /* Connection */
13842: if(T == 2){
13843: DNT = lsort(NM,DN,"reduce");
13844: NMT = DNT[0]; DNT = DNT[1];
13845: if(TeX < 0) return [NMT,DNT,AD];
13846: C0 = M[1][length(M[1])-1][1];
13847: C1 = M[2][length(M[2])-1][1];
13848: M = AL[0][1];
13849: C3 = M[1][length(M[1])-1][1];
13850: C4 = M[2][length(M[2])-1][1];
13851: Out = str_tb(["c(0\\!:\\!", my_tex_form(C0),
13852: " \\rightsquigarrow 1\\!:\\!", my_tex_form(C1),")"], "");
13853: if(R > 0 && AMSTeX == 1 && (TeXEq == 4 || TeXEq == 5)){
13854: write_to_tb("\\\\\n", Out);
13855: if(TeXEq == 5) write_to_tb(" &", Out);
13856: }
13857: write_to_tb("=\\frac{\n",Out);
13858: for(PT = NMT; PT != []; PT = cdr(PT))
13859: write_to_tb(" \\Gamma("+my_tex_form(car(PT))+")\n", Out);
13860: write_to_tb(" }{\n",Out);
13861: for(PT = DNT; PT != []; PT = cdr(PT))
13862: write_to_tb(" \\Gamma("+my_tex_form(car(PT))+")\n",Out);
13863: write_to_tb(" }", Out);
13864: for(J = 3; J < length(AD); J++){
13865: if(AD[J] == 0) continue;
13866: str_tb(["\n (1-x_", rtotex(J), "^{-1})^", rtotex(AD[J])], Out);
13867: }
13868: if(R != 0)
13869: str_tb(["\n c_B(0\\!:\\!", my_tex_form(C3),
13870: " \\rightsquigarrow 1\\!:\\!", my_tex_form(C4), ")"], Out);
13871: Out = tb_to_string(Out);
13872: if(Dviout >= 0){
13873: dviout(Out|eq=0,keep=Keep);
13874: return 1;
13875: }
13876: return Out;
13877: }
13878:
13879: /* Series */
13880: if(T == 4){
13881: AL11 = AL[0][1][1];
13882: V = AL11[length(AL11)-1][1];
13883: S00 = -V; S01 = (R==0)?[]:[[0,0]];
13884: S1 = S2 = [];
13885: for(Ix = 1, ALL = cdr(AL); ALL != []; ){
13886: ALT = ALL[0][0];
13887: if(ALT[0] != 0){ /* mc */
13888: for(Sum = [], ST = S01; ST != []; ST = cdr(ST))
13889: Sum = cons(car(ST)[0], Sum);
13890: S1 = cons(cons(S00+1,Sum), S1);
13891: S2 = cons(cons(S00+1+ALT[0],Sum),S2);
13892: S00 += ALT[0];
13893: }
13894: ALL = cdr(ALL);
13895: for(I = 1; I < length(ALT); I++){ /* addition */
13896: if(I == 1){
13897: S00 += ALT[1];
13898: if(ALL == [])
13899: S00 = [S00];
13900: }else{
13901: if(ALT[I] == 0)
13902: continue;
13903: if(ALL != []){
13904: S1 = cons([-ALT[I],Ix],S1);
13905: S2 = cons([1,Ix],S2);
13906: S01= cons([Ix,I],S01);
13907: Ix++;
13908: }else
13909: S00 = cons([ALT[I],I],S00);
13910: }
13911: }
13912: }
13913: S00 = reverse(S00);
13914: S01 = qsort(S01); S1 = qsort(S1); S2 = qsort(S2);
13915: if(Simp >= 0){
13916: S00 = simplify(S00,Fuc,4);
13917: S01 = simplify(S01,Fuc,4);
13918: S1 = simplify(S1,Fuc,4);
13919: S2 = simplify(S2,Fuc,4);
13920: SS = lsort(S1,S2,"reduce");
13921: S1 = SS[0]; S2 = SS[1];
13922: }
13923:
13924: if(TeX >= 0){
13925: /* Top linear power */
13926: TOP = Ps = Sm = "";
13927: for(TOP = Ps = Sm = "", ST = cdr(S00); ST != []; ST = cdr(ST)){
13928: SP = car(ST);
13929: if(SP[0] != 0){
13930: if(SP[1] == 2)
13931: TOP += "(1-x)^"+rtotex(SP[0]);
13932: else
13933: TOP += "(1-x/x_"+rtotex(SP[1])+")^"+rtotex(SP[0]);
13934: }
13935: }
13936: /* Top power */
13937: PW = my_tex_form(car(S00));
13938: if(PW == "0")
13939: PW = "";
13940: NP = length(AL[0][1]);
13941: PWS = newvect(NP);
13942: for(I = 0; I < NP; I++)
13943: PWS[I] = "";
13944: for(S = S01, I = 0; S != []; S = cdr(S), I++){
13945: SI = rtotex(car(S)[0]);
13946: if(I > 0) Sm += ",\\ ";
13947: Sm += "n_"+SI+"\\ge0";
13948: if(PW != "")
13949: PW += "+";
13950: PW += "n_"+SI;
13951: if(car(S)[1] > 2)
13952: PWS[car(S)[1]] += "-n_"+rtotex(car(S)[0]);
13953: else if(car(S)[1] == 0)
13954: Ps = "C_{n_0}"+Ps;
13955: }
13956: for(I = 3; I < NP; I++){
13957: if(PWS[I] != "")
13958: Ps += "x_"+rtotex(I)+"^{"+PWS[I]+"}";
13959: }
13960: Out = str_tb([TOP, Ps, "x^{", PW, "}"], "");
13961: /* Gamma factor */
13962: for(I = 0, SS = S1; I <= 1; I++, SS = S2){
13963: PW = string_to_tb("");
13964: for(PW1=""; SS != [] ; SS = cdr(SS)){
13965: for(J = 0, SST = car(SS); SST != []; SST = cdr(SST), J++){
13966: if(J == 0){
13967: JJ = (car(SST) == 1)?((length(SST)==2)?(-1):0):1;
13968: if(JJ > 0)
13969: str_tb(["(", my_tex_form(car(SST)), ")_{"], PW);
13970: else if(JJ == 0)
13971: PW1 = "(";
13972: }else{
13973: if(JJ > 0){
13974: if(J > 1) write_to_tb("+", PW);
13975: str_tb(["n_", rtotex(car(SST))], PW);
13976: }else{
13977: if(J > 1) PW1 += "+";
13978: PW1 += "n_"+rtotex(car(SST));
13979: }
13980: }
13981: }
13982: if(JJ > 0) write_to_tb("}", PW);
13983: else PW1 += (JJ == 0)?")!":"!";
13984: }
13985: if(I == 0)
13986: Out0 = "\\frac";
13987: Out0 += "{"+tb_to_string(PW)+PW1+"}";
13988: PW = string_to_tb(""); PW1 = "";
13989: }
13990: if(Out0 == "\\frac{}{}")
13991: Out0 = "";
13992: Out = "\\sum_{"+Sm+"}"+Out0 + Top + tb_to_string(Out);
13993: if(length(S01) == 1){
13994: Out = str_subst(Out, "{n_"+SI+"}", "n");
13995: Out = str_subst(Out, "n_"+SI, "n");
13996: }
13997: if(Dviout >= 0)
13998: dviout(Out|eq=0,keep=Keep);
13999: return Out;
14000: }
14001: return [cons(S00, S01), S1, S2];
14002: }
14003:
14004: /* Operator */
14005: if(T==3){
14006: Fuc0 = car(Fuc);
14007: if(Fuc0 != 0){ /* Kill Fuchs relation */
14008: for(V = vars(Fuc0); V != []; V = cdr(V)){
14009: VT = car(V);
14010: if(deg(Fuc0,VT) == 1){
14011: AL = mysubst(AL, [VT, -red(coef(Fuc0,0,VT)/coef(Fuc0,1,VT))]);
14012: break;
14013: }
14014: }
14015: if(V == []){
14016: print("Fuchs condition has no variable with degree 1");
14017: return 0;
14018: }
14019: }
14020: L = newvect(NP);
14021: Pt = getopt(pt);
14022: for(I = NP-1; I >= 1; I--){
14023: if(type(Pt) == 4)
14024: L[I] = Pt[I-1];
14025: else if(I >= 3 || X1 >= 0 || (X2 >= 0 && I >= 2))
14026: L[I] = makev(["x_", I]);
14027: else L[I] = I-1;
14028: }
14029: if(R){ /* non-rigid basic */
14030: MM = AL[0][1]; /* Riemann scheme */
14031: for(OD = 0, MT = car(MM); MT != []; MT = cdr(MT))
14032: OD += car(MT)[0];
14033: for(V = DN = [], M = MM; M != []; M = cdr(M)){
14034: MT = car(M); /* exponents */
14035: for(K = KM = 0, NT = []; ; K++){
14036: for(J = 0, P = 1, MTT = MT; MTT != []; MTT = cdr(MTT)){
14037: if(J == 0 && car(MTT)[1] == 0)
14038: KM = car(MTT)[0];
14039: for(KK = car(MTT)[0] - K -1; KK >= 0; KK--)
14040: P *= (dx-car(MTT)[1]-KK);
14041: }
14042: if(P == 1) break;
14043: NT = cons(P,NT);
14044: }
14045: V = cons(reverse(NT), V);
14046: DN = cons(KM, DN);
14047: }
14048: V = ltov(reverse(V)); /* conditions for GRS */
14049: DN = ltov(reverse(DN)); /* dims of local hol. sol. */
14050: for(J = OD; J >= 0; J--){
14051: for(I = Q = 1; I < NP; I++){
14052: if(J > DN[I])
14053: Q *= (x-L[I])^(J-DN[I]);
14054: }
14055: K = mydeg(Q,x);
14056: if(J == OD){
14057: P = Q*dx^J;
14058: DM = K;
14059: }else{
14060: for(I = DM-OD+J-K; I >= 0; I--){
14061: X = makev(["r",J,"_",I]);
14062: P += Q*x^I*X*dx^J;
14063: }
14064: }
14065: }
14066: for(R = [], I = 0; I < NP; I++){
14067: Q = toeul(P, [x,dx], (I==0)?"infty":L[I]); /* Euler at I-th pt */
14068: for(VT = V[I], J=0; VT != [] ; VT = cdr(VT), J++){
14069: if(car(VT) != 0)
14070: R = cons(rpdiv(coef(Q,J,x), car(VT), dx)[0], R); /* equations */
14071: }
14072: }
14073: for(RR = RRR = [], I = OD-1; I>=0; I--){
14074: RR = [];
14075: for(RT = R; RT != [] ; RT = cdr(RT)){
14076: if( (VT = mycoef(car(RT), I, dx)) != 0)
14077: RR = cons(VT, RR); /* real linear eqs */
14078: }
14079: J = mydeg(mycoef(P,I,dx),x);
14080: for(S = 0, VVV = []; J >= 0; J--){
14081: X = makev(["r",I,"_",J]);
14082: VVV = cons(X, VVV); /* unknowns */
14083: }
14084: RR = lsol(RR,VVV);
14085: LN = length(RR);
14086: for(K=0; K<LN; K++){
14087: RRT = RR[K];
14088: if(type(RRT) != 4) continue;
14089: R = mysubst(R,RRT);
14090: P = mysubst(P,RRT);
14091: }
14092: }
14093: }else /* Rigid case */
14094: P = dx^(AL[0][1][0][0][0]);
14095: /* additions and middle convolutions */
14096: for(ALT = AL; ALT != []; ALT = cdr(ALT)){
14097: AI = car(ALT)[0];
14098: if(type(AI) != 4) continue;
14099: V = ltov(AI);
14100: if(V[0] != 0) P = mc(P,x,V[0]);
14101: for(I = 1; I < NP; I++){
14102: if(V[I] != 0)
14103: P = sftexp(P,x,L[I],-V[I]);
14104: }
14105: }
14106: P = (Simp>=0)? simplify(P,Fuc,4|var=[dx]):simplify(P,Fuc,4);
14107: if(TeX >= 0){
14108: Val = 1;
14109: if(mydeg(P,dx) > 2 && AMSTeX == 1 && TeXEq > 3)
14110: Val = (TeXEq==5)?3:2;
14111: Out = fctrtos(P|var=[dx,"\\partial"],TeX=Val);
14112: if(Dviout < 0) return Out;
14113: dviout(Out|eq=0,keep=Keep);
14114: return 1;
14115: }
14116: return P;
14117: }
14118: return 0;
14119: }
14120:
1.4 ! takayama 14121: def mcop(P,M,S)
! 14122: {
! 14123: for(V=[],ST=S;ST!=[];ST=cdr(ST))
! 14124: if(isvar(VT=car(ST))) V=cons(vweyl(VT),V);
! 14125: V=reverse(V);
! 14126: N=length(V);
! 14127: for(MT=M;MT!=[];MT=cdr(MT)){
! 14128: T=car(MT);
! 14129: if(T[0]!=0)
! 14130: P=mc(P,V[0],T[0]);
! 14131: for(TT=cdr(T),ST=cdr(S);ST!=[];TT=cdr(TT),ST=cdr(ST))
! 14132: if(car(TT)!=0) P=sftpexp(P,V,S[0]-ST[0],-car(TT));
! 14133: }
! 14134: return P;
! 14135: }
! 14136:
1.1 takayama 14137: /* option: zero, all, raw */
14138: def shiftop(M,S)
14139: {
14140: if(type(M)==7) M=s2sp(M);
14141: if(type(S)==7) S=s2sp(S);
14142: Zero=getopt(zero);
14143: NP=length(M);
14144: for(V=L=[],I=NP-1; I>=0; I--){
14145: V=cons(strtov(asciitostr([97+I])),V);
14146: if(I>2) L=cons(makev(["y_", I-1]),L);
14147: else L=cons(I-1,L);
14148: }
14149: if(type(M[0][0])==4){
14150: F=1;RS=M;SS=S;
14151: R=chkspt(M);
14152: if(R[2]!=2 || R[3]!=0){
14153: mycat("GRS is not valid!");return 0;
14154: }
14155: for(; S!=[]; S=cdr(S)){
14156: if(nmono(S[0][0])!=1) break;
14157: if(isint(S[0][1]-S[0][0])==0) break;
14158: }
14159: if(S!=[]){
14160: mycat("Error in shift!"); return 0;
14161: }
14162: }else{
14163: F=0;
14164: RS=sp2grs(M,V,[1,length(M[0]),1]);
14165: for(SS=S0=[],I=0; I<NP; I++){
14166: for(J=F=0; J<length(M[I]); J++){
14167: if(I==0 && J==length(M[0])-1) break;
14168: if((U=S[I][J])!=0){
14169: if(isint(U)!=1){
14170: mycat("Error in shift!"); return 0;
14171: }
14172: VT=RS[I][J][1];
14173: SS=cons([VT,VT+U],SS);
14174: }else if(I>0 && Zero==1 && F==0){
14175: RS=mysubst(RS,[RS[I][J][1],0]);
14176: F=J+1;
14177: }
14178: }
14179: if((F>0 && J==2) || (I==0 && J==1)){
14180: J=(I==0)?0:2-F; VT=RS[I][J][1];
14181: S0=cons([VT,strtov(asciitostr([strtoascii(rtostr(VT))[0]]))],S0);
14182: }
14183: }
14184: }
14185: RS1=mysubst(RS,SS);
14186: if(F==1){
14187: R=chkspt(RS1);
14188: if(R[2]!=2 || R[3]!=0){
14189: mycat("Error in shift!");
14190: return 0;
14191: }
14192: }
14193: R=getbygrs(RS,1); R1=getbygrs(RS1,1);
14194: RT=R[0][1][0];
14195: if(length(RT)!=1 || RT[0][0]!=1){
14196: mycat("Not rigid!");
14197: return 0;
14198: }
14199: P=dx;Q=Q1=1;
14200: for(RT = R, RT1=R1; RT != []; RT = cdr(RT), RT1=cdr(RT1)){
14201: V=car(RT)[0]; V1=car(RT1)[0];
14202: if(type(V) != 4) continue;
14203:
14204: if(V[0] != 0){
14205: P = mc(P,x,V[0]); /* middle convolution */
14206: QT = mc(Q,x,V[0]);
14207: }else QT=Q;
14208: D0=mydeg(Q,dx);D0T=mydeg(QT,dx);
14209: C0=red(mycoef(Q,D0,dx)/mycoef(QT,D0T,dx));
14210: if(C0!=1) QT=red(C0*QT);
14211:
14212: if(V1[0] != 0) Q1T = mc(Q1,x,V1[0]);
14213: else Q1T=Q1;
14214: D1=mydeg(Q1,dx);D1T=mydeg(Q1T,dx);
14215: C1=red(mycoef(Q1,D1,dx)/mycoef(Q1T,D1T,dx));
14216: if(C1!=1) Q1T=red(C1*Q1T);
14217: DD=(V[0]-V1[0])+(D0-D0T)-(D1-D1T);
14218: if(DD>0){
14219: QT=muldo(dx^DD,QT,[x,dx]);
14220: D0T+=DD;
14221: }else if(DD<0){
14222: Q1T=muldo(dx^(-DD),Q1T,[x,dx]);
14223: D1T-=DD;
14224: }
14225: C=mylcm(dn(QT),dn(Q1T),x);
14226: if(C!=1){
14227: QT=red(C*QT); Q1T=red(C*Q1T);
14228: }
14229: Q=QT;Q1=Q1T;
14230: for(I = 1; I < NP; I++){
14231: if(V[I]!=0){
14232: P = sftexp(P,x,L[I],-V[I]); /* addition u -> (x-L[I])^V[I]u */
14233: QT = sftexp(QT,x,L[I],-V[I]);
14234: }
14235: if(V1[I]!=0)
14236: Q1T = sftexp(Q1T,x,L[I],-V1[I]);
14237: }
14238: C=red(mycoef(QT,D0T,dx)*mycoef(Q1,D1T,dx)/(mycoef(Q,D0T,dx)*mycoef(Q1T,D1T,dx)));
14239: Q=red(dn(C)*QT);Q1=red(nm(C)*Q1T);
14240: for(I = 1; I < NP; I++){
14241: if((J=V[I]-V1[I])!=0){
14242: if(J>0) Q1*=(x-L[I])^J;
14243: else Q*=(x-L[I])^(-J);
14244: }
14245: while((QT=tdiv(Q,x-L[I]))!=0){
14246: if((Q1T=tdiv(Q1,x-L[I]))!=0){
14247: Q=QT;Q1=Q1T;
14248: }else break;
14249: }
14250: }
14251: }
14252: P1=mysubst(P,SS);
14253: if(type(S0)==4 && S0!=[]){
14254: P=mysubst(P,S0); Q=mysubst(Q,S0);
14255: P1=mysubst(P1,S0); Q1=mysubst(Q1,S0);
14256: RS=mysubst(RS,S0); RS1=mysubst(RS1,S0);
14257: }
14258: R=mygcd(Q1,P1,[x,dx]);
14259: if(findin(dx,vars(R[0]))>=0){
14260: mycat("Some error!");
14261: return 0;
14262: }
14263: Q=muldo(R[1]/R[0],Q,[x,dx]);
14264: R=divdo(Q,P,[x,dx]);
14265: Q=red(R[1]/R[2]);
14266: R=fctr(nm(Q));
14267: QQ=Q/R[0][0];
14268: R1=fctr(dn(QQ));
14269: for(RR=cdr(R1); RR!=[]; RR=cdr(RR)){
14270: VT=vars(car(RR)[0]);
14271: if(findin(x,VT)<0 && findin(dx,VT)<0){
14272: for(I=car(RR)[1];I>0;I--) QQ=red(QQ*car(RR)[0]);
14273: }
14274: }
14275: Raw=getopt(raw);
14276: Dviout=getopt(dviout);
14277: if(Dviout==1) Raw=4;
14278: if(Raw!=1){
14279: for(RR=cdr(R); RR!=[]; RR=cdr(RR)){
14280: VT=vars(car(RR)[0]);
14281: if(findin(x,VT)<0 && findin(dx,VT)<0){
14282: for(I=car(RR)[1];I>0;I--) QQ=red(QQ/car(RR)[0]);
14283: }
14284: }
14285: }
14286: if(Raw==2||Raw==3||Raw==4){
14287: R=mygcd(QQ,P,[x,dx]); /* R[0]=R[1]*QQ + R[2]*P */
14288: Q1=red(R[0]/R[2]);
14289: for(Q=1,RR=cdr(fctr(nm(Q1))); RR!=[]; RR=cdr(RR)){
14290: VT=vars(car(RR)[0]);
14291: if(findin(x,VT)<0){
14292: for(I=car(RR)[1];I>0;I--) Q*=car(RR)[0];
14293: }
14294: }
14295: if(Raw==3) QQ=[QQ,Q];
14296: else if(Raw==4) /* Q=Q*R[1]/R[0]*QQ+Q/R[0]*P */
14297: QQ=[QQ,Q,red(R[1]*Q/R[0])];
14298: else QQ=Q;
14299: }
14300: F=getopt(all);
14301: if(Dviout==1){
14302: Pre = " x=\\infty & 0 & 1";
14303: for(I=3; I<NP; I++) Pre = Pre+"& "+rtostr(L[I]);
14304: Pre = Pre+"\\\\\n";
14305: PW=str_tb(ltotex(RS|opt="GRS",pre=Pre),0);
14306: str_tb(
14307: "=\\{u\\mid Pu=0\\}\\\\\n&\\underset{Q_2}{\\overset{Q_1}{\\rightleftarrows}}\n",PW);
14308: str_tb([ltotex(RS1|opt="GRS",pre=Pre),"\\\\\n"],PW);
14309: R=fctrtos(QQ[0]|TeX=3,var=[dx,"\\partial"]);
14310: if(type(R)==4) R="\\frac1{"+R[1]+"}"+R[0];
14311: str_tb(["Q_1&=",R,"\\\\\n"],PW);
14312: R=fctrtos(QQ[2]|TeX=3,var=[dx,"\\partial"]);
14313: if(type(R)==4) R="\\frac1{"+R[1]+"}"+R[0];
14314: str_tb(["Q_2&=",R,"\\\\\n"],PW);
14315: str_tb(["Q_2Q_1&\\equiv ",fctrtos(QQ[1]|TeX=3),"\\mod W(x)P"],PW);
14316: if(F==1)
14317: str_tb(["\\\\\nP&=",fctrtos(P|TeX=3,var=[dx,"\\partial"])],PW);
14318: dviout(str_tb(0,PW)|eq=0,title="Shift Operator");
14319: }
14320: if(F==1) return [QQ,P,RS,P1,RS1];
14321: else if(F==0) return QQ;
14322: return [QQ,P,RS];
14323: }
14324:
14325: def conf1sp(M)
14326: {
14327: if(type(M)==7) M=s2sp(M);
14328: L0 = length(M);
14329: L1 = length(M[L0-1]);
14330: X2 = getopt(x2);
14331: Conf= getopt(conf);
14332: if(Conf != 0)
14333: Conf = -1;
14334: if((X2==1 || X2==-1) && Conf != 0){
14335: X1 = 0;
14336: X = x_1;
14337: }else{
14338: X1 = 1;
14339: X = x_2;
14340: }
14341: G = sp2grs(M,a,[L0,L1]);
14342: for(I = 0; I < L0-1; I++){
14343: V = makev([a,I-Conf,0]);
14344: G = subst(G,V,0);
14345: }
14346: L2 = length(M[1]);
14347: for(I=J=S0=S1=0; I < L2; I++){
14348: S1 += G[1][I][0];
14349: while(S0 < S1){
14350: S0 += G[0][J][0];
14351: if((V=G[0][J][1]) != 0)
14352: G = mysubst(G,[V,V-G[1][I][1]]);
14353: J++;
14354: }
14355: if(S0 > S1){
14356: print("Error in data!");
14357: return 0;
14358: }
14359: }
14360: if(Conf==0){
14361: for(L=[], I=L0-2; I>=0; I--)
14362: L=cons(I,L);
14363: L=cons(L0-1,L);
14364: P = getbygrs(G,["operator","x2"]|perm=L);
14365: }else if(X1)
14366: P = getbygrs(mperm(G,[[1,2]],[]), ["operator","x2"]);
14367: else
14368: P = getbygrs(G,["operator","x1"]);
14369: if(Conf==0)
14370: P=nm(mysubst(P,[X,c]));
14371: else{
14372: P = nm(mysubst(P,[X,1/c]));
14373: if(X2==-1){
14374: for(I=2; I<L0; I++){
14375: V=makev(["x_",I]); VC=makev([c,I]);
14376: P = nm(mysubst(P,[V,1/VC]));
14377: }
14378: }
14379: }
14380: for(I = 1; I < L2; I++){
14381: X = G[1][I][1];
14382: P = nm(mysubst(P,[X,X/c]));
14383: }
14384: VS = vars(P);
14385: while(VS!=[]){
14386: V = car(VS);
14387: if(str_chr(rtostr(V),0,"r")==0){
14388: CV = mycoef(P,1,V);
14389: D = mymindeg(CV,c);
14390: if(D > 0) P = mysubst(P,[V,V/c^D]);
14391: CV = mycoef(P,1,V);
14392: DD = mydeg(CV,dx);
14393: CVV = mycoef(CV,DD,dx);
14394: CD1 = mydeg(CVV,x);
14395: CD = (X==x1)?0:CD1;
14396: while(CD>=0 && CD<=CD1){
14397: CC = mycoef(CVV,CD,x);
14398: if(type(CC)==1){
14399: VT = mycoef(mycoef(mycoef(P,DD,dx),CD,x),0,V)/CC;
14400: if(VT != 0) P = mysubst(P,[V,V-VT]);
14401: break;
14402: }
14403: if(X==x1) CD++;
14404: else CD--;
14405: }
14406: while(subst(P,c,0,V,0) == 0)
14407: P = red(mysubst(P,[V,c*V])/c);
14408: }
14409: VS =cdr(VS);
14410: }
14411: return P;
14412: }
14413:
14414: def pgen(L,VV)
14415: {
14416: if(type(L[0])<4) L=[L];
14417: if(type(L)==4) L=ltov(L);
14418: K=length(L);
14419: V=newvect(K);
14420: if(type(Sum=getopt(sum))!=1) Sum=0;
14421: if((Num=getopt(num))!=1) Num=0;
14422: if((Sep=getopt(sep))!=1) Sep=0;
14423: if(type(Shift=getopt(shift))!=1) Shift=0;
14424: for(;;){
14425: for(PP=1,R=[],II=K-1; II>=0; II--){
14426: R=cons(V[II]+Shift,R);
14427: if(II>0 && Sep==1) R=cons("_",R);
14428: PP*=L[II][0]^V[II];
14429: }
14430: P+=makev(cons(VV,R)|num=Num)*PP;
14431: for(I=0;I<K;){
14432: if(++V[I]<=L[I][1]){
14433: if(Sum>0){
14434: for(S=II=0;II<K;) S+=V[II++];
14435: if(S>Sum){
14436: V[I++]=0;
14437: continue;
14438: }
14439: }
14440: }else{
14441: V[I++]=0;
14442: continue;
14443: }
14444: break;
14445: }
14446: if(I>=K) return P;
14447: }
14448: }
14449:
1.3 takayama 14450: def diagm(M,A)
14451: {
1.4 ! takayama 14452: return mgen(M,0,A,1);
1.3 takayama 14453: }
14454:
1.1 takayama 14455: def mgen(M,N,A,S)
14456: {
14457: if(M==0 && N==0){
14458: mycat([
14459: "mgen(m,n,a,s|sep=1) : generate a matrix of size m x n\n",
1.4 ! takayama 14460: " n : a number or \"diagonal\", \"highdiag\", \"lowdiag\",\"skew\",\"symmetric\",\"perm\" = 0,-1,-2,..\n",
1.1 takayama 14461: " a : a symbol or list (ex. a, [a], [a,b,c], [1,2,3])\n",
14462: " s : 0 or 1 (shift of suffix)\n"
14463: ]);
14464: return 0;
14465: }
1.4 ! takayama 14466: if(type(N)==7) N=-findin(N,["diag","highdiag","lowdiag","skew","symmetric","perm"]);
1.1 takayama 14467: Sep=(getopt(sep)==1)?1:0;
14468: if(S < 0 || S > 2)
14469: S = 0;
14470: if(M+S > 30 || N+S > 30){
14471: erno(1);
14472: return;
14473: }
1.4 ! takayama 14474: if(N==-5){
! 14475: NM=newmat(M,M);
! 14476: for(I=0;I<M;I++,A=cdr(A)) NM[I][car(A)-S]=1;
! 14477: return NM;
! 14478: }
1.1 takayama 14479: if(type(A) == 4)
14480: L = length(A)-1;
14481: else
14482: L = -1;
14483: if(N <= 0 && N >= -2){
14484: MM = newmat(M,M);
14485: J = K = 0;
14486: if(N == -1){
14487: K = 1; M--;
14488: }else if(N == -2){
14489: J = 1; M--;
14490: }
14491: for(I = 0; I < M; I++){
14492: if(L >= 0)
14493: MM[I+J][I+K] = A[(I > L)?L:I];
14494: else if(type(A)==7 || isvar(A))
14495: MM[I+J][I+K] = makev([A,S+I]|sep=Sep);
14496: else
14497: MM[I+J][I+K] = A;
14498: }
14499: return MM;
14500: }
14501: K = N;
14502: if(K < 0) N = M;
14503: MM = newmat(M,N);
14504: for(I = 0; I < M; I++){
14505: if(L >= 0)
14506: AA = rtostr(A[(I > L)?L:I]);
14507: else
14508: AA = rtostr(A)+rtostr(I+S);
14509: if(AA>="0" && AA<=":"){
14510: erno(0); return;
14511: }
14512: for(J = 0; J < N; J++){
14513: if(K < 0){
14514: if(I > J) continue;
14515: if(K == -3 && I == J) continue;
14516: }
14517: MM[I][J] = makev([AA,J+S]|sep=Sep);
14518: }
14519: }
14520: if(K < 0){
14521: for(I = 0; I < M; I++){
14522: for(J = 0; J < I; J++)
14523: MM[I][J] = (K == -4)?MM[J][I]:-MM[J][I];
14524: }
14525: }
14526: return MM;
14527: }
14528:
14529: def newbmat(M,N,R)
14530: {
14531: S = newvect(M);
14532: T = newvect(N);
14533: IM = length(R);
14534: for(I = 0; I < IM; I++){
14535: RI = R[I];
14536: JM = length(RI);
14537: for(J = 0; J < JM; J++){
14538: RIJ = RI[J];
14539: if(type(RIJ) == 6){
14540: S[I] = size(RIJ)[0];
14541: T[J] = size(RIJ)[1];
14542: }
14543: }
14544: }
14545: for(I = K = 0; I < M; I++){
14546: if(S[I] == 0)
14547: S[I] = 1;
14548: K += S[I];
14549: }
14550: for(J = L = 0; J < N; J++){
14551: if(T[J] == 0)
14552: T[J] = 1;
14553: L += T[J];
14554: }
14555: M = newmat(K,L);
1.3 takayama 14556: if(type(Null=getopt(null))>0){
14557: for(I=0;I<K;I++){
14558: for(J=0;J<L;J++) M[I][J]=Null;
14559: }
14560: }
1.1 takayama 14561: for(I0 = II = 0; II < IM; I0 += S[II++]){
14562: RI = R[II];
14563: JM = length(RI);
14564: for(J0 = JJ = 0; JJ < JM; J0 += T[JJ++]){
14565: if((RIJ = RI[JJ]) == 0)
14566: continue;
14567: Type = type(RIJ);
14568: for(I = 0; I < S[II]; I++){
14569: for(J = 0; J < T[JJ]; J++){
14570: if(Type == 6)
14571: M[I0+I][J0+J] = RIJ[I][J];
14572: else if(Type == 4 || Type == 5)
14573: M[I0+I][J0+J] = (I>0)?RIJ[I]:RIJ[J];
14574: else
14575: M[I0+I][J0+J] = RIJ;
14576: }
14577: }
14578: }
14579: }
14580: return M;
14581: }
14582:
1.4 ! takayama 14583: def unim(S)
! 14584: {
! 14585: if(!Rand++) random(currenttime());
! 14586: if(!isint(Wt=getopt(wt))||Wt<0||Wt>10) Wt=2;
! 14587: if(!isint(Xa=getopt(abs)) || Xa<1)
! 14588: Xa=9;
! 14589: if((Xaa=Xa)>10) Xaa=10;
! 14590: if(Xaa%2) Xaa++;
! 14591: Xh=Xaa/2;
! 14592: if(type(S0=SS=S)==4){
! 14593: Int=(getopt(int)==1)?1:0;
! 14594: U=[1,1,1,1,1,1,1,1,1,1,1,1,2,2,3,4];
! 14595: M=newmat(S[0],S[1]);
! 14596: SS=cdr(S);SS=cdr(SS);
! 14597: if(Rk=length(SS)) L=SS;
! 14598: else{
! 14599: L=[0];
! 14600: I=(S[0]>S[1])?S[1]:S[0];
! 14601: if(I<=2) return 0;
! 14602: if(!isint(Rk=getopt(rank))||Rk<1||Rk>S[0]||Rk>S[1])
! 14603: Rk=random()%(I-1)+2;
! 14604: for(I=1;I<Rk;){
! 14605: P=random()%(S[1]+Wt)-Wt;
! 14606: if(P<=0) P=1;
! 14607: if(findin(P,L)!=0){
! 14608: L=cons(P,L);
! 14609: I++;
! 14610: }
! 14611: }
! 14612: }
! 14613: L=ltov(qsort(L));
! 14614: M[0][L[0]]=1;
! 14615: for(I=1;I<Rk;I++){
! 14616: P=Int?1:U[random()%length(U)];
! 14617: if(P>Xa) P=Xa;
! 14618: M[I][L[I]]=(random()%2)?P:(-P);
! 14619: }
! 14620: for(I=0;I<Rk;I++){
! 14621: if(I!=0&&abs(M[I][L[I]])>1) M[K=random()%I][KK=L[I]]=1;
! 14622: I0=(I==0)?1:L[I]+1;
! 14623: I1=(I==Rk-1)?S[1]:L[I+1];
! 14624: for(J=I0;J<I1;J++){
! 14625: for(K=1;K<=Xa;K++){
! 14626: P=random()%(I+1);
! 14627: if((random()%2)==1) M[P][J]++;
! 14628: else M[P][J]--;
! 14629: }
! 14630: }
! 14631: }
! 14632: S=M;
! 14633: Res=(getopt(res)==1)?dupmat(S):0;
! 14634: }
! 14635: Conj=0;
! 14636: if(type(S)<2){
! 14637: if(S<2||S>20) return 0;
! 14638: if(getopt(conj)==1){
! 14639: M=S+Wt;
! 14640: if(M>15) M=10;
! 14641: M0=floor((M-1)/2);
! 14642: for(R=[],I=0;I<S;I++) R=cons(random()%M-M0,R);
! 14643: R=qsort(R);
! 14644: M=diagm(S,R);
! 14645: if(getopt(diag)!=1){
! 14646: for(I=1;I<S;I++)
! 14647: if(M[I-1][I-1]==M[I][I] && random()%2) M[I-1][I]=1;
! 14648: }
! 14649: if(M[0][0]==M[S-1][S-1]){
! 14650: for(I=1;I<S;I++) if(M[I-1][I]==1) break;
! 14651: if(I==S){
! 14652: if(M[0][0]>0) M[0][0]--;
! 14653: else M[S-1][S-1]++;
! 14654: }
! 14655: }
! 14656: if(getopt(res)==1) RR=diagm(S,[1]);
! 14657: S1=S;
! 14658: Res=dupmat(S=M);
! 14659: if(isint(I=getopt(int))&&I>1&&random()%I==0){
! 14660: K=S[0][0];L=K+1;
! 14661: for(I=1;I<S1;I++){
! 14662: if(S[I][I]>L && S[I-1][I]==0 && (I==S1-1||S[I][I+1]==0)){
! 14663: L=S[I][I];
! 14664: if(RR){
! 14665: RR[I][I]=L-K;RR[0][I]=1;
! 14666: /* S=RR*S*myinv(RR); */
! 14667: }
! 14668: S[0][I]=1;
! 14669: if(!(random()%3)) break;
! 14670: }
! 14671: }
! 14672: if(random()%3==0){
! 14673: for(I=0;I<S1-1;I++){
! 14674: if(iand(S[I][I],1)&&S[I][I+1]==1){
! 14675: for(J=I+2;J<S1&&S[I][J]==0;J++);
! 14676: if(J<S1) continue;
! 14677: for(J=I-1;J>=0&&S[J][I]==0;J--);
! 14678: if(J>=0) continue;
! 14679: S[I][I+1]=2;
! 14680: for(J=0;J<S1;J++) RR[I][J]*=2;
! 14681: break;
! 14682: }
! 14683: }
! 14684: }
! 14685: }
! 14686: }else{
! 14687: M=diagm(S,[1]);
! 14688: S1=S;
! 14689: }
! 14690: }
! 14691: if(type(S)==6){
! 14692: M=dupmat(S);
! 14693: S=size(S);
! 14694: S1=S[1];S=S[0];
! 14695: Nt=1;
! 14696: if(getopt(conj)==1&&S==S1) Conj=1;
! 14697: }
! 14698: if(!isint(Ct=getopt(time)))
! 14699: Ct=(S>3||S1>3)?100:200;
! 14700: if(getopt(both)==1){
! 14701: OL=delopt(getopt(),"both");
! 14702: M=unim(mtranspose(M)|option_list=OL);
! 14703: M=mtranspose(M);
! 14704: }
! 14705: Mx=20;
! 14706: for(I=K=LL=0;I<Ct+Mx;I++){
! 14707: P=random()%S;Q=random()%S;
! 14708: if(3*K>Ct) T=random()%Xaa-Xh;
! 14709: else if(5*K<Ct) T=random()%2-1;
! 14710: else T=random()%4-2;
! 14711: if(T>=0) T++;
! 14712: if(P==Q) continue;
! 14713: for(G=0,J=S1-1;J>=0;J--){
! 14714: if((H=abs(M[Q][J]+M[P][J]*T))>Xa&&(!Conj||J!=P)) break;
! 14715: if(K<Mx&&!Conj) G=igcd(G,H);
! 14716: }
! 14717: if(K<Mx && G>1) J=1;
! 14718: if(J>0) continue;
! 14719: if(J<0&&Conj==1){
! 14720: for(J=S1-1;J>=0;J--)
! 14721: if(J!=Q&&abs(M[J][P]-M[J][Q]*T)>Xa) break;
! 14722: if(J<0&&abs(M[Q][P]-M[Q][Q]*T+M[P][P]*T-M[P][Q]*T^2)>Xa) J=1;
! 14723: if(J<0&&M[P][P]==M[Q][Q]){
! 14724: LF=0;
! 14725: for(L=S1-1;J>=0;J--) if(L!=Q&&M[J][Q]!=0) LF++;
! 14726: for(L=S1-1;J>=0;J--) if(L!=P&&M[P][J]!=0) LF++;
! 14727: if(!LF) J=1;
! 14728: }
! 14729: }
! 14730: if(J<0){
! 14731: for(J=S1-1;J>=0;J--)
! 14732: M[Q][J]+=M[P][J]*T;
! 14733: if(Conj==1)
! 14734: for(J=S1-1;J>=0;J--) M[J][P]-=M[J][Q]*T;
! 14735: if(RR) for(J=S1-1;J>=0;J--) RR[Q][J]+=RR[P][J]*T;
! 14736: K++;
! 14737: }
! 14738: if(!Nt&&K%5==0) M=mtranspose(M);
! 14739: if(I>Ct){
! 14740: for(L=S-1;L>=0;L--){
! 14741: for(F=0,J=S1-1;J>=0;J--)
! 14742: if(M[L][J]!=0) F++;
! 14743: if(F<2){
! 14744: F=-1;break;
! 14745: }
! 14746: else F=0;
! 14747: }
! 14748: if(F<0 && LL++<5){
! 14749: I=(CT-CT%2)/2;K=1;
! 14750: }
! 14751: if(I>Ct) break;
! 14752: }
! 14753: }
! 14754: if(RR){
! 14755: for(I=F=0;I<S1;I++){
! 14756: V=Res[I][I];
! 14757: for(J=I+1;J<S1;J++){
! 14758: if(Res[J][J]!=V) break;
! 14759: for(LP=0;LP<2;LP++){
! 14760: if(J==S1-1||Res[J][J+1]==0){
! 14761: if(I==0||Res[I-1][I]==0){
! 14762: for(VL=VS=[],K=0;K<S1;K++){
! 14763: VL=cons(RR[K][J],VL);VS=cons(RR[K][I],VS);
! 14764: }
! 14765: VR=ldev(VL,VS);
! 14766: if(VR[0]){
! 14767: for(K=S1-1,VN=VR[1];K>=0;K--,VN=cdr(VN))
! 14768: RR[K][J]=car(VN);
! 14769: F=1;
! 14770: }
! 14771: }
! 14772: }
! 14773: K=I;I=J;J=K;
! 14774: }
! 14775: }
! 14776: if(F&&I==S1-1){
! 14777: F=0;I=-1;
! 14778: }
! 14779: }
! 14780: if(getopt(int)==1){
! 14781: N=mtranspose(M);
! 14782: for(F=I=0;I<S1;I++) if(lgcd(M[I])>1||lgcd(N[I])>1) F++;
! 14783: if(F){
! 14784: for(F=I=0;I<S1;I++){
! 14785: if(Res[I][I]==-1) F=ior(F,1);
! 14786: else if(Res[I][I]==1) F=ior(F,2);
! 14787: }
! 14788: C=0;
! 14789: if(!iand(F,1)) C=1;
! 14790: else if(!iand(F,2)) C=-1;
! 14791: if(C){
! 14792: for(I=0;I<S1;I++){
! 14793: M[I][I]+=C;Res[I][I]+=C;
! 14794: }
! 14795: }
! 14796: }
! 14797: }
! 14798: if(getopt(rep)!=1){
! 14799: for(Lp=0;Lp<5;Lp++){
! 14800: F=(M==Res||abs(lmax(RR))>Xa*10||abs(lmin(RR))>Xa*10)?1:0;
! 14801: for(I=0;!F&&I<S1&&Lp<4;I++){
! 14802: for(K=L=J=0;J<S1;J++){
! 14803: if(M[I][J]) K++;
! 14804: if(M[J][I]) L++;
! 14805: }
! 14806: if(K<2||L<2) F=1;
! 14807: }
! 14808: if(!F) break;
! 14809: R=unim(S0|option_list=cons(["rep",1],getopt()));
! 14810: M=R[0];Res=R[1];RR=R[3];
! 14811: }
! 14812: }
! 14813: }
! 14814: /* if(RR && M*RR!=RR*Res) mycat("Error"); */
! 14815: if(Res==0) return M;
! 14816: if(getopt(rep)!=1){
! 14817: if((F=getopt(dviout))==1){
! 14818: if(getopt(conj)==1){
! 14819: if(RR) show([Res,"=",myinv(RR),M,RR]|opt="spts0",str=1,lim=200);
! 14820: }else{
! 14821: if(type(Lim=getopt(lim))==1)
! 14822: mtoupper(M,0|step=1,opt=7,dviout=1,pages=1,lim=Lim);
! 14823: else mtoupper(M,0|step=1,opt=7,dviout=1,pages=1);
! 14824: }
! 14825: }else if(F==-1){
! 14826: if(getopt(conj)==1){
! 14827: if(RR) return ltotex([Res,"=",myinv(RR),M,RR]|opt="spts0",str=1,lim=200);
! 14828: }else{
! 14829: if(type(Lim=getopt(lim))==1)
! 14830: return mtoupper(M,0|step=1,opt=7,pages=1,lim=Lim,dviout=-1);
! 14831: else return mtoupper(M,0|step=1,opt=7,pages=1,dviout=-1);
! 14832: }
! 14833: }
! 14834: }
! 14835: return (RR==0)?[M,Res]:[M,Res,myinv(RR),RR];
! 14836: }
! 14837:
1.1 takayama 14838: def pfrac(F,X)
14839: {
14840: F = red(F);
14841: FN = nm(F);
14842: FD = dn(F);
14843: if(mydeg(FD,X) == 0)
14844: return [[F,1,1]];
14845: R = rpdiv(FN,FD,X);
14846: FN = R[0]/R[1];
14847: R0 = R[2]/R[1];
14848: FC = fctr(FD);
1.4 ! takayama 14849: RT=[];
! 14850: if(getopt(root)==2){
! 14851: for(FE=[],FT=FC;FT!=[];FT=cdr(FT)){
! 14852: if(mydeg(P=car(FT)[0],X)==4 && vars(P)==[X] && pari(issquare,C=mycoef(P,4,X))){
! 14853: if((S=mycoef(P,3,X)/4/C)!=0) P=subst(P,X,X-S);
! 14854: if(mycoef(P,1,X)==0 && pari(issquare,C0=mycoef(P,0,X))){
! 14855: C=sqrtrat(C);C0=sqrtrat(C0);C1=2*C*C0-mycoef(P,2,X);
! 14856: if(C1>0){
! 14857: FE=cons([C*(X+S)^2-C1^(1/2)*(X+S)+C0,car(FT)[1]],FE);
! 14858: FE=cons([C*(X+S)^2+C1^(1/2)*(X+S)+C0,car(FT)[1]],FE);
! 14859: RT=cons(C1,RT);
! 14860: continue;
! 14861: }
! 14862: }
! 14863: }
! 14864: FE=cons(car(FT),FE);
! 14865: }
! 14866: FC=reverse(FE);
! 14867: }
1.1 takayama 14868: N = Q = 0;
14869: L = [];
14870: for(I = length(FC)-1; I >= 0; I--){
14871: if((D = mydeg(FC[I][0],X)) == 0) continue;
14872: for(K=1; K<=FC[I][1]; K++){
14873: for(J=P=0; J < D; J++){
14874: V = makev(["zz_",++N]);
14875: P = P*X + V;
14876: L = cons(V,L);
14877: }
14878: Q += P/(FC[I][0]^K);
14879: Q = red(Q);
14880: }
14881: }
14882: L=reverse(L);
14883: Q = nm(red(red(Q*FD)-FN));
14884: Q = ptol(Q,X);
14885: S = lsol(Q,L);
14886: R = (R0==0)?[]:[[R0,1,1]];
14887: for(N=0,I=length(FC)-1; I >= 0; I--){
14888: if((D = mydeg(FC[I][0],X)) == 0) continue;
14889: for(K=1; K<=FC[I][1]; K++){
14890: for(P=J=0; J < D; N++,J++)
14891: P = P*X + S[N][1];
1.4 ! takayama 14892: if(P!=0) R = cons([P,FC[I][0],K],R);
1.1 takayama 14893: }
14894: }
1.4 ! takayama 14895: for(;RT!=[];RT=cdr(RT)){
! 14896: RTT=car(RT);
! 14897: R=mtransbys(os_md.substblock,R,[RTT^(1/2),(RTT^(1/2))^2,RTT]);
! 14898: }
1.1 takayama 14899: TeX=getopt(TeX);
14900: if((Dvi=getopt(dviout))==1||TeX==1){
14901: V=strtov("0");
14902: for(S=L=0,RR=R;RR!=[];RR=cdr(RR),L++){
14903: RT=car(RR);
14904: S+=(RT[0]/RT[1]^RT[2])*V^L;
14905: }
14906: if(TeX!=1) fctrtos(S|var=[V,""],dviout=1);
14907: else return fctrtos(S|var=[V,""],TeX=3);
14908: }
14909: return reverse(R);
14910: }
14911:
14912: def cfrac(X,N)
14913: {
14914: F=[floor(X)];
14915: if(N<0){
14916: Max=N=-N;
14917: }
14918: X-=F[0];
14919: if(Max!=1)
14920: M=mat([F[0],1],[1,0]);
14921: for(;N>0 && X!=0;N--){
14922: X=1/X;
14923: F=cons(Y=floor(X),F);
14924: X-=Y;
14925: if(Max){
14926: M0=M[0][0];M1=M[1][0];
14927: M=M*mat([Y,1],[1,0]);
14928: if(M[0][0]>Max) return M0/M1;
14929: }
14930: }
14931: return (Max==0)?reverse(F):M[0][0]/M[1][0];
14932: }
14933:
1.4 ! takayama 14934: def sqrt2rat(X)
! 14935: {
! 14936: if(type(X)>3) return X;
! 14937: X=red(X);
! 14938: if(getopt(mult)==1){
! 14939: for(V=vars(X);V!=[];V=cdr(V)){
! 14940: T=funargs(F=car(V));
! 14941: if(type(T)==4&&length(T)>1){
! 14942: Y=T[1];
! 14943: Z=sqrt2rat(Y);
! 14944: if(Y!=Z){
! 14945: if(length(T)==2){
! 14946: T0=T[0];
! 14947: X=subst(X,F,T0(Z));
! 14948: }else if(T[0]==pow)
! 14949: X=subst(X,F,Y^T[2]);
! 14950: }
! 14951: }
! 14952: }
! 14953: }
! 14954: for(V=vars(X);V!=[];V=cdr(V)){ /* r(x)^(1/2+n) -> r(x)^n*r(x)^(1/2) */
! 14955: T=args(Y=car(V));
! 14956: if(functor(Y)==pow&&T[1]!=1/2&&isint(T2=2*T[1])){
! 14957: if(iand(T2,1)){
! 14958: R=(T[0])^(1/2);T2--;
! 14959: }else R=1;
! 14960: R*=T[0]^(T2/2);
! 14961: X=red(subst(X,Y,R));
! 14962: }
! 14963: }
! 14964: D=dn(X);N=nm(X);
! 14965: if(imag(D)!=0){
! 14966: N*=conj(D);
! 14967: D*=conj(D);
! 14968: return sqrt2rat(N/D);
! 14969: }
! 14970: for(V=vars(N);V!=[];V=cdr(V)){ /* (r(x)^(n/m))^k */
! 14971: T=args(Y=car(V));
! 14972: if(functor(Y)==pow&&(T[1]==0||(type(T[1])==1&&ntype(T[1])==0))){
! 14973: Dn=dn(T[1]);Nm=nm(T[1]);
! 14974: N=substblock(N,Y,Y^Dn,T[0]^Nm);
! 14975: }
! 14976: }
! 14977: for(V=vars(D);V!=[];V=cdr(V)){
! 14978: T=args(Y=car(V));
! 14979: if(functor(Y)==pow&&(T[1]==0||(type(T[1])==1&&ntype(T[1])==0))){
! 14980: Dn=dn(T[1]);Nm=nm(T[1]);
! 14981: D=substblock(D,Y,Y^Dn,T[0]^Nm);
! 14982: }
! 14983: }
! 14984: for(V=vars(D);V!=[];V=cdr(V)){
! 14985: T=args(Y=car(V));
! 14986: if(functor(Y)==pow&&T[1]==1/2&&mydeg(D,Y)==1){
! 14987: N*=mycoef(D,0,Y)-mycoef(D,1,Y)*Y;
! 14988: N=mycoef(N,0,Y)+mycoef(N,1,Y)*Y+mycoef(N,2,Y)*T[0];
! 14989: D=mycoef(D,0,Y)^2-mycoef(D,1,Y)^2*T[0];
! 14990: X=red(N/D);
! 14991: D=dn(X);N=nm(X);
! 14992: break;
! 14993: }
! 14994: }
! 14995: X=red(N/D);
! 14996: D=dn(X);N=nm(X);
! 14997: for(V=vars(D);V!=[];V=cdr(V)){
! 14998: T=args(Y=car(V));
! 14999: if(functor(Y)==pow&&T[1]==1/2)
! 15000: D=substblock(D,T[0]^T[1],(T[0]^T[1])^2,T[0]);
! 15001: }
! 15002: for(V=vars(N);V!=[];V=cdr(V)){
! 15003: T=args(Y=car(V));
! 15004: if(functor(Y)==pow&&T[1]==1/2)
! 15005: N=substblock(N,T[0]^T[1],(T[0]^T[1])^2,T[0]);
! 15006: }
! 15007: for(V=vars(N);V!=[];V=cdr(V)){
! 15008: T=args(Y=car(V));
! 15009: if(functor(Y)==pow&&T[1]==1/2){
! 15010: Ag=T[0];
! 15011: R=S=1;
! 15012: An=fctr(nm(Ag));
! 15013: CA=An[0][0];
! 15014: if(CA<0){
! 15015: CA=-CA;R=-1;
! 15016: }
! 15017: if(type(I=sqrtrat(CA))<2) S=I;
! 15018: else R*=CA;
! 15019: for(An=cdr(An);An!=[];An=cdr(An)){
! 15020: Pw=car(An)[1];I=iand(Pw,1);
! 15021: if(I) R*=car(An)[0];
! 15022: if((Q=(Pw-I)/2)>0) S*=car(An)[0]^Q;
! 15023: }
! 15024: for(An=fctr(dn(Ag));An!=[];An=cdr(An)){
! 15025: Pw=car(An)[1];I=iand(Pw,1);
! 15026: if(I) R/=car(An)[0]^I;
! 15027: if((Q=(Pw-I)/2)>0) S/=car(An)[0]^Q;
! 15028: }
! 15029: if(S!=1) N=subst(N,Y,R^(1/2)*S);
! 15030: }
! 15031: }
! 15032: for(V=vars(N);V!=[];V=cdr(V)){
! 15033: T=args(Y=car(V));
! 15034: if(functor(Y)==pow&&T[1]==1/2){
! 15035: C=mycoef(N,1,Y);
! 15036: for(VC=vars(C);VC!=[];VC=cdr(VC)){
! 15037: TC=args(YC=car(VC));
! 15038: if(functor(YC)==pow&&TC[1]==1/2){
! 15039: Ag=red(T[0]*TC[0]);
! 15040: R=S=1;
! 15041: An=fctr(nm(Ag));
! 15042: CA=An[0][0];
! 15043: if(CA<0){
! 15044: CA=-CA;R=-1;
! 15045: }
! 15046: if(type(I=sqrtrat(CA))<2) S=I;
! 15047: else R*=CA;
! 15048: for(An=cdr(An);An!=[];An=cdr(An)){
! 15049: Pw=car(An)[1];I=iand(Pw,1);
! 15050: if(I) R*=car(An)[0];
! 15051: if((Q=(Pw-I)/2)>0) S*=car(An)[0]^Q;
! 15052: }
! 15053: for(An=fctr(dn(Ag));An!=[];An=cdr(An)){
! 15054: Pw=car(An)[1];I=iand(Pw,1);
! 15055: if(I) R/=car(An)[0]^I;
! 15056: if((Q=(Pw-I)/2)>0) S/=car(An)[0]^Q;
! 15057: }
! 15058: CC=mycoef(C,1,YC);
! 15059: N=N-CC*YC*Y+CC*R^(1/2)*S;
! 15060: }
! 15061: }
! 15062: }
! 15063: }
! 15064: return red(N/D);
! 15065: }
! 15066:
1.1 takayama 15067: def cfrac2n(X)
15068: {
1.4 ! takayama 15069: if(type(L=getopt(loop))==1&&L>0)
! 15070: C=x;
! 15071: else{
! 15072: C=0;L=0;
! 15073: }
! 15074: if(L>1){
! 15075: for(Y=[];L>1;L--){
! 15076: Y=cons(car(X),Y);
! 15077: X=cdr(X);
! 15078: }
! 15079: if(X!=[]){
! 15080: P=cfrac2n(X|loop=1);
! 15081: for(V=P,Y=reverse(Y);Y!=[];Y=cdr(Y))
! 15082: V=sqrt2rat(car(Y)+1/V);
! 15083: return V;
! 15084: }else{
! 15085: C=0;X=reverse(Y);
! 15086: }
! 15087: }
! 15088: for(V=C,X=reverse(X);X!=[];X=cdr(X)){
1.1 takayama 15089: if(V!=0) V=1/V;
15090: V+=car(X);
15091: }
1.4 ! takayama 15092: if(C!=0){
! 15093: V=red(V);P=dn(V)*x-nm(V);
! 15094: S=getroot(P,x|cpx=2);
! 15095: T=map(eval,S);
! 15096: V=(T[0]>0)?S[0]:S[1];
! 15097: }
1.1 takayama 15098: return V;
15099: }
15100:
15101: def s2sp(S)
15102: {
15103: if(type(S)==7){
15104: S = strtoascii(S);
15105: if(type(S) == 5) S = vtol(S);
15106: for(N=0,R=TR=[]; S!=[]; S=cdr(S)){
15107: if(car(S)==45) /* - */
15108: N=1;
15109: else if(car(S)==47) /* / */
15110: N=2;
15111: if(N>0){
15112: while(car(S)<48&&car(S)!=40) S=cdr(S);
15113: }
15114: if((T=car(S))>=48 && T<=57) TR=cons(T-48,TR);
15115: else if(T>=97) TR=cons(T-87,TR);
15116: else if(T>=65 && T<=90) TR=cons(T-29,TR); /* A-Z */
15117: else if(T==44){
15118: R=cons(reverse(TR),R);
15119: TR=[];
15120: }else if(T==94){ /* ^ */
15121: S=cdr(S);
15122: if(car(S)==40){ /* ( */
15123: S=cdr(S);
15124: for(T=0; car(S)!=41 && S!=[]; S=cdr(S)){
15125: V=car(S)-48;
15126: if(V>=10) V-=39;
15127: T=10*T+V;
15128: }
15129: }else{
15130: while(car(S)<48) S=cdr(S);
15131: T=car(S)-48;
15132: if(T>=10) T-=39;
15133: }
15134: while(--T>=1) TR=cons(car(TR),TR);
15135: }else if(T==40){ /* ( */
15136: S=cdr(S);
15137: if(N==1){
15138: N=0; NN=1;
15139: }else NN=0;
15140: if(car(S)==45){ /* - */
15141: S=cdr(S);
15142: NN=1-NN;
15143: }
15144: for(I=0; I<2; I++){
15145: for(V=0; (SS=car(S))!=41 && SS!=47 && S!=[]; S=cdr(S)){
15146: T=SS-48;
15147: if(T>=10) T-=39;
15148: V=10*V+T;
15149: }
15150: if(NN==1){
15151: V=-V; NN=0;
15152: }
15153: TR=cons(V,TR);
15154: if(SS!=47) break;
15155: else{
15156: N=2; S=cdr(S);
15157: }
15158: }
1.4 ! takayama 15159: }else if(T==60){
! 15160: for(V=[],S=cdr(S);S!=[]&&car(S)!=62;S=cdr(S))
! 15161: V=cons(car(S),V);
! 15162: if(car(S)!=62) continue;
! 15163: TR=cons(eval_str(asciitostr(reverse(V))),TR);
1.1 takayama 15164: }else if(T<48) continue;
15165: if(N==1){
15166: T = car(TR);
15167: TR=cons(-T,cdr(TR));
15168: N=0;
15169: }else if(N==2){
15170: T=car(TR); TR=cdr(TR);
15171: TR=cons(car(TR)/T,cdr(TR));
15172: N=0;
15173: }
15174: }
15175: return reverse(cons(reverse(TR),R));
15176: }else if(type(S)==4){
15177: Num=getopt(num);
15178: for(R=[]; ; ){
1.4 ! takayama 15179: if(type(TS=car(S))!=4) return;
! 15180: for(; TS!=[]; TS=cdr(TS)){
1.1 takayama 15181: V=car(TS);
1.4 ! takayama 15182: if(type(V)>1||(type(V)==1&&ntype(V)>0)){
! 15183: V="<"+rtostr(V)+">";
! 15184: R=append(reverse(strtoascii(V)),R);
! 15185: continue;
! 15186: }
1.1 takayama 15187: if(dn(V)>1){
15188: P=reverse(strtoascii(rtostr(V)));
15189: R=append(P,cons(40,R));
15190: R=cons(41,R);
15191: continue;
15192: }
15193: if(V<0 && V>-10){
15194: V=-V;
15195: R=cons(45,R);
15196: }
15197: if(V<0 || V>35 || (V>9 && Num==1)){
15198: P=reverse(strtoascii(rtostr(V)));
15199: R=append(P,cons(40,R));
15200: V=41;
15201: }else if(V<10) V+=48;
15202: else V+=87;
15203: R=cons(V,R);
15204: }
15205: if((S=cdr(S))==[]) break;
15206: R=cons(44,R);
15207: }
15208: return asciitostr(reverse(R));
15209: }
15210: return 0;
15211: }
15212:
15213: def sp2grs(M,A,L)
15214: {
15215: MM = [];
15216: T0 = 0;
15217: Mat=getopt(mat);
15218: if(Mat!=1) Mat=0;
15219: if(type(M)==7) M=s2sp(M);
15220: if((LM = length(M)) > 10 && type(A) < 4)
15221: CK = 1;
15222: Sft = (type(L)==1)?L:0;
15223: if(type(L)==4 && length(L)>=3)
15224: Sft = L[2];
15225: if(Sft < 0){
15226: T0 = 1;
15227: Sft = -Sft-1;
15228: }
15229: for(I = LM-1; I >= 0; I--){
15230: MI = M[I]; MN = [];
15231: if(CK == 1 && length(MI) > 10){
15232: erno(1);
15233: return;
15234: }
15235: if(type(A) == 4)
15236: AA = rtostr(A[I]);
15237: else
15238: AA = rtostr(A)+rtostr(I);
15239: for(J = LM = length(MI)-1; J >= 0; J--){
15240: V = MI[J];
15241: if(type(V) > 3)
15242: V = V[0];
15243: if(T0 == 0 || I == 0)
15244: MN = cons([V, makev([AA,J+Sft])], MN);
15245: else{
15246: if(LM == 1)
15247: MN = cons([V, (J==0)?0:makev([AA])], MN);
15248: else if(I == 1 && Mat == 0)
15249: MN = cons([V, (J==length(MI)-1)?0:makev([AA,J+Sft])], MN);
15250: else
15251: MN = cons([V, (J==0)?0:makev([AA,J])], MN);
15252: }
15253: }
15254: MM = cons(MN, MM);
15255: }
15256: if(type(L) == 4 && length(L) >= 2){
15257: R = chkspt(MM|mat=Mat); /* R[3]: Fuchs */
15258: AA = var(MM[L[0]-1][L[1]-1][1]);
15259: if(AA==0) AA=var(R[3]);
15260: if(AA!=0 && (P = mycoef(R[3],1,AA))!=0){
15261: P = -mycoef(R[3], 0, AA)/P;
15262: MM = mysubst(MM,[AA,P]);
15263: }
15264: }
15265: return MM;
15266: }
15267:
15268: def intpoly(F,X)
15269: {
1.4 ! takayama 15270: if((T=ptype(F,X))<4){
! 15271: if(T<3){ /* polynomial */
! 15272: if(type(C=getopt(cos))>0){
! 15273: V=vars(F);
! 15274: Z=makenewv(V);
! 15275: W=makenewv(cons(Z,V));
! 15276: Q=intpoly(F,X|exp=Z);
! 15277: Q=(subst(Q,Z,@i*C)*(Z+@i*W)+subst(Q,Z,-@i*C)*(Z-@i*W))/2;
! 15278: return [mycoef(Q,1,Z),mycoef(Q,1,W)];
! 15279: }
! 15280: if(type(C=getopt(sin))>0){
! 15281: Q=intpoly(F,X|cos=C);
! 15282: return [-Q[1],Q[0]];
! 15283: }
! 15284: if(type(C=getopt(log))>0){
! 15285: Q=intpoly(F,X);
! 15286: if(C[0]==0) return [Q,0];
! 15287: if(length(C)<3) C=[C[0],C[1],1];
! 15288: Q-=subst(Q,X,-C[1]/C[0]);
! 15289: if(iscoef(Q,os_md.israt)) Q=red(Q);
! 15290: if(C[2]==0) return [Q];
! 15291: S=subst(-Q*C[0]*C[2],X,X-C[1]/C[0]);
! 15292: for(R=0,D=mydeg(S,X);D>0;D--) R+=mycoef(S,D,X)*X^(D-1);
! 15293: R=subst(R,X,X+C[1]/C[0]);
! 15294: return cons(Q,intpoly(R,X|log=[C[0],C[1],C[2]-1]));
! 15295: }
! 15296: if(type(C=getopt(exp))>0){
! 15297: D = mydeg(F,X);
! 15298: for(P=Q=F/C;D>=0;D--){
! 15299: Q=-mydiff(Q,X)/C;
! 15300: P+=Q;
! 15301: }
! 15302: return P;
! 15303: }
! 15304: for(P=0,I=mydeg(F,X);I >= 0;I--)
! 15305: P += mycoef(F,I,X)*X^(I+1)/(I+1);
! 15306: return P;
! 15307: }
! 15308: R=pfrac(F,X|root=2); /* rational */
! 15309: for(P=0;R!=[];R=cdr(R)){
! 15310: if(type(V=getopt(dumb))==5){
! 15311: for(PF=[],RR=R;RR!=[];RR=cdr(RR))
! 15312: PF=cons(RR[0][0]/RR[0][1]^RR[0][2],PF);
! 15313: PF=[cons(X,reverse(PF))];
! 15314: if(P) PF=cons([1,P],PF);
! 15315: V[0]=cons(PF,V[0]);
! 15316: }
! 15317: RT=car(R);
! 15318: if(mydeg(RT[1],X)==0) P+=intpoly(RT[0]*RT[2],X);
! 15319: else if((Deg=mydeg(RT[1],X))==1){
! 15320: if(RT[2]>1) P+=RT[0]*RT[1]^(1-RT[2])/(1-RT[2])/mycoef(RT[1],1,X);
! 15321: else P+=RT[0]*log(RT[1])/mycoef(RT[1],1,X);
! 15322: P=red(P);
! 15323: }else if(Deg==2){
! 15324: D1=diff(RT[1],X);C1=mycoef(D1,1,X);
! 15325: B=2*C1*mycoef(RT[1],0,X)-mycoef(RT[1],1,X)^2; /* ax^2+bx+c => B=4ac-b^2 */
! 15326: B=sqrt2rat(B);
! 15327: N=RT[0];
! 15328: for(I=RT[2];I>0&&N!=0;I--){
! 15329: C0=mycoef(N,1,X)/C1;N-=C0*D1;
! 15330: if(C0){
! 15331: if(I>1) P-=C0/RT[1]^(I-1)/(I-1);
! 15332: else P+=C0*log(RT[1]);
! 15333: }
! 15334: if(I>1){
! 15335: BB=B/C1;
! 15336: P+=N*X/RT[1]^(I-1)/(I-1)/BB;
! 15337: N*=(2*I-3)/(I-1)/BB;
! 15338: }else{
! 15339: if(type(BR=sqrtrat(B))>3){
! 15340: mycat(["Cannot obtain sqare root of ",B]);
! 15341: return [];
! 15342: }
! 15343: if(real(nm(BR))!=0){
! 15344: P+=(2*N/BR)*atan(sqrt2rat(D1/BR|mult=1));
! 15345: }else{
! 15346: BR*=@i;BRI=sqrt2rat(1/BR);
! 15347: R1=(-mycoef(RT[1],1,X)+BR)/C1;
! 15348: R2=(-mycoef(RT[1],1,X)-BR)/C1;
! 15349: P+=N*BRI*log( /* sqrt2rat */((x-R1)/(x-R2)));
! 15350: }
! 15351: }
! 15352: P=red(P);
! 15353: }
! 15354: P=sqrt2rat(P);
! 15355: }else{
! 15356: mycat(["Cannot get an indefinite integral of ",F]);
! 15357: return [];
! 15358: }
! 15359: }
! 15360: Q=simplog(P,X);
! 15361: if(type(V)==5&&nmono(P)!=nmono(Q)) V[0]=cons([[1,red(P)]],V[0]);
! 15362: return red(Q);
! 15363: }
! 15364: return [];
! 15365: }
! 15366:
! 15367: def fshorter(P,X)
! 15368: {
! 15369: Q=sqrt2rat(P);
! 15370: R=trig2exp(Q,X|inv=1);
! 15371: if(str_len(fctrtos(R))<str_len(fctrtos(Q))) Q=R;
! 15372: Var=pfargs(Q,X|level=1);
! 15373: for(C=F=0,R=1,V=Var;V!=[];V=cdr(V)){
! 15374: if(findin(car(V)[1],[cos,sin,tan])>=0){
! 15375: if(!C){
! 15376: F=car(V)[2];
! 15377: }else{
! 15378: R=red(car(V)[2]/F);
! 15379: if(type(R)!=1) break;
! 15380: F/=dn(R);
! 15381: }
! 15382: C++;
! 15383: }
! 15384: }
! 15385: if(getopt(period)==1) return F;
! 15386: if(!isint(Log=getopt(log))) Log=0;
! 15387: if(V==[]&&F!=0){
! 15388: if(iand(Log,1)){
! 15389: H=append(cdr(fctr(nm(Q))),cdr(fctr(dn(Q))));
! 15390: for(L=0;H!=[];H=cdr(H))
! 15391: L+=str_len(rtostr(car(H)[0]));
! 15392: }else L=str_len(fctrtos(Q));
! 15393: S=trig2exp(P,X);
! 15394: for(T=[sin(F),tan(F),cos(F),sin(F/2),cos(F/2),tan(F/2)];T!=[];T=cdr(T)){
! 15395: R=trig2exp(S,X|inv=car(T));
! 15396: if(iand(Log,1)){
! 15397: H=append(cdr(fctr(nm(R))),cdr(fctr(dn(R))));
! 15398: for(K=0;H!=[];H=cdr(H))
! 15399: K+=str_len(rtostr(car(H)[0]));
! 15400: }else K=str_len(fctrtos(R));
! 15401: if(K<L){
! 15402: Q=R;L=K;
! 15403: }
! 15404: }
! 15405: }
! 15406: return Q;
! 15407: }
! 15408:
! 15409: def isshortneg(P)
! 15410: {
! 15411: return(str_len(rtostr(P))>str_len(rtostr(-P)))?1:0;
! 15412: }
! 15413:
! 15414: def simplog(R,X)
! 15415: {
! 15416: for(V=[],Var=pfargs(R,X);Var!=[];Var=cdr(Var)){
! 15417: VT=car(Var);
! 15418: if(VT[1]==log && ptype(R,VT[0])==2 && mydeg(R,VT[0])==1)
! 15419: V=cons([VT[0],VT[2],mycoef(R,1,VT[0])],V);
! 15420: }
! 15421: for(;V!=[];V=cdr(V)){
! 15422: VT=car(V);
! 15423: for(V2=cdr(V);V2!=[];V2=cdr(V2)){
! 15424: Dn=1;
! 15425: if((C=red(car(V2)[2]/VT[2]))!=1&&C!=-1){
! 15426: if(getopt(mult)==1&&type(C)==1&&ntype(C)==0){
! 15427: Dn=dn(C);C*=Dn;
! 15428: }else continue;
! 15429: }
! 15430: Log=red(VT[1]^Dn*car(V2)[1]^(Dn*C));
! 15431: L=str_len(rtostr(dn(Log)))-str_len(rtostr(nm(Log)));
! 15432: if(L>0 || (L==0&&isshortneg(VT[2])) ){
! 15433: Dn=-Dn;Log=1/Log;
! 15434: }
! 15435: R=mycoef(R,0,VT[0]);R=mycoef(R,0,car(V2)[0]);
! 15436: return(R+VT[2]*log(Log)/Dn);
! 15437: }
! 15438: }
! 15439: return R;
! 15440: }
! 15441:
! 15442: def integrate(P,X)
! 15443: {
! 15444: if(isint(Dvi=getopt(dviout))==1){
! 15445: if(Dvi==2||getopt(dumb)==-1){
! 15446: V=newvect(1);V[0]=[];
! 15447: }else V=0;
! 15448: if((RR=integrate(P,X|dumb=V))==[]) return R;
! 15449: S=fshorter(RR,X);
! 15450: VV=[X];
! 15451: if(V!=0){
! 15452: R=cons([[1,RR]],V[0]);
! 15453: if(S!=RR) R=cons([[1,RR=S]],R);
! 15454: for(V=FR=[];R!=[];R=cdr(R))
! 15455: if(car(R)!=FR) V=cons(FR=car(R),V);
! 15456: Var=varargs(V|all=1)[1];
! 15457: for(S0=[x0,x1,x2,x3],S=[t,s,u,v,w];S0!=[]&&S!=[];){
! 15458: if(findin(car(S0),Var)<0){
! 15459: S0=cdr(S0); continue;
! 15460: }
! 15461: if(findin(car(S),Var)>=0){
! 15462: S=cdr(S); continue;
! 15463: }
! 15464: V=subst(V,[car(S0),car(S)]);S0=cdr(S0);S=cdr(S);
! 15465: }
! 15466: if(Dvi==-2) return V;
! 15467: S1="\\,dx&";
! 15468: }else{
! 15469: V=[[],[[1,RR=S]]];
! 15470: S1="\\,dx";
! 15471: }
! 15472: if(type(P)>2){
! 15473: if(type(nm(P))<2){
! 15474: P=P*dx;S1=V?"&":"";
! 15475: }
! 15476: S=fctrtos(P|TeX=2,lim=0);SV0=my_tex_form(P);
! 15477: if(str_len(SV0)<str_len(S)) S=SV0;
! 15478: }else S=monototex(P);
! 15479: if(Dvi!=-2) S="\\int "+S+S1;
! 15480: else S="";
! 15481: for(L=[],V=cdr(V);V!=[];V=cdr(V)){
! 15482: CL=car(V);S0=["="]; /* a line */
! 15483: for(FL=0;CL!=[];CL=cdr(CL),FL++){
! 15484: CT=car(CL); /* a term */
! 15485: if((Y=CT[0])==0){ /* a variable */
! 15486: CT=cdr(CT);
! 15487: if(length(CT)>2) CT=cdr(CT);
! 15488: S0=["\\qquad(",CT[0],"=",CT[1],")"];
! 15489: break;
! 15490: }else{
! 15491: for(FT=0,S2=[],CT=cdr(CT);CT!=[];CT=cdr(CT),FT++){
! 15492: SV=fctrtos(car(CT)|TeX=2,lim=0);SV0=my_tex_form(car(CT));
! 15493: if(str_len(SV0)<str_len(SV)) SV=SV0;
! 15494: if(FL||FT||(F&&type(Y)<2)) SV=minustos(SV);
! 15495: S2=append(["+",SV],S2);
! 15496: }
! 15497: S2=reverse(cdr(S2));
! 15498: if(type(Y)>1){
! 15499: if(length(S2)>1){
! 15500: S1="\\int\\left(";S3="\\right)\\,d";
! 15501: }else{
! 15502: S1="\\int";S3="\\,d";
! 15503: }
! 15504: S2=cons(S1,append(S2,[S3,Y]));
! 15505: if(findin(Y,VV)<0) VV=cons(Y,VV);
! 15506: }
! 15507: if(FL) S0=append(S0,cons("+",S2));
! 15508: else S0=append(S0,S2);
! 15509: }
! 15510: }
! 15511: L=append([S0],L);
! 15512: };
! 15513: V=pfargs(RR,X|level=1);
! 15514: for(Var=[];V!=[];V=cdr(V)) Var=cons(car(V)[0],Var);
! 15515: Var=reverse(Var);
! 15516: if(!isint(J=getopt(frac))) J=0;;
! 15517: if(!iand(J,4)&&(!iand(J,2)||length(Var)==1)&&(iand(J,8)==8||ptype(RR,Var)==2)){
! 15518: F=1;
! 15519: if(iand(J,1)){
! 15520: K=str_len(fctrtos(RR));
! 15521: I=str_len(fctrtos(RR|var=Var));
! 15522: if(I>=K) F=0;
! 15523: }
! 15524: if(F){
! 15525: V=[fctrtos(RR|var=Var,TeX=2)];
! 15526: if(Dvi!=-2) V=cons("=",V);
! 15527: if(length(L)>0) L=cdr(L);
! 15528: L=append([V],L);
! 15529: }
! 15530: }else if(ptype(RR,X)==2){
! 15531: L=cdr(L);
! 15532: V=[fctrtos(RR|var=X,TeX=2)];
! 15533: if(Dvi!=-2) V=cons("=",V);
! 15534: L=append([V],L);
! 15535: }
! 15536: S=texket(S+ltotex(reverse(L)|opt=["cr","spts0"],str=1));
! 15537: if(getopt(log)!=1){
! 15538: for(V=[];VV!=[];VV=cdr(VV))
! 15539: V=cons(strtoascii(my_tex_form(car(VV))),V);
! 15540: S0=strtoascii(S); /* log(x) -> log|x| */
! 15541: L=length(S0);
! 15542: S1=strtoascii("\\log");
! 15543: S2=str_tb(0,0);
! 15544: for(I=0;;){
! 15545: if(I>=L||(J=str_str(S0,S1|top=I))<0
! 15546: ||(K=str_str(S0,40|top=J+4))<0
! 15547: ||(K!=J+4&&K!=J+9)||(N=str_pair(S0,K+1,40,41))<0){
! 15548: S=str_tb(0,S2)+str_cut(S0,I,100000);
! 15549: break;
! 15550: }
! 15551: if(str_str(S0,V|top=K+1,end=N-1)[0]<0) S2=str_tb(str_cut(S0,I,N),S2);
! 15552: /* log(a) -> log(a) */
! 15553: else{
! 15554: if(N<L-1&&S0[N+1]==94){ /* log(x)^2 -> (log|x|)^2 */
! 15555: S2=str_tb([str_cut(S0,I,J-1),"\\left(",str_cut(S0,J,K-1),
! 15556: "|",str_cut(S0,K+1,N-1),"|\\right)"],S2);
! 15557: }
! 15558: else S2=str_tb([str_cut(S0,I,K-1),"|",str_cut(S0,K+1,N-1),"|"],S2);
! 15559: }
! 15560: I=N+1;
! 15561: }
! 15562: }
! 15563: if(Dvi>0){
! 15564: dviout(texbegin("align*",S));
! 15565: return 1;
! 15566: }
! 15567: return S;
! 15568: } /* endof dviout */
! 15569: SM=["Cannot integrate",P,"at present"];
! 15570: P=sqrt2rat(P|mult=1);
! 15571: Dumb2=1;Dumb3=0;W=newvect(1);W[0]=[];
! 15572: if(type(Dumb=getopt(dumb))==5){
! 15573: Dumb2=Dumb3=Dumb;D2=W;
! 15574: }else if(!isint(Dumb)) Dumb=0;
! 15575: if(Dumb==-1){
! 15576: Dumb2=Dumb3=-1;
! 15577: }
! 15578: if(type(Dumb)!=5) D2=Dumb2;
! 15579: if(!isint(Mul=getopt(mult))) Mul=0;
! 15580: else Mul++;
! 15581: if(type(VAR=getopt(var))!=4) VAR=[];
! 15582: if(type(P)>4) return [];
! 15583: if(iand(T=ptype(P=red(P),X),63)>3||Mul>4){
! 15584: if(Dumb!=1) mycat(SM);
! 15585: return [];
! 15586: }
! 15587: if(Dumb==-1) mycat(["integrate", P]);
! 15588: else if(type(Dumb)==5) Dumb[0]=cons([[X,P]],Dumb[0]);
! 15589: if(T<4 && (T<3||iscoef(P,os_md.israt))){
! 15590: if(Dumb==-1) mycat(["rational function",P]);
! 15591: else if(type(Dumb)==5) Dumb[0]=cons([[X,P]],Dumb[0]);
! 15592: return intpoly(P,X|dumb=Dumb); /* rational function */
! 15593: }
! 15594: Var=pfargs(P,X);
! 15595: for(F=0,VV=Var;VV!=[];VV=cdr(VV)){
! 15596: /* p(x)*log(x^2-1), @e^x, a^x, f(x)^(m/n) etc.->simplify */
! 15597: V=car(VV);
! 15598: if(V[1]==log && (T=ptype(V[2],X))>1 && T<4){
! 15599: if(mydeg(dn(V[2]),X)>0||mydeg(nm(V[2]),X)>1){
! 15600: FC=pfctr(V[2],X);RV=1;
! 15601: if(length(FC)>2){
! 15602: RR=0;RV=1;
! 15603: if((F0=car(FC)[0])!=1){
! 15604: if(type(F0)!=1 && F0<0){
! 15605: for(FT=cdr(FT);FT!=[];FT=cdr(FT)){
! 15606: if(iand(car(FT)[1],1)){
! 15607: RV=-1;F0=-F0;break;
! 15608: }
! 15609: }
! 15610: }
! 15611: }
! 15612: if(F0!=1) RR=log(F0);
! 15613: for(FC=cdr(FC);FC!=[];FC=cdr(FC)){
! 15614: if(RV==-1&&iand(car(FC)[1],1)==1){
! 15615: RR+=car(FC)[1]*log(-car(FC)[0]);
! 15616: RV=1;
! 15617: }else
! 15618: RR+=car(FC)[1]*log(car(FC)[0]);
! 15619: }
! 15620: P=subst(P,V[0],RR);
! 15621: F=1;
! 15622: }
! 15623: }
! 15624: F=1;
! 15625: }else if(V[1]==pow){
! 15626: if(ptype(V[2],X)==1){
! 15627: F=1;
! 15628: if(V[2]==@e){ /* @e^(f(x)) */
! 15629: P=subst(P,V[0],exp(V[3]));
! 15630: }else P=subst(P,V[0],exp(log(V[2])*V[3]));
! 15631: }else if(type(V[3])<=1 && ntype(V[3])==0){ /* r(x)^(m/n) */
! 15632: if((Pw=floor(V[3]))!=0){
! 15633: R=V[2]^Pw;
! 15634: if((PF=V[3]-Pw)!=0) R*=V[2]^PF;
! 15635: P=subst(P,V[0],R);
! 15636: F=1;
! 15637: V=[V[2]^PF,V[1],V[2],PF];
! 15638: }
! 15639: if(ptype(nm(V[2]),X)<2&&V[3]>0){ /* (1/p(x))^(m/n) */
! 15640: P=subst(P,V[0],V[2]*red(1/V[2])^(1-V[3]));
! 15641: F=0;VV=cons(0,Var=pfargs(P,X));continue;
! 15642: }
! 15643: if(ptype(V[2],X)<4&&(K=dn(V[3]))>1){
! 15644: V2=red(V[2]);
! 15645: DN=mydeg(nm(V2),X);DD=mydeg(dn(V2),X);
! 15646: if(DN+DD>1){
! 15647: VF=pfctr(V2,X);
! 15648: R=car(VF)[0]^(car(VF)[1]);RR=0;
! 15649: for(VF=cdr(VF);VF!=[];VF=cdr(VF)){
! 15650: TV=car(VF);TM=TV[1];
! 15651: while(abs(TM)>=K){
! 15652: RR=1;
! 15653: if(TM>0){
! 15654: TM-=K;
! 15655: RR*=TV[0]^nm(V[3]);
! 15656: }else{
! 15657: TM+=K;
! 15658: RR/=TV[0]^nm(V[3]);
! 15659: }
! 15660: }
! 15661: if(TM!=0) R*=TV[0]^TM;
! 15662: }
! 15663: if(RR){
! 15664: P=subst(P,V[0],RR*red(R)^(V[3]));F=1;
! 15665: F=0;VV=cons(0,Var=pfargs(P,X));continue;
! 15666: }
! 15667: }
! 15668: }
! 15669: }
! 15670: }
! 15671: }
! 15672: if(F){
! 15673: P=sqrt2rat(P|mult=1);
! 15674: Var=pfargs(P=red(P),X);T=ptype(P,X);
! 15675: if(T<4 && (T<3||iscoef(P,os_md.israt))){
! 15676: if(Dumb==-1) mycat(["rational function",P]);
! 15677: else if(type(Dumb)==5){
! 15678: Dumb[0]=cons([[X,P]],Dumb[0]);
! 15679: return intpoly(P,X|dumb=Dumb3);
! 15680: }
! 15681: return intpoly(P,X); /* rational function */
! 15682: }
! 15683: }
! 15684: #if 1
! 15685: for(P0=P,V=pfargs(P,X|level=1);V!=[];V=cdr(V)) /* P:tan(x) -> P0:sin(x)/cos(x) */
! 15686: if(car(V)[1]==tan) P0=red(subst(P0,car(V)[0],sin(car(V)[2])/cos(car(V)[2])));
! 15687: if(iand(ptype(P0,X),128)){ /* (log f)'=f'/f */
! 15688: for(Df=cdr(fctr(dn(P0)));Df!=[];Df=cdr(Df)){
! 15689: if(!iand(ptype(car(Df)[0],X),64)) continue;
! 15690: Q=car(Df)[0]^(car(Df)[1]);QQ=red(dn(P0)/Q);
! 15691: DQ=red(diff(Q,X)*QQ);
! 15692: if(C!=0&&type(C=DQ/nm(P0))<2){
! 15693: PP=0;DN=[1];
! 15694: }else for(DN=cdr(fctr(DQ));DN!=[];DN=cdr(DN)){
! 15695: Y=car(DN)[0];
! 15696: if(!iand(ptype(Y,X),64)||(I=mydeg(nm(P0),Y))!=mydeg(DQ,Y)
! 15697: || ptype((C=red(mycoef(nm(P0),I,Y)/mycoef(DQ,I,Y))),X)>1||C==0) continue;
! 15698: PP=red(P0-C*diff(Q,X)/Q);
! 15699: if(nmono(P0)>nmono(PP)) break;
! 15700: }
! 15701: if(DN!=[]){
! 15702: R=C*log(Q);
! 15703: if(PP==0) return R;
! 15704: W[0]=[];
! 15705: S=integrate(PP,X|dumb=D2);
! 15706: if(S!=[]){
! 15707: if(type(Dumb)==5){
! 15708: Dumb[0]=cons([[X,red(P0-PP),PP]],Dumb[0]);
! 15709: TD=W[0];
! 15710: for(W0=[],TD=reverse(TD);TD!=[];TD=cdr(TD)){
! 15711: if(car(TD)[0][0]){
! 15712: WL=cons([1,R],car(TD));
! 15713: Dumb[0]=cons(WL,Dumb[0]);
! 15714: }
! 15715: else Dumb[0]=cons(car(TD),Dumb[0]);
! 15716: }
! 15717: }
! 15718: return red(R+S);
! 15719: }
! 15720: }
! 15721: }
! 15722: }
! 15723: #endif
! 15724: if((length(Var)==1||getopt(exe)==1) && /* p(x)*atan(q(x))^m+r(x), etc */
! 15725: findin((VT=car(Var))[1],[atan,asin,acos,log])>=0 && ptype(P,VT[0])==2 &&
! 15726: (VT[1]!=log||(T!=65&&T!=66)||mydeg(VT[2],X)!=1)){ /* exclude x*log(x+1)^2 */
! 15727: for(R=0,D=mydeg(P,VT[0]);D>=0;D--){
! 15728: Q=S=mycoef(P,D,VT[0]);
! 15729: if(S){
! 15730: if(D>0){
! 15731: if((Q=integrate(S,X|mult=Mul))==[]) return Q;
! 15732: }else{
! 15733: W[0]=[];
! 15734: if((Q=integrate(S,X|dumb=D2,var=VAR,mult=Mul))==[]) return Q;
! 15735: if(type(Dumb)==5){
! 15736: TD=W[0];
! 15737: for(W0=[],TD=reverse(TD);TD!=[];TD=cdr(TD)){
! 15738: if(car(TD)[0][0]){
! 15739: WL=cons([1,R],car(TD));
! 15740: Dumb[0]=cons(WL,Dumb[0]);
! 15741: }
! 15742: else Dumb[0]=cons(car(TD),Dumb[0]);
! 15743: }
! 15744: if(car(Dumb[0])!=[[1,R],[1,Q]])
! 15745: Dumb[0]=cons([[1,R,Q]],Dumb[0]);
! 15746: }
! 15747: return red(R+Q);
! 15748: }
! 15749: }else if(D>0) continue;
! 15750: if(D==0){
! 15751: if(Q!=0&&type(Dumb)==5) Dumb[0]=cons([[1,R,Q]],Dumb[0]);
! 15752: return red(Q+R);
! 15753: }
! 15754: R0=Q*VT[0]^D;
! 15755: P=(P0=P)-S*VT[0]^D-Q*diff(VT[0]^D,X);
! 15756: if(mydeg(P,VT[0])>=D){ /* (x+1)*log(x)/x^2 */
! 15757: if(mydeg(P,VT[0])==D &&
! 15758: ptype(C=red(mycoef(P,D,VT[0])/diff(VT[0],X)),VT[0])<2){
! 15759: P=P0-(S*VT[0]^D+Q*diff(VT[0]^D,X)+C*diff(VT[0]^(D+1),X)/(D+1));
! 15760: R0+=C*VT[0]^(D+1)/(D+1);
! 15761: }else{
! 15762: P=P0;
! 15763: if(Dumb!=1) mycat(SM);
! 15764: return [];
! 15765: }
! 15766: }
! 15767: if(type(Dumb)==5){
! 15768: if(P) Dumb[0]=cons([R?[1,R,R0]:[1,R0],[X,P]],Dumb[0]);
! 15769: else if(R!=0) Dumb[0]=cons([[1,R,R0]],Dumb[0]);
! 15770: }
! 15771: R+=R0;
! 15772: }
! 15773: }
! 15774: if(length(Var)==1 && (VT=car(Var))[1]==pow && mydeg(P,VT[0])==1 && (PT=ptype(VT[2],X))<4){
! 15775: PR=mycoef(P,0,VT[0]);
! 15776: if(RR!=0){
! 15777: RR=integrate(RR,X|dumb=Dumb3,var=Var);
! 15778: if(RR==[]) return RR;
! 15779: }
! 15780: PW=VT[3];
! 15781: if((D=mydeg(nm(V2=VT[2]),X))==2&&PT==2){ /* f(x)*(ax^2+bx+c)^(m/2)+r(x) */
! 15782: if(isint(2*PW)){
! 15783: C2=mycoef(V20=V2,2,X);F=1;
! 15784: if((C21=sqrtrat(C2))==[]) return [];
! 15785: if(imag(C21)!=0){
! 15786: if(real(C21)!=0) return [];
! 15787: C21=C21/@i;F=-1;
! 15788: }
! 15789: if(type(C21)>3) return [];
! 15790: P=subst(P,X,X/C21);VT=mysubst(VT,[X,X/C21]);V2=VT[2];
! 15791: C1=mycoef(V2,1,X)/F/2;
! 15792: if(C1!=0){
! 15793: P=subst(P,X,X-C1);VT=mysubst(VT,[X,X-C1]);V2=VT[2];
! 15794: }
! 15795: C0=mycoef(V2,0,X);
! 15796: if((C01=sqrtrat(C0))==[]) return [];
! 15797: if(imag(nm(C01))!=0){
! 15798: if(real(nm(C01))!=0) return [];
! 15799: C01=C01/@i;G=-1;
! 15800: }else G=1;
! 15801: if(type(C01)>3||(F==-1&&G==-1)) return [];
! 15802: Y=makenewv([P,VAR]|var=x);
! 15803: if(F==-1){ /* (c^2-x^2)^(1/2) */
! 15804: Q=subst(P,VT[0],(C01*cos(Y))^(2*PW),X,YX=C01*sin(Y))
! 15805: *C01*cos(Y)/C21;
! 15806: SY=C21*(X+C1);CY=V20;YY=asin(sqrt2rat(C21*(X+C1)/C01|mult=1));
! 15807: }else if(G==-1){ /* (x^2-c^2)^(1/2) */
! 15808: Q=subst(P,VT[0],(C01*sin(Y)/cos(Y))^(2*PW),X,YX=C01/cos(Y))
! 15809: *C01*sin(Y)/cos(Y)^2/C21;
! 15810: SY=V20;CY=1/(C21*(X+C1));YY=acos(sqrt2rat(C01/C21/(X+C1)|mult=1));
! 15811: }else{ /* (x^2+c^2)^(1/2) */
! 15812: Q=subst(P,VT[0],(C01/cos(Y))^(2*PW),X,YX=C01*sin(Y)/cos(Y))
! 15813: *C01/cos(Y)^2/C21;
! 15814: CY=V20; YY=atan(sqrt2rat(C21*(X+C1)/C01|mult=1));
! 15815: }
! 15816: if(Dumb==-1) mycat([C21*X+C1,"=",YX]);
! 15817: else if(type(Dumb)==5) Dumb[0]=cons([[0,Y,C21*X+C1,YX]],Dumb[0]);
! 15818: if((Q=integrate(red(Q),Y|dumb=Dumb2,var=cons(X,Var)))==[]) return [];
! 15819: Q=trig2exp(Q,Y|inv=cos(Y));
! 15820: for(V=vars(Q);V!=[];V=cdr(V)){
! 15821: FA=funargs(car(V));
! 15822: if(type(FA)==4&&FA[0]==log){
! 15823: QQ=trig2exp(FA[1],Y|inv=cos(Y));
! 15824: Q=mycoef(Q,0,car(V))+mycoef(Q,1,car(V))*log(QQ);
! 15825: }
! 15826: }
! 15827: if(type(Dumb)==5) Dumb[0]=cons([[1,Q]],Dumb[0]);
! 15828: if(F==-1) Q=subst(Q,sin(Y),SY/C01,cos(Y),CY^(1/2)/C01,Y,YY);
! 15829: else if(G==-1){
! 15830: Q=red(subst(Q,sin(Y),SY^(1/2)*cos(Y)/C01));
! 15831: Q=red(subst(Q,cos(Y),C01*CY,Y,YY));
! 15832: }else{
! 15833: Q=red(subst(Q,sin(Y),C21*(X+C1)*cos(Y)/C01));
! 15834: Nm=substblock(nm(Q),cos(Y),C01^2/CY,cos(Y)^2);
! 15835: Nm=subst(Nm,cos(Y),C01/CY^(1/2));
! 15836: Dn=substblock(dn(Q),cos(Y),C01^2/CY,cos(Y)^2);
! 15837: Dn=subst(Dn,cos(Y),C01/CY^(1/2));
! 15838: Q=red(subst(Nm/Dn,Y,YY));
! 15839: }
! 15840: if(findin(Y,vars(Q))>=0) return [];
! 15841: for(R=[],Var=vars(Q);Var!=[];Var=cdr(Var)){
! 15842: VT=funargs(V=car(Var));
! 15843: if(type(VT)==4&&VT[0]==log&&ptype(VT[1],X)>60&&mydeg(Q,V)==1)
! 15844: R=cons([mycoef(Q,1,V),V],R);
! 15845: }
! 15846: if(length(R)==2 && (R[0][0]==R[1][0]||R[0][0]+R[1][0]==0)){
! 15847: R0=args(R[0][1])[0];R1=args(R[1][1])[0];
! 15848: if(R[0][0]==R[1][0]) S=R0*R1;
! 15849: else S=R1/R0;
! 15850: Q=mycoef(Q,0,R[0][1]);Q=mycoef(Q,0,R[1][1]);
! 15851: Q+=R[1][0]*log(red(S));
! 15852: }
! 15853: for(Var=vars(Q);Var!=[];Var=cdr(Var)){
! 15854: VT=funargs(car(Var));
! 15855: if(type(VT)==4&&VT[0]==log&&ptype(VT[1],X)>60){
! 15856: S=trig2exp(VT[1],X|inv=cos(X),arc=1);
! 15857: if(ptype(dn(S),X)<2 && mydeg(Q,car(Var))==1
! 15858: && ptype(mycoef(Q,1,car(Var)),X)<2){
! 15859: S=nm(S);
! 15860: SF=fctr(S);
! 15861: S/=SF[0][0];
! 15862: }
! 15863: if(cmpsimple(S,-S)>0) S=-S;
! 15864: Q=subst(Q,car(Var),log(S));
! 15865: }
! 15866: } /* x/(1-x^2)^(1/2) */
! 15867: if(type(Q=red(Q+RR))==2&&type(Dumb)!=5) Q-=cterm(Q);
! 15868: if(Dumb==-1) mycat(["->",Q]);
! 15869: else if(type(Dumb)==5) Dumb[0]=cons([[1,Q]],Dumb[0]);
! 15870: return Q;
! 15871: }
! 15872: }else if(D==1 && mydeg(Dn=dn(V2),X)<2 && type(PW)==1 && ntype(PW)==0 &&
! 15873: (V2!=X||ptype(mycoef(P,1,VT[0]),X)>2)){ /* p(x)((ax+b)/(cx+d))^(m/n) */
! 15874: PN=nm(PW);PD=dn(PW);
! 15875: Y=makenewv([P,VAR]|var=x);Q=Y^PD*Dn-nm(V2);F=-mycoef(Q,0,X)/mycoef(Q,1,X);
! 15876: Q=red(subst(P,VT[0],Y^PN,X,F)*diff(F,Y));
! 15877: if(Dumb==-1) mycat([Y,"=",V2^(1/PD)]);
! 15878: else if(type(Dumb)==5) Dumb[0]=cons([[0,Y,V2^(1/PD)]],Dumb[0]);
! 15879: if((Q=integrate(Q,Y|dumb=Dumb3,var=cons(X,Var)))==[]) return [];
! 15880: Q=red(Q);
! 15881: QN=subst(substblock(nm(Q),Y,Y^PD,V2),Y,V2^(1/PD));
! 15882: QD=subst(substblock(dn(Q),Y,Y^PD,V2),Y,V2^(1/PD));
! 15883: Q=red(QN/QD+RR);
! 15884: if(Dumb==-1) mycat(["->",Q]);
! 15885: else if(type(Dumb)==5) Dumb[0]=cons([[1,Q]],Dumb[0]);
! 15886: return Q;
! 15887: }
! 15888: }else if(length(Var)==2 && /* r(x,(ax+b)^(1/2),(cx+d)^(1/2)) */
! 15889: (VT=car(Var))[1]==pow && ptype(VT[2],X)==1 && mydeg(VT[2],X)==1 && VT[3]==1/2 &&
! 15890: (VS=car(car(Var)))[1]==pow && ptype(VS[2],X)==1 && mydeg(VS[2],X)==1 && VS[3]==1/2){
! 15891: Y=makenewv([P,VAR]|var=x);R=(Y^2-myceof(VS[0],0,X))/(C=mycoef(VS[0],1,X));
! 15892: if(Dumb==-1) mycat([Y,"=",VS[0]]);
! 15893: else if(type(Dumb)==5) Dumb[0]=cons([[0,Y,VD[0]]],Dumb[0]);
! 15894: R=integrate(subst(P,VS[0],Y,X,R)*2*Y/C,Y|dumb=Dumb3,var=cons(X,Var));
! 15895: if(R!=[]){
! 15896: R=subst(substblock(R,Y,VS[0],Y^2),Y,VS[0]);
! 15897: if(Dumb==-1) mycat(["->",R]);
! 15898: else if(type(Dumb)==5) Dumb[0]=cons([[1,R]],Dumb[0]);
! 15899: }
! 15900: return R;
! 15901: }
! 15902: if(T==65||T==66){ /* polynomial including sin, exp etc */
! 15903: for(F=0,VT=Var;VT!=[];VT=cdr(VT)){
! 15904: VTT=car(VT);
! 15905: if(ptype(VTT[2],X)>2||mydeg(VTT[2],X)>1) F=ior(F,256); /* compos. or rat. or nonlin. */
! 15906: K=findin(VTT[1],[cos,sin,tan,exp,log,pow]);
! 15907: F=ior(F,2^(K+1)); /* 1:other,2:cos,4:sin,8:tan,16:exp,32:log,64:pow */
! 15908: if((Deg=mydeg(P,VTT[0]))>1&&K!=4) F=ior(F,1024); /* nonlinear */
! 15909: if(K==5 && (ptype(VTT[3],X)!=0 || VTT[2]!=x||Deg>1)) F=ior(F,8192); /* pow */
! 15910: for(;Deg>0;Deg--){ /* coef */
! 15911: if(ptype(mycoef(P,Deg,VTT[0]),X)>2){
! 15912: if(K==4||K==5) F=ior(F,2048); /* exp, log */
! 15913: else F=ior(F,4096);
! 15914: }
! 15915: }
! 15916: }
! 15917: if(!iand(F,1+8+64+256+512+2048+8192)){ /* cos,sin,exp,log^n,x^c */
! 15918: if(iand(F,1024+4096)&&!iand(F,32+64)){ /* cos,sin,exp */
! 15919: if(type(Dumb)==5){
! 15920: S=trig2exp(P,X|inv=1);
! 15921: if(P!=S) Dumb[0]=cons([[X,S]],Dumb[0]);
! 15922: }
! 15923: R=integrate(trig2exp(P,X),X);
! 15924: if(R!=[]) S=trig2exp(R,X|inv=1);
! 15925: R=fshorter(S,X);
! 15926: if(type(Dumb)==5&&R!=S){
! 15927: Dumb[0]=cons([[1,S]],Dumb[0]);
! 15928: }
! 15929: return R;
! 15930: }
! 15931: for(R=0,VT=Var;VT!=[];VT=cdr(VT)){
! 15932: CV=car(VT);
! 15933: C0=mycoef(CV[2],0,X);C1=mycoef(CV[2],1,X);
! 15934: Q=mycoef(P,1,CV[0]);
! 15935: if(CV[1]==sin||CV[1]==cos){
! 15936: TR=(CV[1]==sin)?intpoly(Q,X|sin=C1):intpoly(Q,X|cos=C1);
! 15937: R+=TR[0]*cos(CV[2])+TR[1]*sin(CV[2]);
! 15938: }else if(CV[1]==exp){
! 15939: QT=exp(CV[2]);
! 15940: for(V2=vars(C1);V2!=[];V2=cdr(V2)){ /* exp(2*log(a)*x) => a^(2*x) */
! 15941: if(vtype(VA=car(V2))==2&&functor(VA)==log){
! 15942: if(ptype(C1,VA)!=2||mydeg(C1,VA)==1&&mycoef(C1,0,VA)==0){
! 15943: QT=args(VA)[0]^(red(C1/VA)*X);
! 15944: if(C0!=0) QT*=exp(C0);
! 15945: break;
! 15946: }
! 15947: }
! 15948: }
! 15949: R+=intpoly(Q,X|exp=C1)*QT;
! 15950: }else if(CV[1]==pow)
! 15951: R+=intpoly(Q,X|pow=CV[2])*x^CV[2];
! 15952: else if(CV[1]==log){
! 15953: for(Deg=mydeg(P,CV[0]);Deg>0; Deg--){
! 15954: Q=mycoef(P,Deg,CV[0]);
! 15955: TR=intpoly(Q,X|log=[C1,C0,Deg]);
! 15956: for(I=0;TR!=[];I++,TR=cdr(TR)){
! 15957: if(I==Deg) R+=car(TR)-subst(car(TR),X,0);
! 15958: else R+=car(TR)*CV[0]^(Deg-I);
! 15959: }
! 15960: }
! 15961: }
! 15962: P=mycoef(P,0,CV[0]);
! 15963: }
! 15964: R+=intpoly(P,X);
! 15965: return R;
! 15966: }
! 15967: }
! 15968: for(K=0,VX=[],VT=Var;VT!=[];VT=cdr(VT)){ /* contain only both pow and trig */
! 15969: VTT=car(VT);
! 15970: if(findin(VTT[1],[cos,sin,tan])>=0){
! 15971: if(ptype(VTT[2],X)!=2||mydeg(VTT[2],X)!=1) break;
! 15972: VX=cons(VTT,VX);
! 15973: }else if(VTT[1]==pow) K=1;
! 15974: else break;
! 15975: }
! 15976: if(VT==[]&&K==1&&VX!=[]){
! 15977: D=VX[0][2];
! 15978: if(VX[0][1]==tan) D*=2;
! 15979: for(VT=cdr(VX);VT!=[];VT=cdr(VT)){
! 15980: K=VT[0][2]/D;
! 15981: if(VT[0][1]==tan) K*=2;
! 15982: if(type(K)!=1||ntype(K)!=0) break;
! 15983: D/=dn(K);
! 15984: }
! 15985: if(VT==[]){
! 15986: Y=makenewv([P,VAR]|var=x);
! 15987: for(Q=P,VT=VX;VT!=[];VT=cdr(VT)){
! 15988: VTT=car(VT);
! 15989: if(VTT[1]==cos||VTT[1]==sin){
! 15990: VV=trig2exp(VTT[0],X|inv=cos(D));
! 15991: VV=subst(VV,cos(D),(1-Y^2)/(1+Y^2),sin(D),2*Y/(Y^2+1));
! 15992: }else if(VTT[1]==tan){
! 15993: VV=trig2exp(VTT[0],X|inv=tan(D/2));
! 15994: VV=subst(VV,tan(D),Y);
! 15995: }
! 15996: Q=subst(Q,VTT[0],VV);
! 15997: }
! 15998: Q*=2/(Y^2+1);
! 15999: if(diff(Q,X)==0){
! 16000: if(Dumb==-1) mycat([Y,"=",tan(D/2)]);
! 16001: else if(type(Dumb)==5) Dumb[0]=cons([[0,Y,tan(D/2)]],Dumb[0]);
! 16002: R=integrate(Q,Y|dumb=Dumb2,var=cons(X,Var));
! 16003: if(R!=[]){
! 16004: if(Dumb==-1) mycat(["->",R]);
! 16005: else if(type(Dumb)==5) Dumb[0]=cons([[1,R]],Dumb[0]);
! 16006: return sqrt2rat(subst(R,Y,tan(D/2))|mult=1);
! 16007: }
! 16008: }
! 16009: }
! 16010: }
! 16011: if(T>65||iand(F,8)){ /* rational for functions or tan */
! 16012: if(findin(X,vars(P))<0){
! 16013: for(XV=XE=0,VT=Var;VT!=[];VT=cdr(VT)){
! 16014: VTT=car(VT);
! 16015: if(mydeg(VTT[2],X)!=1) break;
! 16016: if(VTT[1]==cos||VTT[1]==sin||VTT[1]==tan){
! 16017: K=red(VTT[2]/X);
! 16018: if(type(K)>1||ntype(K)>0) break;
! 16019: if(XV==0) XV=K;
! 16020: else XV/=dn(K/XV);
! 16021: if(VTT[1]==tan) P=red(subst(P,VTT[0],sin(VTT[2])/cos(VTT[2])));
! 16022: }else if(VTT[1]==exp){
! 16023: K=red(VTT[2]/X);
! 16024: if(type(K)>1||ntype(K)>0) break;
! 16025: if(XE==0) XE=K;
! 16026: else XE/=dn(K/XE);
! 16027: }else break;
! 16028: }
! 16029: if(VT==[]&&XE*XV==0){
! 16030: if(XE){
! 16031: if(XE<0) XE=-XE;
! 16032: Y=makenewv([P,VAR]|var=x);
! 16033: for(F=0,VT=Var;VT!=[];VT=cdr(VT),F++){
! 16034: VTT=car(VT);C=red(VTT[2]/X/XE);
! 16035: P=subst(P,VTT[0],Y^C);
! 16036: if(!F){
! 16037: if(Dumb==-1) mycat([Y^C,"=",VTT[0]]);
! 16038: else if(type(Dumb)==5) Dumb[0]=cons([[0,Y^C,VTT[0]]],Dumb[0]);
! 16039: }
! 16040: }
! 16041: P/=XE*Y;
! 16042: Q=integrate(P,Y|dumb=Dumb3,var=cons(X,VAR));
! 16043: if(Q==[]) return [];
! 16044: Q=subst(Q,Y,exp(XE*X));
! 16045: Q=trig2exp(Q,X);
! 16046: if(Dumb==-1) mycat(["->",Q]);
! 16047: else if(type(Dumb)==5) Dumb[0]=cons([[1,Q]],Dumb[0]);
! 16048: return Q;
! 16049: }
! 16050: P=trig2exp(nm(P),X|inv=cos(XV*X))/trig2exp(dn(P),X|inv=cos(XV*X));
! 16051: Y=makenewv([P,VAR]|var=x);
! 16052: Q=red(subst(P,sin(XV*X),Y*cos(XV*X)));
! 16053: Q=substblock(nm(Q),cos(XV*X),cos(XV*X)^2,1/(Y^2+1))/
! 16054: (substblock(dn(Q),cos(XV*X),cos(XV*X)^2,1/(Y^2+1))*(Y^2+1));
! 16055: Q=red(Q);
! 16056: if(ptype(Q,X)<2){
! 16057: XV*=2;P=Q;
! 16058: }else{
! 16059: 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);
! 16060: P=red(P);
! 16061: }
! 16062: if(Dumb==-1){
! 16063: mycat([Y,"=",tan(XV*X/2)]);
! 16064: mycat(["integrate",P]);
! 16065: }else if(type(Dumb)==5) Dumb[0]=cons([[Y,P]],cons([[0,Y,tan(XV*X/2)]],Dumb[0]));
! 16066: R=intpoly(P,Y|dumb=Dumb);
! 16067: if(R==[]) return R;
! 16068: if(Dumb==-1) mycat(["->",R]);
! 16069: else if(type(Dumb)==5) Dumb[0]=cons([[1,R]],Dumb[0]);
! 16070: for(Log=1,K=0,Var=pfargs(RR=R,Y);Var!=[];Var=cdr(Var)){
! 16071: VTT=car(Var);
! 16072: if(VTT[1]==log){
! 16073: C=mycoef(R,1,VTT[0]);
! 16074: VT2=VTT[2];
! 16075: if(K==0){
! 16076: K=C;Log=VT2;
! 16077: if(K<0){
! 16078: K=-K;Log=1/Log;
! 16079: }
! 16080: }else{
! 16081: if((V=red(C/K))<0){
! 16082: VT2=1/VT2;V=-V;
! 16083: }
! 16084: if(type(V)>1||ntype(V)>0){
! 16085: Log=1;break;
! 16086: }
! 16087: if(isint(V)) Log*=VT2^V;
! 16088: else{
! 16089: D=dn(V);K/=D;
! 16090: Log=Log^D*VT2^nm(V);
! 16091: }
! 16092: }
! 16093: RR=mycoef(RR,0,VTT[0]);
! 16094: }
! 16095: }
! 16096: if(Log!=1){
! 16097: R=RR;
! 16098: if(type(Dumb)==5){
! 16099: if(RR) Dumb[0]=cons([[1,K*log(Log),RR]],Dumb[0]);
! 16100: else Dumb[0]=cons([[1,K*log(Log)]],Dumb[0]);
! 16101: }
! 16102: Log=red(subst(red(Log),Y,sin(XV*X/2)/cos(XV*X/2)));
! 16103: Log=fshorter(Log,X|log=1); /* log(cos(2*x)+1)=-2*log(cos(x)) */
! 16104: Nm=fctr(nm(Log));
! 16105: for(T=[];Nm!=[];Nm=cdr(Nm)){
! 16106: if(ptype(car(Nm)[0],X)>1) T=cons(car(Nm),T);
! 16107: }
! 16108: Nm=fctr(dn(Log));
! 16109: for(;Nm!=[];Nm=cdr(Nm)){
! 16110: if(ptype(car(Nm)[0],X)>1) T=cons([car(Nm)[0],-car(Nm)[1]],T);
! 16111: }
! 16112: for(I=0,Nm=T;T!=[];T=cdr(T)){
! 16113: if(I=0) I=abs(car(T)[1]);
! 16114: else I=igcd(I,car(T)[1]);
! 16115: }
! 16116: for(Log=1;Nm!=[];Nm=cdr(Nm)) Log*=car(Nm)[0]^(car(Nm)[1]/I);
! 16117: K*=I;
! 16118: if(cmpsimple(nm(Log),dn(Log))<0){
! 16119: K=-K;Log=red(1/Log);
! 16120: }
! 16121: Log=K*log(Log);
! 16122: if(type(Dumb)==5){
! 16123: if(RR) Dumb[0]=cons([[1,Log,RR]],Dumb[0]);
! 16124: else Dumb[0]=cons([[1,Log]],Dumb[0]);
! 16125: }
! 16126: }else Log=0;
! 16127: for(Atan=0,Var=pfargs(RR=R,Y);Var!=[];Var=cdr(Var)){
! 16128: VTT=car(Var);
! 16129: if(VTT[1]==atan){
! 16130: W=subst(VTT[2],Y,sin(XV*X/2)/cos(XV*X/2));
! 16131: W=trig2exp(W,X|inv=1);
! 16132: V2=funargs(dn(W));
! 16133: if(type(V2)==4&&length(V2)==2){
! 16134: V3=V2[1]*mycoef(R,1,VTT[0]);
! 16135: Z=0;
! 16136: if(V2[0]==cos)
! 16137: Z=red(W*cos(V2[1])/sin(V2[1]));
! 16138: else if(V2[0]==sin){
! 16139: Z=red(W*sin(V2[1])/cos(V2[1]));
! 16140: V3=-V3;
! 16141: }
! 16142: if(Z==1){
! 16143: Atan+=V3;W=0;
! 16144: }else if(Z==-1){
! 16145: Atan-=V3;W=0;
! 16146: }
! 16147: }
! 16148: R0=mycoef(R,0,VTT[0]);
! 16149: if(W!=0) Atan+=subst(R-R0,VTT[0],atan(W)); /* atan(W); */
! 16150: R=R0;
! 16151: }
! 16152: }
! 16153: if(R!=0){
! 16154: R=subst(R,Y,sin(XV*X/2)/cos(XV*X/2));
! 16155: R=red(R);
! 16156: R=trig2exp(nm(R),X|inv=1)/trig2exp(dn(R),X|inv=1);
! 16157: }
! 16158: if(type(Dumb)==5){
! 16159: F=0;WL=[];
! 16160: if(R){
! 16161: WL=cons(R,WL);
! 16162: F++;
! 16163: }
! 16164: if(Atan){
! 16165: WL=cons(Atan,WL);
! 16166: F++;
! 16167: }
! 16168: if(Log){
! 16169: WL=cons(Log,WL);
! 16170: F++;
! 16171: }
! 16172: WL=cons(1,WL);
! 16173: if(F>1) Dumb[0]=cons([WL],Dumb[0]);
! 16174: }
! 16175: R=red(R+Log+Atan);
! 16176: if(Dumb==-1) mycat(["->",R]);
! 16177: else if(type(Dumb)==5) Dumb[0]=cons([[1,R]],Dumb[0]);
! 16178: return fshorter(R,X);
! 16179: }
! 16180: }
! 16181: }
! 16182: VT=pfargs(Q=P,X|level=1);
! 16183: V=(iand(ptype(P,X),7)<3)?[X]:[];
! 16184: for(;VT!=[];VT=cdr(VT))
! 16185: if(ptype(P,car(VT)[0])<3) V=cons(car(VT)[0],V);
! 16186: if(length(V)>0){ /* 1/x+tan(x)+... etc.: sums */
! 16187: for(R=0;V!=[];V=cdr(V)){
! 16188: T=mycoef(Q,0,car(V));
! 16189: W[0]=[];
! 16190: S=integrate(TD=red(Q-T),X|dumb=D2,mult=Mul,exe=1);
! 16191: if(S==[]) continue;
! 16192: if(type(Dumb)==5){
! 16193: WL=0;
! 16194: if(T!=0) WL=[[X,TD,T]];
! 16195: if(R!=0) WL=cons([1,R],WL);
! 16196: if(WL) Dumb[0]=cons(WL,Dumb[0]);
! 16197: TD=W[0];
! 16198: if(R!=0||T!=0){
! 16199: for(W0=[],TD=reverse(TD);TD!=[];TD=cdr(TD)){
! 16200: if(car(TD)[0][0]){
! 16201: WL=(!T)?[]:[[X,T]];
! 16202: WL=append(car(TD),WL);
! 16203: if(R!=0) WL=cons([1,R],WL);
! 16204: }else WL=car(TD);
! 16205: Dumb[0]=cons(WL,Dumb[0]);
! 16206: }
! 16207: }else Dumb[0]=append(TD,Dumb[0]);
! 16208: }
! 16209: R+=S;Q=T;
! 16210: if(!Q) return red(R);
! 16211: }
! 16212: W[0]=[];
! 16213: if(P!=Q&&type(S=integrate(Q,X|dumb=D2,mult=Mul))<4){
! 16214: RR=red(R+S);
! 16215: if(type(Dumb)==5){
! 16216: TD=W[0];
! 16217: for(W0=[],TD=reverse(TD);TD!=[];TD=cdr(TD)){
! 16218: if(car(TD)[0][0]){
! 16219: WL=cons([1,R],car(TD));
! 16220: Dumb[0]=cons(WL,Dumb[0]);
! 16221: }
! 16222: else Dumb[0]=append(TD,Dumb[0]);
! 16223: }
! 16224: if(nmono(R)+nmono(S)!=nmono(RR)) Dumb[0]=cons([[1,R,S]],Dumb[0]);
! 16225: }
! 16226: return RR;
! 16227: }
! 16228: }
! 16229: if(Dumb!=1) mycat(SM);
! 16230: return [];
! 16231: }
! 16232:
! 16233: def fimag(P)
! 16234: {
! 16235: for(V=vars(P);V!=[];V=cdr(V)){
! 16236: Q=[];
! 16237: if(vtype(VF=car(V))==2){
! 16238: VAA=args(VF);
! 16239: if(VAA==[]) continue;
! 16240: VA=sqrt2rat(VAA[0]);
! 16241: if(functor(VF)==exp){
! 16242: if(imag(VA)!=0){
! 16243: R=(real(VA)!=0)?exp(real(VA)):1;
! 16244: Q=subst(P,VF,R*(cos(imag(VA))+sin(imag(VA))*@i));
! 16245: }
! 16246: }else if(functor(VF)==pow){
! 16247: VA=sqrt2rat(VAA[1]);
! 16248: if(imag(VA)!=0){
! 16249: R=(real(VA)!=0)?VAA[0]^(real(VA)):1;
! 16250: L=(VAA[0]!=@e)?log(VAA[0]):1;
! 16251: Q=subst(P,VAA[0]^(VAA[1]),R*(cos(L*imag(VA))+sin(L*imag(VA))*@i));
! 16252: }else if(VAA[1]!=(V0=fimag(VA)))
! 16253: Q=subst(P,VAA[0]^(VAA[1]),VAA[0]^(V0));
! 16254: }
! 16255: V0=VA;
! 16256: if(length(VAA)==1&&(VAA[0]!=V0||VA!=(V0=fimag(VA))))
! 16257: Q=subst(P,VF,subst(VF,VAA[0],V0));
! 16258: }
! 16259: if(Q!=[]&&P!=Q){
! 16260: P=Q;V=cons(0,vars(P));
! 16261: }
1.1 takayama 16262: }
16263: return P;
16264: }
16265:
1.4 ! takayama 16266:
! 16267: def trig2exp(P,X)
! 16268: {
! 16269: if(iand(ptype(P,X),128)){
! 16270: OL=getopt();
! 16271: Nm=trig2exp(nm(P),X|option_list=OL);
! 16272: Dn=trig2exp(dn(P),X|option_list=OL);
! 16273: R=red(Nm/Dn);
! 16274: if(getopt(arc)==1) return sqrt2rat(R);
! 16275: }
! 16276: if((Inv=getopt(inv))==1||type(Inv)==2){
! 16277: for(VT=T=vars(P);T!=[];T=cdr(T)){
! 16278: if(findin(functor(car(T)),[cos,sin,tan])>=0){
! 16279: P=trig2exp(P,X);VT=vars(P);break;
! 16280: }
! 16281: }
! 16282: for(;VT!=[];VT=cdr(VT)){
! 16283: if(functor(CT=car(VT))==exp){
! 16284: if((Re=real(args(CT)[0]))!=0){
! 16285: if(isint(Re)) S=@e^Re;
! 16286: else S=exp(Re);
! 16287: }else S=1;
! 16288: if((Im=imag(args(CT)[0]))!=0){
! 16289: Q=nm(Im);Q=mycoef(Q,mydeg(Q,X),X);
! 16290: if(-Q>Q) S*=cos(-Im)-@i*sin(-Im);
! 16291: else S*=cos(Im)+@i*sin(Im);
! 16292: }
! 16293: P=subst(P,CT,S);
! 16294: }
! 16295: }
! 16296: P=red(P);
! 16297: U=vars(Inv);
! 16298: if(length(U)!=1||((F=functor(car(U)))!=sin&&F!=cos&&F!=tan)) return P;
! 16299: XX=args(car(U))[0];
! 16300: if(mydeg(XX,X)!=1) return P;
! 16301: if(!isvar(XX)) P=subst(P,X,(X-mycoef(XX,0,X))/mycoef(XX,1,X));
! 16302: for(VT=vars(P);VT!=[];VT=cdr(VT)){
! 16303: if(vtype(CT=car(VT))<2) continue;
! 16304: TX=args(CT)[0];
! 16305: if(mydeg(TX,X)!=1) continue;
! 16306: if(!isint(C1=mycoef(TX,1,X))) continue;
! 16307: if((C0=mycoef(TX,0,X))==0){
! 16308: CC=1;CS=0;
! 16309: }else if(vars(C0)==[@pi]){
! 16310: CC=myval(cos(C0));
! 16311: if(CC!=0&&type(CC)==1&&ntype(CC)!=0){
! 16312: CC=cos(C0);CS=sin(C0);
! 16313: }else CS=myval(sin(C0));
! 16314: }else{
! 16315: CC=cos(C0);CS=sin(C0);
! 16316: }
! 16317: K=C1;
! 16318: if(K<0) K=-K;
! 16319: for(CC1=0,I=K;I>=0;I-=2) CC1+=(-1)^((K-I)/2)*binom(K,I)*cos(X)^I*sin(X)^(K-I);
! 16320: 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);
! 16321: if(C1<0) CS1=-CS1;
! 16322: if((TF=functor(CT))==cos) P=subst(P,cos(TX),CC1*CC-CS1*CS);
! 16323: else if(TF==sin) P=subst(P,sin(TX),CS1*CC+CC1*CS);
! 16324: }
! 16325: if(F==sin)
! 16326: P=substblock(P,cos(X),cos(X)^2,1-sin(X)^2);
! 16327: else{
! 16328: P=substblock(P,sin(X),sin(X)^2,1-cos(X)^2);
! 16329: if(F==tan){
! 16330: P=subst(P,sin(X),cos(X)*tan(X));
! 16331: P=substblock(P,cos(X),cos(X)^2,1/(tan(X)^2+1));
! 16332: }
! 16333: }
! 16334: if(!isvar(XX)) P=subst(P,X,XX);
! 16335:
! 16336: if(getopt(arc)==1){
! 16337: for(VT=vars(P);VT!=[];VT=cdr(VT)){
! 16338: FA=funargs(car(VT));
! 16339: if(type(FA)==4&&(FA[0]==cos||FA[0]==sin)&&ptype(FA[1],X)>60){
! 16340: VTT=vars(FA[1]);
! 16341: if(type(FA[1])!=2||length(VTT)!=1) break;
! 16342: FB=funargs(VTT[0]);
! 16343: if(type(FB)!=4||(FF=findin(FB[0],[asin,acos,atan]))<0) break;
! 16344: if(!isint(2*(C=mycoef(FA[1],1,VTT[0])))||mycoef(FA[1],0,VTT[0])!=0) break;
! 16345: if(C==1/2){
! 16346: if(FF==1){
! 16347: U=(FA[0]==cos)?(1+FB[1])/2:(1-FB[1])/2;
! 16348: P=subst(P,car(VT),red(U)^(1/2));
! 16349: }else if(FF==2){
! 16350: if(FA[0]==sin){
! 16351: FB1=red(FB[1]);
! 16352: Nm=nm(FB1);CC=fctr(Nm)[0][0];Dn=dn(FB1);
! 16353: if(CC<0) CC=-CC;
! 16354: Nm/=CC;Dn/=CC;
! 16355: NN=Nm^2+Dn^2;
! 16356: P=subst(P,car(VT),((NN)^(1/2)-Dn)/Nm*cos(FA[1]));
! 16357: }
! 16358: }
! 16359: P=red(P);
! 16360: }else if(C==1){
! 16361: if(FF==1){
! 16362: if(FA[0]==cos) P=subst(P,car(VT),FB[1]);
! 16363: else P=subst(P,car(VT),(1-FB[1])^(1/2));
! 16364: }else if(FF==0){
! 16365: if(FA[0]==sin) P=subst(P,car(VT),FB[1]);
! 16366: else P=subst(P,car(VT),(1-FB[1])^(1/2));
! 16367: }
! 16368: P=red(P);
! 16369: }
! 16370: }
! 16371: }
! 16372: P=sqrt2rat(P);
! 16373: }
! 16374: return red(P);
! 16375: }
! 16376: Var=pfargs(P,X);
! 16377: for(VT=Var;VT!=[];VT=cdr(VT)){
! 16378: CT=car(VT);
! 16379: if(CT[1]==cos)
! 16380: P=subst(P,CT[0],exp(CT[2]*@i)/2+exp(-CT[2]*@i)/2);
! 16381: else if(CT[1]==sin)
! 16382: P=subst(P,CT[0],exp(-CT[2]*@i)*@i/2-exp(CT[2]*@i)*@i/2);
! 16383: else if (CT[1]==tan)
! 16384: P=subst(P,CT[0],(exp(-CT[2]*@i)*@i-exp(CT[2]*@i)*@i)/(exp(CT[2]*@i)+exp(-CT[2]*@i)));
! 16385: else if(CT[1]==pow){
! 16386: if(ptype(CT[2],X)>1) continue;
! 16387: if(CT[2]==@e) P=subst(P,CT[0],exp(CT[3]));
! 16388: else P=subst(P,CT[0],exp(log(CT[2])*exp(CT[3])));
! 16389: }
! 16390: }
! 16391: P=red(P);
! 16392: for(PP=1,Lp=(dn(P)==1)?1:0;Lp<2;Lp++){
! 16393: PP=1/PP;
! 16394: U=(Lp==0)?dn(P):nm(P);
! 16395: if(U==1) continue;
! 16396: Var=vars(U);
! 16397: for(R=[],VT=Var;VT!=[];VT=cdr(VT))
! 16398: if(functor(car(VT))==exp) R=cons(car(VT),R);
! 16399: RR=os_md.terms(U,R);
! 16400: for(Q=0,RRT=RR;RRT!=[];RRT=cdr(RRT)){
! 16401: for(S=0,CT=cdr(car(RRT)),CR=R,UT=U;CR!=[];CR=cdr(CR),CT=cdr(CT)){
! 16402: UT=mycoef(UT,car(CT),car(CR));S+=car(CT)*args(car(CR))[0];
! 16403: }
! 16404: if(S==0) Q+=UT;
! 16405: else Q+=UT*exp(S);
! 16406: }
! 16407: PP*=Q;
! 16408: }
! 16409: return PP;
! 16410: }
! 16411:
1.1 takayama 16412: def powsum(N)
16413: {
16414: if (N < 0) return 0;
16415: if (N == 0) return x;
16416: P = intpoly(N*powsum(N-1),x);
16417: C = subst(P,x,1);
16418: return P+(1-C)*x;
16419: }
16420:
16421: def bernoulli(N)
16422: {
16423: return mydiff(powsum(N),x) - N*x^(N-1);
16424: }
16425:
16426: /* linfrac01([x,y]) */
16427: /* linfrac01(newvect(10,[0,1,2,3,4,5,6,7,8,9]) */
16428: /* 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
16429: 10:y_2=0, 11:y_2=x, 12:y_2=y, 13: y_2=1, 14: y_2=\infty
16430: 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
16431: X[0],X[11],X[2],X[10],X[13],X[5],X[14],X[7],X[8],X[9],
16432: X[3],X[1],X[12],X[4],X[6]
16433:
16434: T=0 (x_2,x_1,x_3,x_4,...)
16435: T=-j (x_1,x_2,..,x_{j-1},x_{j+1},x_j,x_{j+2},...)
16436: T=1 (1-x_1,1-x_2,1-x_3,1-x_4,...)
16437: T=2 (1/x_1,1/x_2,1/x_3,1/x_4,...)
16438: T=3 (x_1,x_1/x_2,x_1/x_3,x_1/x_4,...)
16439: */
16440:
16441: def lft01(X,T)
16442: {
16443: MX=getopt();
16444: if(type(X)==4){
16445: K=length(X);
16446: if(K>=1) D=1;
16447: }
16448: if(type(X)==5){
16449: K=length(X);
16450: for(J=5, F=K-10; F>0; F-=J++);
16451: if(F==0) D=2;
16452: }
16453: if(D==0) return 0;
16454: if(T==0){ /* x <-> y */
16455: if(D==1){
16456: R=cdr(X); R=cdr(R);
16457: R=cons(X[0],R);
16458: return cons(X[1],R);
16459: }
16460: R=newvect(K,[X[3],X[1],X[4],X[0],X[2],X[6],X[5]]);
16461: for(I=7;I<K;I++) R[I]=X[I];
16462: for(I=11,J=5; I<K; I+=J++){
16463: R[I]=X[I+1]; R[I+1]=X[I];
16464: }
16465: return R;
16466: }
16467: if(T==1){
16468: if(D==1){
16469: for(R=[];X!=[];X=cdr(X)) R=cons(1-car(X),R);
16470: return reverse(R);
16471: }
16472: R=newvect(K,[X[2],X[1],X[0],X[4],X[3],X[5],X[6],X[8],X[7],X[9]]);
16473: for(I=11;I<K;I++) R[I]=X[I];
16474: for(I=10, J=5; I<K; I+=J++){
16475: R[I]=X[I+J-2]; R[I+J-2]=X[I];
16476: }
16477: return R;
16478: }
16479: if(T==2){
16480: if(D==1){
16481: for(R=[]; X!=[]; X=cdr(X)) R=cons(red(1/car(X)),R);
16482: return reverse(R);
16483: }
16484: R=newvect(K,[X[5],X[1],X[2],X[6],X[4],X[0],X[3],X[9],X[8],X[7]]);
16485: for(I=11;I<K;I++) R[I]=X[I];
16486: for(I=10,J=5; I<K; I+=J++){
16487: R[I]=X[I+J-1]; R[I+J-1]=X[I];
16488: }
16489: return R;
16490: }
16491: if(T==3){
16492: if(D==1){
16493: T=car(X);
16494: for(R=[T],X=cdr(X); X!=[]; X=cdr(X))
16495: R=cons(red(T/car(X)),R);
16496: return reverse(R);
16497: }
16498: R=newvect(K,[X[7],X[4],X[2],X[6],X[1],X[9],X[3],X[0],X[8],X[5]]);
16499: for(I=10,J=5; I<K; I+=J++){
16500: 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];
16501: }
16502: return R;
16503: }
16504: if(T==-1){
16505: if(D==1){
16506: return append([X[1],X[2],X[0]],cdr(cdr(cdr(X))));
16507: }
16508: R=newvect(K,[X[0],X[11],X[2],X[10],X[13],X[5],X[14],X[7],X[8],X[9],
16509: X[3],X[1],X[12],X[4],X[6]]);
16510: for(I=11;I<K;I++) R[I]=X[I];
16511: for(I=17,J=5; I<K; I+=J++){
16512: R[I]=X[I+1]; R[I+1]=X[I];
16513: }
16514: return R;
16515: }
16516: if(T<0){
16517: if(D==1){
16518: for(R=[],I=0; X!=[]; X=cdr(X),I--){
16519: if(I==T){
16520: R=cons(X[1],R);
16521: R=cons(X[0],R);
16522: X=cdr(X);
16523: }
16524: else R=cons(car(X),R);
16525: }
16526: return reverse(R);
16527: }
16528: T=3-T;
16529: R=newvect(K);
16530: for(I=0;I<K;I++) R[I]=X[I];
16531: for(I=10,J=5;J<T;I+=J++);
16532: for(II=0; II<J-2; II++){
16533: R[I]=X[I+J]; R[I+J]=R[I];
16534: }
16535: for( ; II<J; II++){
16536: R[I]=X[I+J+1]; R[I+J+1]=X[I];
16537: }
16538: return R;
16539: }
16540: return 0;
16541: }
16542:
16543: def linfrac01(X)
16544: {
16545: if(type(X)==4) K=length(X)-2;
16546: else if(type(X)==5){
16547: L=length(X);
16548: for(K=0,I=10,J=5; I<L; K++,I+=J++);
16549: if(I!=L) return 0;
16550: }
16551: if(K>3 && getopt(over)!=1) return(-1);
16552: II=(K==-1)?3:4;
16553: for(CC=C=1,L=[X]; C!=0; CC+=C){
16554: for(F=C,C=0,R=L; F>0; R=cdr(R), F--){
16555: P=car(R);
16556: for(I=-K; I<II; I++){
16557: S=lft01(P,I);
16558: if(findin(S,L) < 0){
16559: C++; L=cons(S,L);
16560: }
16561: }
16562: }
16563: }
16564: return L;
16565: }
16566:
1.4 ! takayama 16567:
! 16568: def varargs(P)
! 16569: {
! 16570: if((All=getopt(all))!=1) All=0;
! 16571: V=vars(P);
! 16572: for(Arg=FC=[];V!=[];V=cdr(V)){
! 16573: if(vtype(CV=car(V))==0&&All==1){
! 16574: Arg=lsort([CV],Arg,0);
! 16575: }
! 16576: if(vtype(CV)!=2) continue;
! 16577: if(findin(F=functor(CV),FC)<0) FC=cons(F,FC);
! 16578: for(AT=vars(args(CV));AT!=[];AT=cdr(AT)){
! 16579: if(vtype(X=car(AT))<2){
! 16580: if(findin(X,Arg)<0) Arg=cons(X,Arg);
! 16581: }else if(vtype(X)==2){
! 16582: R=varargs(X);
! 16583: if(R[1]!=[]){
! 16584: Arg=lsort(R[1],Arg,0);
! 16585: FC=lsort(R[0],FC,0);
! 16586: }
! 16587: }
! 16588: }
! 16589: }
! 16590: return [FC,Arg];
! 16591: }
! 16592:
! 16593: def pfargs(P,X)
! 16594: {
! 16595: if(type(L=getopt(level))!=1) L=0;
! 16596: for(Var=[],V=vars(P);V!=[];V=cdr(V)){
! 16597: if(vtype(car(V))==2){
! 16598: VT=funargs(car(V));
! 16599: if(length(VT)>1){
! 16600: if(L<2 &&(ptype(VT[1],X)>1 || (length(VT)>2 && ptype(VT[2],X)>1)))
! 16601: Var=cons(cons(car(V),VT),Var);
! 16602: if(L!=1 && (R=pfargs(VT[1],X|level=L-1))!=[]) Var=append(R,Var);
! 16603: }
! 16604: }
! 16605: }
! 16606: return reverse(Var);
! 16607: }
! 16608:
1.1 takayama 16609: def ptype(P,L)
16610: {
16611: if((T=type(P))<2 || T>3) return T;
16612: if(type(L)!=4) L=[L];
1.4 ! takayama 16613: F=0;
! 16614: if(lsort(L,varargs(dn(P))[1],2)!=[]) F=128;
! 16615: if(lsort(L,varargs(nm(P))[1],2)!=[]) F+=64;
! 16616: if(lsort(L,vars(dn(P)),2)!=[]) return F+3;
! 16617: return (lsort(L,vars(nm(P)),2)==[])?(F+1):(F+2);
1.1 takayama 16618: }
16619:
16620: def nthmodp(X,N,P)
16621: {
16622: X=X%P;
16623: for(Z=1;;){
16624: if((W=iand(N,1))==1) Z=(Z*X)%P;
16625: if((N=(N-W)/2)<=0) return Z;
16626: X=irem(X*X,P);
16627: }
16628: }
16629:
16630: def issquaremodp(X,P)
16631: {
16632: N=getopt(power);
16633: if(!isint(N)) N=2;
16634: if(P<=1 || !isint(P) || !pari(ispsp,P) || !isint(X) || !isint(N) || N<1){
16635: errno(0);
16636: return -2;
16637: }
16638: M=(P-1)/igcd(N,P-1);
16639: if((X%=P) == 0) return 0;
16640: if(X==1 || M==P-1) return 1;
16641: return (nthmodp(X,M,P)==1)?1:-1;
16642: }
16643:
1.3 takayama 16644: def iscoef(P,F)
16645: {
16646: if(P==0) return 1;
16647: if(type(P)==1) return F(P);
16648: if(type(P)==2) {
16649: X=var(P);
16650: for(I=deg(P,X); I>=0; I--){
16651: if(!iscoef(mycoef(P,I,X),F)) return 0;
16652: }
16653: }else if(type(P)==3){
16654: if(!iscoef(nm(P),F)||!iscoef(dn(P),F)) return 0;
16655: }else if(type(P)==4){
16656: for(;P!=[];P=cdr(P)) if(!iscoef(P,F)) return 0;
16657: }else if(type(P)>4 && type(P)<7) return iscoef(m2l(PP),F);
16658: else return 0;
16659: return 1;
16660: }
16661:
1.1 takayama 16662: def rootmodp(X,P)
16663: {
16664: X%=P;
16665: if(X==0) return [0];
16666: N=getopt(power);
16667: PP=pari(factor,P);
16668: P0=PP[0][0]; P1=PP[0][1];
16669: P2=pari(phi,P);
16670: if(!isint(N)) N=2;
16671: N%=P2;
16672: if(P0==2 || size(PP)[0]>1){
16673: for(I=1,R=[]; I<P2; I++)
16674: if(nthmodp(I,N,P)==X) R=cons(I,R);
16675: return qsort(R);
16676: }
16677: Y=primroot(P);
16678: if(Y==0) return 0;
16679: Z=nthmodp(Y,N,P);
16680: G=igcd(N,P2);
16681: P3=P2/G;
16682: for(I=0, W=1; I<P3;I++){
16683: if(W==X) break;
16684: W=(W*Z)%P;
16685: }
16686: if(I==P3) return [];
16687: W=nthmodp(Y,I,P);
16688: Z=nthmodp(Y,P3,P);
16689: for(I=0,R=[];;){
16690: R=cons(W,R);
16691: if(++I>=G) break;
16692: W=(W*Z)%P;
16693: }
16694: return qsort(R);
16695: }
16696:
16697: def primroot(P)
16698: {
16699: PP=pari(factor,P);
16700: P0=PP[0][0]; P1=PP[0][1];
16701: S=size(PP);
16702: if(S[0]>1 || !isint(P) || P0<=2){
16703: print("Not odd prime(power)!");
16704: return 0;
16705: }
16706: if(isint(Ind=getopt(ind))){
16707: Ind %= P;
16708: if(Ind<=0 || igcd(Ind,P)!=1 || (Z=primroot(P))==0){
16709: print("Not exist!");
16710: return 0;
16711: }
16712: P2=P0^(P1-1)*(P0-1);
16713: for(I=1,S=1; I<P2; I++)
16714: if((S = (S*Z)%P) == Ind) return I;
16715: return 0;
16716: }
16717: if(getopt(all)==1){
16718: I=primroot(P);
16719: P2=P0^(P1-1)*(P0-1);
16720: for(L=[],J=1; J<P2; J++){
16721: if(P1>1 && igcd(P0,J)!=1) continue;
16722: if(igcd(P0-1,J)!=1) continue;
16723: L=cons(nthmodp(I,J,P),L);
16724: }
16725: return qsort(L);
16726: }
16727: if(PP[0][1]>1){
16728: I=primroot(P0);
16729: P2=P0^(P1-2)*(P0-1);
16730: if(nthmodp(I,P2,P)==1) I+=P0;
16731: return I;
16732: }
16733: F=pari(factor,P-1);
16734: SF=size(F)[0];
16735: for(I=2; I<P; I++){
16736: for(J=0; J<SF; J++)
16737: if(nthmodp(I,(P-1)/F[J][0],P)==1) break;
16738: if(J==SF) return I;
16739: }
16740: }
16741:
16742: def rabin(P,X)
16743: {
16744: for(M=0,Q=P-1;iand(Q,1)==0;M++,Q/=2);
16745: Z=nthmodp(X,Q,P);
16746: for(N=M;M>0&&Z!=1&&Z!=P-1;M--,Z=(Z*Z)%P);
16747: return (M<N&&(M==0||Z==1))?0:1;
16748: }
16749:
1.3 takayama 16750: def powprimroot(P,N){
16751: if(P<3) P=3;
16752: FE=getopt(exp);
16753: if(FE!=1) FE=0;
16754: if((Log=getopt(log))==1||Log==2) FE=-1;
16755: else if(Log==3){
16756: FE=-2;
16757: for(PP=1, L0=["$r$","$p/a$"];;){
16758: PP=pari(nextprime,PP+1);
16759: if(PP>=P) break;
16760: L0=cons(PP, L0);
16761: }
16762: L0=reverse(L0);
16763: }
16764: if(FE==0) All=getopt(all);
16765: for(I=0, PP=P, LL=[]; I<N; I++,PP++){
16766: PP=pari(nextprime,PP);
16767: if(All==1){
16768: PR=primroot(PP|all=1);
16769: LL=cons(cons(PP,PR),LL);
16770: continue;
16771: }
16772: PR=primroot(PP);
16773: if(FE==-2){ /* log=3 */
16774: LT=cdr(L0);LT=cdr(L0);
16775: for(L=[PP];LT!=[];LT=cdr(LT))
16776: L=cons(primroot(PP|ind=car(LT)),L);
16777: LL=cons(reverse(L),LL);
16778: if(I<N-1) L0=append(L0,[PP]);
16779: }else if(FE){
16780: for(J=1, L=[PP], K=1; J<PP; J++){
16781: if(FE==-1){ /* log=1,2 */
16782: K=primroot(PP|ind=J);
16783: if(K==0 && Log==2) K=PP-1;
16784: }
16785: else K=(K*PR)%PP; /* exp=1 */
16786: L=cons(K,L);
16787: }
16788: LL=cons(reverse(L),LL);
16789: }else
16790: LL=cons([PP,PR],LL); /* default */
16791: }
16792: LL=reverse(LL);
16793: if(!FE) return LL;
16794: PP--;
16795: if(FE==-2) return append(LL,[L0]);
16796: for(I=1,L=["$p$"];I<PP; I++) L=cons(I,L);
16797: return cons(reverse(L),LL);
16798: }
16799:
16800: def ntable(F,II,D)
16801: {
16802: F=f2df(F|opt=-1);
16803: Df=getopt(dif);
16804: if(Df!=1) Df=0;
16805: Str=getopt(str);
16806: L=[];T=II[1]-II[0];
16807: for(L=[],I=0;I<=D;I++){
16808: X=II[0]+I*T/D;
16809: L=cons([X,myfdeval(F,X)],L);
16810: }
16811: if(Df==1){
16812: for(LD=[],LL=L;LL!=[];LL=cdr(LL)){
16813: if(LD==[]) LD=cons([car(LL)[0],car(LL)[1],0],LD);
16814: else LD=cons([car(LL)[0],car(LL)[1],abs(car(LL)[1]-car(LD)[1])],LD);
16815: }
16816: L=reverse(LD);
16817: }
16818: if(type(Str=getopt(str))==4){
16819: if(length(Str)==1) Str=[Str[0],Str[0]];
16820: if(Df==1 && length(Str)==2) Str=[Str[0],Str[1],Str[2]];
16821: for(S=Str,Str=[];S!=[];S=cdr(S)){
16822: if(type(car(S))!=4) Str=cons([car(S),3],Str);
16823: else Str=cons(car(S),Str);
16824: }
16825: Str=reverse(Str);
16826: for(LD=[],LL=L;LL!=[];LL=cdr(LL)){
16827: for(K=[],J=length(Str); --J>=0; )
16828: K=cons(sint(car(LL)[J],Str[J][0]|str=Str[J][1]),K);
16829: LD=cons(K,LD);
16830: }
16831: L=LD;
16832: }else
16833: L=reverse(L);
16834: if(type(M=getopt(mult))==1){
16835: Opt=[["opt","tab"],["vline",[[0,2+Df]]],["width",-M]];
16836: if(type(T=getopt(title))==7)
16837: Opt=cons(["title",T],Opt);
16838: if(type(Tp=getopt(top))==4)
16839: Opt=cons(["top",Tp],Opt);
16840: L=ltotex(L|option_list=Opt);
16841: }
16842: return L;
16843: }
16844:
16845: def distpoint(L)
16846: {
16847: L=m2l(L|flat=1);
16848: if(getopt(div)==5) Div=5;
16849: else Div=10;
16850: V=newvect(100/Div);
16851: for(LT=L,LL=[],N=0; LT!=[]; LT=cdr(LT)){
16852: if(type(K=car(LT))>1||K<0){
16853: N++; continue;
16854: }
16855: LL=cons(K,LL);
16856: T=idiv(K,Div);
16857: if(Div==10 && T>=9) T=9;
16858: else if(Div==5 && T>=19) T=19;
16859: V[T]++;
16860: }
16861: V=vtol(V);
16862: if((Opt=getopt(opt))=="data") return V;
16863: Title=getopt(title);
16864: OpList=[["opt","tab"]];
16865: if(type(Title=getopt(title)) == 7)
16866: OpList=cons(["title",Title],OpList);
16867: if(Opt=="average"){
16868: T=isMs()?["平均点","標準偏差","最低点","最高点","受験人数"]:
16869: ["average","deviation","min","max","examinees"];
16870: L=average(LL);
16871: L=[sint(L[0],1),sint(L[1],1),L[3],L[4],L[2]];
16872: if(N>0){
16873: T=append(T,[isMs()?"欠席者":"absentees"]);L=append(L,[N]);
16874: }
16875: OpList=cons(["align","c"],OpList);
16876: return ltotex([T,L]|option_list=OpList);
16877: }
16878:
16879: if(getopt(opt)=="graph"){
16880: Mul=getopt(size);
16881: if(Div==5){
16882: V0=["00","05","10","15","20","25","30","35","40","45","50","55",
16883: "60","65","70","75","80","85","90","95"];
16884: if(type(Mul)!=4){
16885: Size = (TikZ)?[12,3,1/2,0.2]:[120,30,1/2,2];
16886: }
16887: }else{
16888: V0=["00","10-","20-","30-","40-","50-","60-","70-","80-","90-"];
16889: if(type(Mul)!=4){
16890: Size = (TikZ)?[8,3,1/2,0.2]:[80,30,1/2,2];
16891: }
16892: }
16893: return ltotex([V,V0]|opt="graph",size=Size);
16894: }
16895: if(Div==5)
16896: V0=["00--04","05--09","10--14","15--19", "20--24", "25--29", "30--34", "35-39",
16897: "40--44", "45--49","50--54", "55--59","60--64", "65--69",
16898: "70--74", "75--79","80--84", "85--89","90--94", "95--100"];
16899: else
16900: V0=["00--09","10--19","20--29","30--39","40--49","50--59","60--69",
16901: "70--79","80--89","90--100"];
16902: Title=getopt(title);
16903: return ltotex([V0,V]|option_list=OpList);
16904: }
16905:
16906: def keyin(S)
16907: {
16908: print(S,2);
16909: purge_stdin();
16910: S=get_line();
16911: L=length(S=strtoascii(S));
16912: if(L==0) return "";
16913: return str_cut(S,0,L-2);
16914: }
16915:
1.1 takayama 16916: def init() {
1.4 ! takayama 16917: LS=["DIROUT","DVIOUTA","DVIOUTB","DVIOUTH","DVIOUTL","TeXLim","TeXEq","TikZ",
! 16918: "XYPrec","XYcm","Canvas"];
1.1 takayama 16919: if(!access(get_rootdir()+"/help/os_muldif.dvi")||!access(get_rootdir()+"/help/os_muldif.pdf"))
16920: mycat(["Put os_muldif.dvi and os_muldif.pdf in", get_rootdir()+(isMs()?"\\help.":"/help.")]);
16921: if(!isMs()){
1.3 takayama 16922: DIROUT="%HOME%/asir/tex";
16923: DVIOUTA=str_subst(DVIOUTA,[["\\","/"],[".bat",".sh"]],0);
16924: DVIOUTB=str_subst(DVIOUTB,[["\\","/"],[".bat",".sh"]],0);
16925: DVIOUTL=str_subst(DVIOUTL,[["\\","/"],[".bat",".sh"]],0);
16926: DVIOUTH="%ASIRROOT%/help/os_muldif.pdf";
1.1 takayama 16927: }
16928: Home=getenv("HOME");
1.3 takayama 16929: if(type(Home)!=7) Home="";
16930: for(Id=-7, F=Home; Id<-1;){
1.1 takayama 16931: G = F+"/.muldif";
16932: if(access(G)) Id = open_file(G);
16933: else Id++;
1.3 takayama 16934: if(Id==-6) F+="/asir";
1.1 takayama 16935: else if(Id==-5) F=get_rootdir();
16936: else if(Id==-4) F+="/bin";
16937: else if(Id==-3) F=get_rootdir()+"/lib-asir-contrib";
16938: }
16939: if(Id>=0){
16940: while((S=get_line(Id))!=0){
1.3 takayama 16941: if(type(P=str_str(S,LS))==4 && (P0=str_char(S,P[1]+5,"="))>0){
16942: if(P[0]<5){
1.1 takayama 16943: P0=str_chr(S,P0+1,"\"");
16944: if(P0>0){
16945: for(P1=P0;(P2=str_char(S,P1+1,"\""))>0; P1=P2);
16946: if(P1>P0+1){
16947: SS=str_cut(S,P0+1,P1-1);
16948: SS=str_subst(SS,["\\\\","\\\""],["\\","\""]);
16949: if(P[0]==0) DIROUT=SS;
16950: else if(P[0]==1) DVIOUTA=SS;
1.3 takayama 16951: else if(P[0]==2) DVIOUTB=SS;
16952: else if(P[0]==3) DVIOUTH=SS;
16953: else if(P[0]==4) DVIOUTL=SS;
1.1 takayama 16954: }
16955: }
1.3 takayama 16956: if(P0<0 || P1<P0+2) mycat(["Error! Definiton of", LS[P[0]],
16957: "in .muldif"]);
1.1 takayama 16958: }else{
16959: SV=eval_str(str_cut(S,P0+1,str_len(S)-1));
1.3 takayama 16960: if(P[0]==5) TeXLim=SV;
16961: else if(P[0]==6) TeXEq=SV;
16962: else if(P[0]==7) TikZ=SV;
16963: else if(P[0]==8) XYPrec=SV;
16964: else if(P[0]==9) XYcm=SV;
1.4 ! takayama 16965: else if(P[0]==10) XYcm=Canvas;
1.1 takayama 16966: }
16967: }
16968: }
16969: close_file(Id);
16970: }
16971: chkfun(1,0);
16972: }
1.3 takayama 16973:
1.1 takayama 16974: #ifdef USEMODULE
16975: endmodule;
16976: os_md.init()$
16977: #else
16978: init()$
16979: #endif
16980:
16981: end$
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>