53 int NormPolyTerm(
PHEAD WORD *term)
55 WORD *tcoef, ncoef, *tstop, *tfill, *t, *tt;
57 WORD *r1, *r2, *r3, *r4, *r5, *rfirst, rv;
58 WORD *lnum = AT.n_llnum+1, nnum;
64 tstop = tcoef - ABS(tcoef[-1]);
67 if ( t >= tstop )
return(*term);
77 r2 = rfirst+4; tt = r3 = t + t[1]; equal = 0;
80 if ( *r2 > *r1 ) { r2 += 2;
continue; }
81 if ( *r2 == *r1 ) { r2 += 2; equal = 1;
continue; }
82 rv = *r1; *r1 = *r2; *r2 = rv;
83 r1 -= 2; r2 -= 2; r4 = r2 + 2;
85 if ( *r2 >= *r1 ) { r2 = r4;
break; }
86 rv = *r1; *r1 = *r2; *r2 = rv;
100 while ( r4 < r3 ) *r2++ = *r4++;
102 r2 = r1 + 2; r3 -= 2;
111 r1 = t + 2; tt = r3 = t + t[1];
113 r2 = rfirst+2; r4 = rfirst + rfirst[1];
119 else if ( *r2 > *r1 ) {
121 while ( r5 > r2 ) { r5[1] = r5[-1]; r5[0] = r5[-2]; r5 -= 2; }
123 *r2 = *r1; r2[1] = r1[1];
130 *r2++ = *r1++; *r2++ = *r1++;
143 if ( t[3] & 1 ) ncoef = -ncoef;
145 else if ( t[2] == 0 ) {
146 if ( t[3] < 0 )
goto NormInf;
151 if ( t[3] && RaisPow(BHEAD (UWORD *)lnum,&nnum,(UWORD)(ABS(t[3]))) )
goto FromNorm;
152 ncoef = REDLENG(ncoef);
154 if ( Divvy(BHEAD (UWORD *)tstop,&ncoef,(UWORD *)lnum,nnum) )
157 else if ( t[3] > 0 ) {
158 if ( Mully(BHEAD (UWORD *)tstop,&ncoef,(UWORD *)lnum,nnum) )
161 ncoef = INCLENG(ncoef);
165 ncoef = REDLENG(ncoef);
166 if ( Mully(BHEAD (UWORD *)tstop,&ncoef,(UWORD *)(t+3),t[2]) )
goto FromNorm;
167 ncoef = INCLENG(ncoef);
171 MLOCK(ErrorMessageLock);
172 MesPrint(
"Illegal code in NormPolyTerm");
173 MUNLOCK(ErrorMessageLock);
183 r3 = rfirst + rfirst[1];
187 while ( r1 < r3 ) { r1[-2] = r1[0]; r1[-1] = r1[1]; r1 += 2; }
193 if ( rfirst[1] < 4 ) rfirst = 0;
200 NCOPY(tfill,rfirst,i)
205 *term = tfill - term;
211 MLOCK(ErrorMessageLock);
212 MesPrint(
"0^0 in NormPolyTerm");
213 MUNLOCK(ErrorMessageLock);
217 MLOCK(ErrorMessageLock);
218 MesCall(
"NormPolyTerm");
219 MUNLOCK(ErrorMessageLock);
249 #ifdef WITHCOMPAREPOLY 251 WORD ComparePoly(WORD *term1, WORD *term2, WORD level)
253 WORD *t1, *t2, *t3, *t4, *tstop1, *tstop2;
254 tstop1 = term1 + *term1;
255 tstop1 -= ABS(tstop1[-1]);
256 tstop2 = term2 + *term2;
257 tstop2 -= ABS(tstop2[-1]);
260 while ( t1 < tstop1 && t2 < tstop2 ) {
262 if ( *t1 == HAAKJE ) {
263 if ( t1[2] != t2[2] )
return(t2[2]-t1[2]);
264 t1 += t1[1]; t2 += t2[1];
267 t3 = t1 + t1[1]; t4 = t2 + t2[1];
269 while ( t1 < t3 && t2 < t4 ) {
270 if ( *t1 != *t2 )
return(*t2-*t1);
271 if ( t1[1] != t2[1] )
return(t2[1]-t1[1]);
274 if ( t1 < t3 )
return(-1);
275 if ( t2 < t4 )
return(1);
278 else return(*t2-*t1);
280 if ( t1 < tstop1 )
return(-1);
281 if ( t2 < tstop2 )
return(1);
303 static int FirstWarnConvertToPoly = 1;
305 int ConvertToPoly(
PHEAD WORD *term, WORD *outterm, WORD *comlist, WORD par)
307 WORD *tout, *tstop, ncoef, *t, *r, *tt, *ttwo = 0;
314 if ( comlist[2] == DOALL ) {
315 while ( t < tstop ) {
316 if ( *t == SYMBOL ) {
331 i = FindSubterm(tout+1);
334 *tout++ = MAXVARIABLES-i;
341 else if ( *t == DOTPRODUCT ) {
345 tout[1] = DOTPRODUCT;
355 i = FindSubterm(tout+1);
358 *tout++ = MAXVARIABLES-i;
364 else if ( *t == VECTOR ) {
372 i = FindSubterm(tout+1);
375 *tout++ = MAXVARIABLES-i;
381 else if ( *t == INDEX ) {
388 i = FindSubterm(tout+1);
391 *tout++ = MAXVARIABLES-i;
397 else if ( *t == HAAKJE) {
399 tout[0] = 1; tout[1] = 1; tout[2] = 3;
400 *outterm = (tout+3)-outterm;
401 if ( NormPolyTerm(BHEAD outterm) < 0 )
return(-1);
402 tout = outterm + *outterm;
404 i = t[1]; NCOPY(tout,t,i);
409 else if ( *t >= FUNCTION ) {
414 *tout++ = MAXVARIABLES-i;
419 if ( FirstWarnConvertToPoly ) {
420 MLOCK(ErrorMessageLock);
421 MesPrint(
"Illegal object in conversion to polynomial notation");
422 MUNLOCK(ErrorMessageLock);
423 FirstWarnConvertToPoly = 0;
428 NCOPY(tout,tstop,ncoef)
432 if ( ( i = NormPolyTerm(BHEAD ttwo) ) >= 0 ) i = action;
435 *outterm = tout - outterm;
438 *outterm = tout-outterm;
439 if ( ( i = NormPolyTerm(BHEAD outterm) ) >= 0 ) i = action;
442 else if ( comlist[2] == ONLYFUNCTIONS ) {
443 while ( t < tstop ) {
444 if ( *t >= FUNCTION ) {
445 if ( comlist[1] == 3 ) {
450 *tout++ = MAXVARIABLES-i;
455 for ( i = 3; i < comlist[1]; i++ ) {
456 if ( *t == comlist[i] )
break;
458 if ( i < comlist[1] ) {
463 *tout++ = MAXVARIABLES-i;
468 i = t[1]; NCOPY(tout,t,i);
473 i = t[1]; NCOPY(tout,t,i);
476 NCOPY(tout,tstop,ncoef)
477 *outterm = tout-outterm;
478 Normalize(BHEAD outterm);
482 MLOCK(ErrorMessageLock);
483 MesPrint(
"Illegal internal code in conversion to polynomial notation");
484 MUNLOCK(ErrorMessageLock);
510 WORD *tout, *tstop, ncoef, *t, *r, *tt, *ttwo = 0;
517 while ( t < tstop ) {
518 if ( *t == SYMBOL ) {
533 i = FindLocalSubterm(BHEAD tout+1,startebuf);
536 *tout++ = MAXVARIABLES-i;
543 else if ( *t == DOTPRODUCT ) {
547 tout[1] = DOTPRODUCT;
557 i = FindLocalSubterm(BHEAD tout+1,startebuf);
560 *tout++ = MAXVARIABLES-i;
566 else if ( *t == VECTOR ) {
574 i = FindLocalSubterm(BHEAD tout+1,startebuf);
577 *tout++ = MAXVARIABLES-i;
583 else if ( *t == INDEX ) {
590 i = FindLocalSubterm(BHEAD tout+1,startebuf);
593 *tout++ = MAXVARIABLES-i;
599 else if ( *t == HAAKJE) {
601 tout[0] = 1; tout[1] = 1; tout[2] = 3;
602 *outterm = (tout+3)-outterm;
603 if ( NormPolyTerm(BHEAD outterm) < 0 )
return(-1);
604 tout = outterm + *outterm;
606 i = t[1]; NCOPY(tout,t,i);
611 else if ( *t >= FUNCTION ) {
612 i = FindLocalSubterm(BHEAD t,startebuf);
616 *tout++ = MAXVARIABLES-i;
621 if ( FirstWarnConvertToPoly ) {
622 MLOCK(ErrorMessageLock);
623 MesPrint(
"Illegal object in conversion to polynomial notation");
624 MUNLOCK(ErrorMessageLock);
625 FirstWarnConvertToPoly = 0;
630 NCOPY(tout,tstop,ncoef)
634 if ( ( i = NormPolyTerm(BHEAD ttwo) ) >= 0 ) i = action;
637 *outterm = tout - outterm;
640 *outterm = tout-outterm;
641 if ( ( i = NormPolyTerm(BHEAD outterm) ) >= 0 ) i = action;
658 int ConvertFromPoly(
PHEAD WORD *term, WORD *outterm, WORD from, WORD to, WORD offset, WORD par)
660 WORD *tout, *tstop, *tstop1, ncoef, *t, *r, *tt;
718 while ( t < tstop ) {
719 if ( *t == SYMBOL ) {
722 while ( tt < tstop1 ) {
723 if ( ( *tt < MAXVARIABLES - to )
724 || ( *tt >= MAXVARIABLES - from ) ) {
728 *tout++ = SUBEXPRESSION;
729 *tout++ = SUBEXPSIZE;
730 *tout++ = MAXVARIABLES - *tt++ + offset;
732 if ( par ) *tout++ = AT.ebufnum;
733 else *tout++ = AM.sbufnum;
738 *tout++ = SYMBOL; *tout++ = 0;
739 while ( t < tstop1 ) {
740 if ( ( *t < MAXVARIABLES - to )
741 || ( *t >= MAXVARIABLES - from ) ) {
748 if ( r[1] <= 2 ) tout = r;
751 i = t[1]; NCOPY(tout,t,i)
754 NCOPY(tout,tstop,ncoef)
755 *outterm = tout-outterm;
771 WORD FindSubterm(WORD *subterm)
773 WORD old[5], *ss, *term, number;
774 CBUF *C = cbuf + AM.sbufnum;
777 ss = subterm+subterm[1];
781 old[0] = *term; old[1] = ss[0]; old[2] = ss[1]; old[3] = ss[2]; old[4] = ss[3];
782 ss[0] = 1; ss[1] = 1; ss[2] = 3; ss[3] = 0; *term = subterm[1]+4;
791 AddRHS(AM.sbufnum,1);
792 AddNtoC(AM.sbufnum,*term,term);
797 number = InsTree(AM.sbufnum,C->numrhs);
801 if ( number < (C->numrhs) ) {
807 WORD dim = DimensionSubterm(subterm);
809 if ( dim == -MAXPOSITIVE ) {
810 WORD *old = AN.currentTerm;
811 AN.currentTerm = term;
812 MLOCK(ErrorMessageLock);
813 MesPrint(
"Dimension out of range in %t");
814 MUNLOCK(ErrorMessageLock);
815 AN.currentTerm = old;
824 *term = old[0]; ss[0] = old[1]; ss[1] = old[2]; ss[2] = old[3]; ss[3] = old[4];
840 WORD FindLocalSubterm(
PHEAD WORD *subterm, WORD startebuf)
842 WORD old[5], *ss, *term, number, i, j, *t1, *t2;
843 CBUF *C = cbuf + AT.ebufnum;
845 ss = subterm+subterm[1];
849 old[0] = *term; old[1] = ss[0]; old[2] = ss[1]; old[3] = ss[2]; old[4] = ss[3];
850 ss[0] = 1; ss[1] = 1; ss[2] = 3; ss[3] = 0; *term = subterm[1]+4;
854 number = FindTree(AM.sbufnum,term);
855 if ( number > 0 )
goto wearehappy;
860 for ( i = startebuf+1; i <= C->numrhs; i++ ) {
861 t1 = C->
rhs[i]; t2 = term;
864 while ( *t1 == *t2 && j > 0 ) { t1++; t2++; j--; }
866 number = i-startebuf+numxsymbol;
874 AddRHS(AT.ebufnum,1);
875 AddNtoC(AT.ebufnum,*term,term);
877 number = C->numrhs-startebuf+numxsymbol;
879 *term = old[0]; ss[0] = old[1]; ss[1] = old[2]; ss[2] = old[3]; ss[3] = old[4];
893 void PrintSubtermList(
int from,
int to)
895 UBYTE buffer[80], *out, outbuffer[300];
896 int first, i, ii, inc = 1;
898 CBUF *C = cbuf + AM.sbufnum;
909 AO.OutFill = AO.OutputLine = outbuffer;
910 AO.OutStop = AO.OutputLine+AC.LineLength;
914 if ( AC.OutputMode == FORTRANMODE || AC.OutputMode == PFORTRANMODE ) {
915 TokenToLine((UBYTE *)
" ");
918 else if ( ( AO.Optimize.debugflags & 1 ) == 1 ) {}
919 else if ( AO.OutSkip > 0 ) {
920 for ( i = 0; i < AO.OutSkip; i++ ) TokenToLine((UBYTE *)
" ");
924 if ( ( AO.Optimize.debugflags & 1 ) == 1 ) {
925 TokenToLine((UBYTE *)
"id ");
926 for ( ii = 3; ii < AO.OutSkip; ii++ ) TokenToLine((UBYTE *)
" ");
933 else if ( AC.OutputMode == FORTRANMODE || AC.OutputMode == PFORTRANMODE ) {}
934 else { TokenToLine((UBYTE *)
" "); }
936 out = StrCopy((UBYTE *)AC.extrasym,buffer);
937 if ( AC.extrasymbols == 0 ) {
938 out = NumCopy(i,out);
939 out = StrCopy((UBYTE *)
"_",out);
941 else if ( AC.extrasymbols == 1 ) {
942 out = AddArrayIndex(i,out);
944 out = StrCopy((UBYTE *)
"=",out);
949 out = StrCopy((UBYTE *)
"0",buffer);
950 if ( AC.OutputMode != FORTRANMODE && AC.OutputMode != PFORTRANMODE ) {
951 out = StrCopy((UBYTE *)
";",out);
957 if ( WriteInnerTerm(term,first) ) Terminate(-1);
961 if ( AC.OutputMode != FORTRANMODE && AC.OutputMode != PFORTRANMODE ) {
962 out = StrCopy((UBYTE *)
";",buffer);
979 if ( AC.OutputMode == FORTRANMODE || AC.OutputMode == PFORTRANMODE ) {
1005 void PrintExtraSymbol(
int num, WORD *terms,
int par)
1007 UBYTE buffer[80], *out, outbuffer[300];
1011 AO.OutFill = AO.OutputLine = outbuffer;
1012 AO.OutStop = AO.OutputLine+AC.LineLength;
1015 if ( AC.OutputMode == FORTRANMODE || AC.OutputMode == PFORTRANMODE ) {
1016 TokenToLine((UBYTE *)
" ");
1019 else if ( ( AO.Optimize.debugflags & 1 ) == 1 ) {
1020 TokenToLine((UBYTE *)
"id ");
1021 for ( i = 3; i < AO.OutSkip; i++ ) TokenToLine((UBYTE *)
" ");
1023 else if ( AO.OutSkip > 0 ) {
1024 for ( i = 0; i < AO.OutSkip; i++ ) TokenToLine((UBYTE *)
" ");
1029 if ( num >= MAXVARIABLES-cbuf[AM.sbufnum].numrhs ) {
1030 num = MAXVARIABLES-num;
1033 out = StrCopy(VARNAME(symbols,num),out);
1037 out = StrCopy((UBYTE *)AC.extrasym,out);
1038 if ( AC.extrasymbols == 0 ) {
1039 out = NumCopy(num,out);
1040 out = StrCopy((UBYTE *)
"_",out);
1042 else if ( AC.extrasymbols == 1 ) {
1043 out = AddArrayIndex(num,out);
1046 case EXPRESSIONNUMBER:
1047 out = StrCopy(EXPRNAME(num),out);
1050 MesPrint(
"Illegal option in PrintExtraSymbol");
1053 out = StrCopy((UBYTE *)
"=",out);
1054 TokenToLine(buffer);
1058 out = StrCopy((UBYTE *)
"0",buffer);
1059 TokenToLine(buffer);
1063 if ( WriteInnerTerm(term,first) ) Terminate(-1);
1068 if ( AC.OutputMode != FORTRANMODE && AC.OutputMode != PFORTRANMODE ) {
1069 out = StrCopy((UBYTE *)
";",buffer);
1070 TokenToLine(buffer);
1087 WORD FindSubexpression(WORD *subexpr)
1090 CBUF *C = cbuf + AM.sbufnum;
1098 AddRHS(AM.sbufnum,1);
1100 while ( *term ) term += *term;
1101 number = term - subexpr;
1105 AddNtoC(AM.sbufnum,number,subexpr);
1110 number = InsTree(AM.sbufnum,C->numrhs);
1114 if ( number < (C->numrhs) ) {
1120 WORD dim = DimensionExpression(BHEAD subexpr);
1127 UNLOCK(AM.sbuflock);
1137 int ExtraSymFun(
PHEAD WORD *term,WORD level)
1139 WORD *oldworkpointer = AT.WorkPointer;
1140 WORD *termout, *t1, *t2, *t3, *tstop, *tend, i;
1142 tend = termout = term + *term;
1143 tstop = tend - ABS(tend[-1]);
1144 t3 = t1 = term+1; t2 = termout+1;
1148 while ( t1 < tstop ) {
1149 if ( *t1 == EXTRASYMFUN && t1[1] == FUNHEAD+2 ) {
1150 if ( t1[FUNHEAD] == -SNUMBER && t1[FUNHEAD+1] <= numxsymbol
1151 && t1[FUNHEAD+1] > 0 ) {
1154 else if ( t1[FUNHEAD] == -SYMBOL && t1[FUNHEAD+1] < MAXVARIABLES
1155 && t1[FUNHEAD+1] >= MAXVARIABLES-numxsymbol ) {
1156 i = MAXVARIABLES - t1[FUNHEAD+1];
1159 while ( t3 < t1 ) *t2++ = *t3++;
1163 *t2++ = SUBEXPRESSION;
1169 t3 = t1 = t1 + t1[1];
1171 else if ( *t1 == EXTRASYMFUN && t1[1] == FUNHEAD ) {
1172 while ( t3 < t1 ) *t2++ = *t3++;
1173 t3 = t1 = t1 + t1[1];
1180 while ( t3 < tend ) *t2++ = *t3++;
1181 *termout = t2 - termout;
1182 AT.WorkPointer = t2;
1183 if ( AT.WorkPointer >= AT.WorkTop ) {
1184 MLOCK(ErrorMessageLock);
1186 MUNLOCK(ErrorMessageLock);
1187 AT.WorkPointer = oldworkpointer;
1190 retval =
Generator(BHEAD termout,level);
1191 AT.WorkPointer = oldworkpointer;
1193 MLOCK(ErrorMessageLock);
1194 MesCall(
"ExtraSymFun");
1195 MUNLOCK(ErrorMessageLock);
int LocalConvertToPoly(PHEAD WORD *term, WORD *outterm, WORD startebuf, WORD par)
WORD Generator(PHEAD WORD *, WORD)