Annotation of OpenXM_contrib2/asir2000/lib/weight, Revision 1.17
1.4 kimura 1: load("solve")$
2: load("gr")$
3:
1.9 kimura 4: def nonzerovec(A){
5:
6: for(I=0;I<size(A)[0];I++)
7: if(A[I]!=0)
8: return 1$
9:
10: return 0$
11: }
12:
1.8 kimura 13: def junban(A,B){
14: return (A<B ? 1:(A>B ? -1:0))$
15: }
16:
17: def worder(A,B){
18: return (A[0]<B[0] ? 1:(A[0]>B[0] ? -1:0))$
19: }
20:
1.10 kimura 21: def bsort(A){
1.8 kimura 22:
1.10 kimura 23: K=size(A)[0]-1$
24: while(K>=0){
25: J=-1$
26: for(I=1;I<=K;I++)
27: if(A[I-1][0]<A[I][0]){
28: J=I-1$
29: X=A[J]$
30: A[J]=A[I]$
31: A[I]=X$
32: }
33: K=J$
34: }
35: return A$
36: }
37:
38: def perm(I,P,TMP){
39:
40: if(I>0){
41: TMP=perm(I-1,P,TMP)$
42: for(J=I-1;J>=0;J--){
43: T=P[I]$
44: P[I]=P[J]$
45: P[J]=T$
46: TMP=perm(I-1,P,TMP)$
47: T=P[I]$
48: P[I]=P[J]$
49: P[J]=T$
50: }
51:
52: return TMP$
53: }
54: else{
55: for(TMP0=[],K=0;K<size(P)[0];K++)
56: TMP0=cons(P[K],TMP0)$
57:
58: TMP=cons(TMP0,TMP)$
59: return TMP$
60: }
61: }
62:
63: def marge(A,B){
64:
65: RET=[]$
66: for(I=0;I<length(A);I++)
67: for(J=0;J<length(B);J++)
68: RET=cons(append(A[I],B[J]),RET)$
69:
70: return RET$
71: }
72:
73: def wsort(A,B,C,FLAG){
74:
75: if(FLAG==0){
76: D=newvect(length(B))$
77: for(I=0;I<length(B);I++)
78: D[I]=[A[I],B[I],C[I]]$
79:
80: D=bsort(D)$
81: E=[]$
82: for(I=0;I<length(B);I++)
83: E=cons(D[I][1],E)$
84: E=reverse(E)$
85: F=[]$
86: for(I=0;I<length(B);I++)
87: F=cons(D[I][2],F)$
88: F=reverse(F)$
1.8 kimura 89:
1.10 kimura 90: return [[E,F]]$
91: }
92: else{
93: D=newvect(length(B))$
94: for(I=0;I<length(B);I++)
95: D[I]=[A[I],B[I],C[I]]$
96:
97: D=qsort(D,worder)$
98: D0=[]$
99:
100: for(I=0,J=0,TMP=[],X=0;I<size(D)[0];I++){
101: if(X==D[I][0])
102: TMP=cons(cdr(D[I]),TMP)$
103: else{
104: D0=cons(TMP,D0)$
105: TMP=[]$
106: TMP=cons(cdr(D[I]),TMP)$
107: X=car(D[I])$
108: }
109: }
110: D0=cdr(reverse(cons(TMP,D0)))$
111: D0=map(ltov,D0)$
112: for(I=0,TMP=[[]];I<length(D0);I++){
113: TMP0=perm(length(D0[I])-1,D0[I],[])$
114: TMP=marge(TMP,TMP0)$
115: }
116:
117: RET=[]$
118: for(I=0;I<length(TMP);I++){
119: TMP0=[]$
120: TMP1=[]$
121: for(J=0;J<length(TMP[I]);J++){
122: TMP0=cons(TMP[I][J][0],TMP0)$
123: TMP1=cons(TMP[I][J][1],TMP1)$
124: }
125: TMP0=reverse(TMP0)$
126: TMP1=reverse(TMP1)$
127:
128: RET=cons([TMP0,TMP1],RET)$
129: }
130:
131: return RET$
132: }
1.8 kimura 133: }
134:
135: def derase(A){
136:
137: B=newvect(length(A),A)$
138: B=qsort(B,junban)$
139: C=[]$
140: for(I=0;I<size(B)[0];I++)
141: if(car(C)!=B[I])
142: C=cons(B[I],C)$
143:
144: return reverse(C)$
145: }
146:
1.4 kimura 147: def nonposdegchk(Res){
148:
149: for(I=0;I<length(Res);I++)
150: if(Res[I][1]<=0)
151: return 0$
152:
153: return 1$
154: }
155:
1.8 kimura 156: def getgcd(A,B){
157:
158: VarsNumA=length(A)$
159: VarsNumB=length(B)$
160:
161: C=newvect(VarsNumB,B)$
162:
163: for(I=0;I<VarsNumA;I++){
164:
165: for(J=0;J<VarsNumB;J++)
1.16 kimura 166: if(B[J]==A[I][0])
1.8 kimura 167: break$
168:
169: if(J<VarsNumB)
170: C[J]=A[I][1]$
171: }
172:
173: D=0$
174: for(I=0;I<VarsNumB;I++)
175: D=gcd(D,C[I])$
176:
177: if(D!=0){
178: C=C/D$
179: C=map(red,C)$
180: }
1.6 kimura 181:
1.8 kimura 182: for(L=1,D=0,I=0;I<VarsNumB;I++){
183: if(type(TMP=dn(C[I]))==1)
184: L=ilcm(L,TMP)$
185:
186: if(type(TMP=nm(C[I]))==1)
187: D=igcd(D,TMP)$
188: }
189:
190: C=C*L$
191: if(D!=0)
192: C=C/D$
1.6 kimura 193:
1.8 kimura 194: RET=[]$
195: for(I=0;I<VarsNumB;I++)
196: RET=cons([B[I],C[I]],RET)$
1.6 kimura 197:
1.8 kimura 198: return RET$
1.6 kimura 199: }
200:
1.10 kimura 201: def makeret(Res,Vars,FLAG){
1.4 kimura 202:
1.8 kimura 203: ResNum=length(Res)$
1.4 kimura 204: VarsNum=length(Vars)$
205:
1.17 ! kimura 206: ResVec=newvect(ResNum)$
1.4 kimura 207:
1.17 ! kimura 208: for(M=0,I=0;I<ResNum;I++){
! 209: if(member(Res[I][0],Vars)){
! 210: ResVec[I]=Res[I][1]$
1.16 kimura 211:
1.17 ! kimura 212: if(FLAG && type(ResVec[I])==1){
! 213: if(M==0)
! 214: M=ResVec[I]$
! 215: else
! 216: if(ResVec[I]<M)
! 217: M=ResVec[I]$
! 218: }
! 219: }
! 220: }
1.16 kimura 221:
1.8 kimura 222: if(M!=0)
223: ResVec=ResVec/M;
1.4 kimura 224:
1.17 ! kimura 225: RET=newvect(VarsNum,Vars)$
1.4 kimura 226:
1.8 kimura 227: for(I=0;I<ResNum;I++){
228: for(J=0;J<VarsNum;J++)
229: if(Vars[J]==Res[I][0])
230: break$
1.4 kimura 231:
1.8 kimura 232: if(J<VarsNum)
233: RET[J]=ResVec[I]$
234: }
235:
1.10 kimura 236:
237: for(J=0;J<length(Vars);J++)
238: RET=map(subst,RET,Vars[J],
239: strtov(rtostr(Vars[J])+"_deg"))$
240:
1.4 kimura 241: for(I=0;I<VarsNum;I++)
1.8 kimura 242: if(type(RET[I])!=1)
243: return [1,RET]$
1.4 kimura 244:
1.8 kimura 245: return [0,RET]$
1.4 kimura 246: }
247:
248: def roundret(V){
249:
1.8 kimura 250: VN=size(V)[0]$
1.4 kimura 251:
1.8 kimura 252: RET0=V$
1.13 kimura 253: for(I=1;I<1000;I++){
1.4 kimura 254: RET1=I*RET0$
255: for(J=0;J<VN;J++){
256: X=drint(RET1[J])$
257: if(dabs(X-RET1[J])<0.2)
258: RET1[J]=X$
259: else
260: break$
261: }
262: if(J==VN)
263: break$
264: }
265:
266: if(I==1000)
267: return []$
268: else
269: return RET1$
270: }
271:
272: def chkou(L,ExpMat,CHAGORD){
273:
1.8 kimura 274: for(P=1,I=0;I<L;I++){
1.4 kimura 275: Q=ExpMat[L][CHAGORD[I]]$
276: for(J=0;J<size(ExpMat[0])[0];J++){
277: ExpMat[L][CHAGORD[J]]=red((ExpMat[I][CHAGORD[I]]
278: *ExpMat[L][CHAGORD[J]]-
279: Q*ExpMat[I][CHAGORD[J]])/P)$
280: }
281:
282: P=ExpMat[I][CHAGORD[I]]$
283: }
284:
285: for(J=0;J<size(ExpMat[0])[0];J++)
286: if(ExpMat[L][CHAGORD[J]]!=0)
287: break$
288:
289: if(J==size(ExpMat[0])[0])
290: return L$
291: else{
292: TMP=CHAGORD[L]$
293: CHAGORD[L]=CHAGORD[J]$
294: CHAGORD[J]=TMP$
295: return (L+1)$
296: }
297: }
298:
1.8 kimura 299: def qcheckmain(PolyList,Vars){
1.4 kimura 300:
301: RET=[]$
302: PolyListNum=length(PolyList)$
303: VarsNum=length(Vars)$
304:
305: ExpMat=newvect(VarsNum)$
306: CHAGORD=newvect(VarsNum)$
307: for(I=0;I<VarsNum;I++)
308: CHAGORD[I]=I$
309:
310: L=0$
311: for(I=0;I<PolyListNum;I++){
312: Poly=dp_ptod(PolyList[I],Vars)$
313: BASE0=dp_etov(dp_ht(Poly))$
314: Poly=dp_rest(Poly)$
315: for(;Poly!=0;Poly=dp_rest(Poly)){
316: ExpMat[L]=dp_etov(dp_ht(Poly))-BASE0$
317: L=chkou(L,ExpMat,CHAGORD)$
1.8 kimura 318: if(L==VarsNum-1)
319: return [L,CHAGORD,ExpMat]$
1.4 kimura 320: }
321: }
322:
1.8 kimura 323: return [L,CHAGORD,ExpMat]$
1.4 kimura 324: }
325:
326: def inner(A,B){
327:
328: SUM=0$
329: for(I=0;I<size(A)[0];I++)
330: SUM+=A[I]*B[I]$
331:
332: return SUM$
333: }
334:
335: def checktd(PolyList,Vars,ResVars){
336:
337: PolyListNum=length(PolyList)$
338: VarsNum=length(Vars)$
339:
340: L=0$
341: for(I=0;I<PolyListNum;I++){
342: Poly=dp_ptod(PolyList[I],Vars)$
343: J0=inner(dp_etov(dp_ht(Poly)),ResVars)$
344: Poly=dp_rest(Poly)$
345: for(;Poly!=0;Poly=dp_rest(Poly))
346: if(J0!=inner(dp_etov(dp_ht(Poly)),ResVars))
347: return 0$
348: }
349:
350: return 1$
351: }
352:
1.10 kimura 353: def qcheck(PolyList,Vars,FLAG){
1.4 kimura 354:
1.10 kimura 355: RET=[]$
1.8 kimura 356: Res=qcheckmain(PolyList,Vars)$
1.4 kimura 357: VarsNum=length(Vars)$
358:
359: IndNum=Res[0]$
360: CHAGORD=Res[1]$
361: ExpMat=Res[2]$
362:
363: SolveList=[]$
364: for(I=0;I<IndNum;I++){
365: TMP=0$
366: for(J=0;J<VarsNum;J++)
367: TMP+=ExpMat[I][CHAGORD[J]]*Vars[CHAGORD[J]]$
368:
369: SolveList=cons(TMP,SolveList)$
370: }
371:
1.8 kimura 372: Rea=vars(SolveList)$
373:
1.4 kimura 374: VarsList=[]$
375: for(I=0;I<VarsNum;I++)
1.8 kimura 376: if(member(Vars[CHAGORD[I]],Rea))
377: VarsList=cons(Vars[CHAGORD[I]],VarsList)$
1.4 kimura 378:
379: Res=solve(reverse(SolveList),reverse(VarsList))$
1.8 kimura 380: Res=getgcd(Res,Rea)$
1.4 kimura 381:
382: if(nonposdegchk(Res)){
383:
1.10 kimura 384: ResVars=makeret(Res,Vars,0)$
1.4 kimura 385:
1.10 kimura 386: if(checktd(PolyList,Vars,ResVars[1])==1){
387: if(ResVars[0]==0){
388: RET=append(RET,wsort(ResVars[1],Vars,
389: ResVars[1],FLAG))$
390: return RET$
391: }
392: else{
1.11 kimura 393: RET=append(RET,[[Vars,vtol(ResVars[1])]])$
1.10 kimura 394: return RET$
395: }
1.4 kimura 396: }
397: else
1.8 kimura 398: return []$
1.4 kimura 399: }
400: else
1.8 kimura 401: return []$
1.4 kimura 402:
403: }
404:
1.10 kimura 405: def leastsq(NormMat,ExpMat,Vars,FLAG){
1.8 kimura 406:
407: RET=[]$
1.4 kimura 408:
409: ExpMatRowNum=size(ExpMat)[0]$
410: ExpMatColNum=size(ExpMat[0])[0]$
411:
1.8 kimura 412: if(NormMat==0){
413: NormMat=newmat(ExpMatColNum,ExpMatColNum)$
414:
415: for(I=0;I<ExpMatColNum;I++)
416: for(J=I;J<ExpMatColNum;J++)
417: for(K=0;K<ExpMatRowNum;K++)
418: NormMat[I][J]+=
419: ExpMat[K][I]*ExpMat[K][J]$
420: }
1.4 kimura 421:
1.8 kimura 422: BVec=newvect(ExpMatColNum)$
1.4 kimura 423:
424: for(I=0;I<ExpMatColNum;I++)
425: for(J=0;J<ExpMatRowNum;J++)
1.8 kimura 426: BVec[I]+=ExpMat[J][I]$
1.4 kimura 427:
428: SolveList=[]$
429: for(I=0;I<ExpMatColNum;I++){
430: TMP=0$
1.8 kimura 431: for(J=0;J<I;J++)
432: TMP+=NormMat[J][I]*Vars[J]$
433:
434: for(J=I;J<ExpMatColNum;J++)
1.4 kimura 435: TMP+=NormMat[I][J]*Vars[J]$
436:
1.8 kimura 437: TMP-=BVec[I]$
1.4 kimura 438: SolveList=cons(TMP,SolveList)$
439: }
440:
441: Rea=vars(SolveList)$
1.8 kimura 442:
443: VarsList=[]$
444: for(I=0;I<length(Vars);I++)
445: if(member(Vars[I],Rea))
446: VarsList=cons(Vars[I],VarsList)$
447:
448: Res=solve(SolveList,VarsList)$
449: Res=getgcd(Res,Rea)$
1.4 kimura 450:
451: if(nonposdegchk(Res)){
1.16 kimura 452:
1.10 kimura 453: TMP1=makeret(Res,Vars,1)$
1.16 kimura 454:
1.8 kimura 455: if(TMP1[0]==0){
1.14 kimura 456: TMP=roundret(TMP1[1])$
1.8 kimura 457: if(TMP!=[])
1.10 kimura 458: RET=append(RET,wsort(TMP1[1],Vars,TMP,FLAG))$
1.8 kimura 459:
1.10 kimura 460: RET=append(RET,wsort(TMP1[1],Vars,
461: map(drint,TMP1[1]*1.0),FLAG))$
1.8 kimura 462:
463: return RET$
464: }
465: else{
1.11 kimura 466: RET=append(RET,[[Vars,vtol(TMP1[1]*1.0)]])$
1.8 kimura 467: return RET$
468: }
469: }
470: else
471: return RET$
472:
473: }
474:
1.10 kimura 475: def weightr(ExpMat,Vars,PolyListNum,OneMat,FLAG){
1.8 kimura 476:
477: RET=[]$
478:
479: ExpMatRowNum=size(ExpMat)[0]$
480: ExpMatColNum=size(ExpMat[0])[0]$
481: ExtMatColNum=ExpMatColNum+PolyListNum$
482:
483: ExtVars=reverse(Vars)$
484: for(I=0;I<PolyListNum;I++)
485: ExtVars=cons(uc(),ExtVars)$
486:
487: ExtVars=reverse(ExtVars)$
488:
489: NormMat=newmat(ExpMatColNum,ExtMatColNum)$
490:
491: for(I=0;I<ExpMatColNum;I++)
492: for(J=I;J<ExpMatColNum;J++)
493: for(K=0;K<ExpMatRowNum;K++)
494: NormMat[I][J]+=
495: ExpMat[K][I]*
496: ExpMat[K][J]$
497:
498: for(I=0;I<ExpMatColNum;I++)
499: for(J=0;J<PolyListNum;J++)
500: for(K=OneMat[J];K<OneMat[J+1];K++)
501: NormMat[I][J+ExpMatColNum]-=
502: ExpMat[K][I]$
503:
504: WVect=newvect(PolyListNum)$
505: for(I=0;I<PolyListNum;I++)
506: WVect[I]=OneMat[I+1]-OneMat[I]$
507:
508: for(F=0;F<ExtMatColNum;F++){
509: SolveList=[]$
510: for(I=0;I<ExpMatColNum;I++){
511: if (F==I)
512: continue$
513:
514: TMP=0$
515:
516: for(J=0;J<I;J++)
517: if(J!=F)
518: TMP+=NormMat[J][I]*ExtVars[J]$
519:
520: for(J=I;J<ExtMatColNum;J++)
521: if(J!=F)
522: TMP+=NormMat[I][J]*ExtVars[J]$
523:
524: if(F<I)
525: TMP+=NormMat[F][I]$
526: else
527: TMP+=NormMat[I][F]$
528:
529: SolveList=cons(TMP,SolveList)$
530: }
531:
532: for(I=0;I<PolyListNum;I++){
533: if(F==(I+ExpMatColNum))
534: continue$
535:
536: TMP=0$
537: for(J=0;J<ExpMatColNum;J++)
538: if(J!=F)
539: TMP+=NormMat[J][I+ExpMatColNum]
540: *ExtVars[J]$
541:
542: TMP+=WVect[I]*ExtVars[I+ExpMatColNum]$
543:
544: if(F<ExpMatColNum)
545: TMP+=NormMat[F][I+ExpMatColNum]$
546:
547: SolveList=cons(TMP,SolveList)$
548: }
549:
550: Rea=vars(SolveList)$
551:
552: SolVars=[]$
553: for(I=0;I<ExtMatColNum;I++)
554: if(I!=F && member(ExtVars[I],Rea))
555: SolVars=cons(ExtVars[I],SolVars)$
556:
557: Res=solve(SolveList,SolVars)$
558: Res=cons([ExtVars[F],1],Res)$
559:
1.9 kimura 560: TMP=[]$
561: for(I=0;I<length(Rea);I++)
562: if(member(Rea[I],Vars))
563: TMP=cons(Rea[I],TMP)$
564:
1.15 kimura 565: if(member(ExtVars[F],Vars))
566: TMP=cons(ExtVars[F],TMP)$
567:
1.9 kimura 568: Res=getgcd(Res,TMP)$
1.8 kimura 569:
570: if(nonposdegchk(Res)){
571:
1.10 kimura 572: TMP1=makeret(Res,Vars,1)$
1.16 kimura 573:
1.8 kimura 574: if(TMP1[0]==0){
1.14 kimura 575: TMP=roundret(TMP1[1])$
1.8 kimura 576: if(TMP!=[])
1.10 kimura 577: RET=append(RET,wsort(TMP1[1],Vars,
578: TMP,FLAG))$
1.8 kimura 579:
1.10 kimura 580: RET=append(RET,wsort(TMP1[1],Vars,
581: map(drint,TMP1[1]*1.0),FLAG))$
1.8 kimura 582: }
583: else{
1.11 kimura 584: RET=append(RET,[[Vars,vtol(TMP1[1]*1.0)]])$
1.8 kimura 585: }
1.4 kimura 586: }
1.8 kimura 587:
1.4 kimura 588: }
589:
1.8 kimura 590: return [NormMat,RET]$
1.6 kimura 591: }
592:
1.10 kimura 593: def weight(PolyList,Vars,FLAG1,FLAG2){
1.6 kimura 594:
595: Vars0=vars(PolyList)$
596: Vars1=[]$
597: for(I=0;I<length(Vars);I++)
598: if(member(Vars[I],Vars0))
599: Vars1=cons(Vars[I],Vars1)$
600:
601: Vars=reverse(Vars1)$
602:
603: RET=[]$
604:
1.10 kimura 605: TMP=qcheck(PolyList,Vars,FLAG2)$
1.6 kimura 606:
1.8 kimura 607: if(TMP!=[]){
608: RET=append(RET,TMP)$
609: return cons(1,RET)$
1.6 kimura 610: }
1.4 kimura 611:
1.6 kimura 612: dp_ord(2)$
1.4 kimura 613:
1.6 kimura 614: PolyListNum=length(PolyList)$
1.4 kimura 615:
1.10 kimura 616: if(FLAG1){
1.9 kimura 617:
618: OneMat=newvect(PolyListNum+1,[0])$
619: ExpMat=[]$
620: for(I=0;I<PolyListNum;I++){
621: for(Poly=dp_ptod(PolyList[I],Vars);
622: Poly!=0;Poly=dp_rest(Poly)){
623: ExpMat=cons(dp_etov(dp_ht(Poly)),ExpMat)$
624: }
625: OneMat[I+1]=length(ExpMat)$
1.8 kimura 626: }
1.4 kimura 627:
1.9 kimura 628: ExpMat=reverse(ExpMat)$
629: ExpMat=newvect(length(ExpMat),ExpMat)$
1.4 kimura 630:
1.10 kimura 631: TMP=weightr(ExpMat,Vars,PolyListNum,OneMat,FLAG2)$
1.8 kimura 632: RET=append(RET,TMP[1])$
1.10 kimura 633: RET=append(RET,leastsq(TMP[0],ExpMat,Vars,FLAG2))$
1.8 kimura 634: }
1.9 kimura 635: else{
636: ExpMat=[]$
637: for(I=0;I<PolyListNum;I++){
638: for(Poly=dp_ptod(PolyList[I],Vars);
639: Poly!=0;Poly=dp_rest(Poly)){
640: if(nonzerovec(TMP=dp_etov(dp_ht(Poly))))
641: ExpMat=cons(TMP,ExpMat)$
642: }
643: }
1.8 kimura 644:
1.9 kimura 645: ExpMat=reverse(ExpMat)$
646: ExpMat=newvect(length(ExpMat),ExpMat)$
1.4 kimura 647:
1.10 kimura 648: RET=append(RET,leastsq(0,ExpMat,Vars,FLAG2))$
1.9 kimura 649: }
1.4 kimura 650:
1.6 kimura 651: ExpMat=qsort(ExpMat,junban)$
1.8 kimura 652:
1.6 kimura 653: ExpMat2=[]$
654: for(I=0;I<size(ExpMat)[0];I++)
655: if(car(ExpMat2)!=ExpMat[I])
656: ExpMat2=cons(ExpMat[I],ExpMat2)$
1.4 kimura 657:
1.6 kimura 658: if(size(ExpMat)[0]!=length(ExpMat2)){
659: ExpMat=newvect(length(ExpMat2),ExpMat2)$
1.10 kimura 660: RET=append(RET,leastsq(0,ExpMat,Vars,FLAG2))$
1.4 kimura 661: }
662:
1.8 kimura 663: RET=derase(RET)$
664: return cons(0,RET)$
1.4 kimura 665: }
666:
667: end$
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>