56int execarg(PHEAD WORD *term, WORD level)
60 WORD *start, *stop, *rstop, *r1, *r2 = 0, *r3 = 0, *r4, *r5, *r6, *r7, *r8, *r9;
61 WORD *mm, *mstop, *rnext, *rr, *factor, type, ngcd, nq;
62 CBUF *C = cbuf+AM.rbufnum, *CC = cbuf+AT.ebufnum;
63 WORD i, j, k, oldnumlhs = AR.Cnumlhs, count, olddefer = AR.DeferFlag;
65 WORD oldnumrhs = CC->numrhs, size, pow, jj;
66 LONG oldcpointer = CC->Pointer - CC->Buffer, oldppointer = AT.pWorkPointer, lp;
67 WORD *oldwork = AT.WorkPointer, *oldwork2, scale, renorm;
68 WORD kLCM = 0, kGCD = 0, kGCD2, kkLCM = 0, jLCM = 0, jGCD, sign = 1;
69 int ii, didpolyratfun;
70 UWORD *EAscrat, *GCDbuffer = 0, *GCDbuffer2 = 0, *LCMbuffer = 0, *LCMb = 0, *LCMc = 0;
71 AT.WorkPointer += *term;
72 start = C->
lhs[level];
73 AR.Cnumlhs = start[2];
74 stop = start + start[1];
78 start += TYPEARGHEADSIZE;
82 if ( renorm && start[1] != 0 ) {
83 t = start+1; factor = oldwork2 = v = AT.WorkPointer;
85 *v++ = i+3; i--; NCOPY(v,t,i);
86 *v++ = 1; *v++ = 1; *v++ = 3;
88 start = t; AR.Eside = LHSIDEX;
90 if (
Generator(BHEAD factor,AR.Cnumlhs) ) {
92 AT.WorkPointer = oldwork;
96 if (
EndSort(BHEAD factor,0) < 0 ) {}
97 if ( *factor && *(factor+*factor) != 0 ) {
98 MLOCK(ErrorMessageLock);
99 MesPrint(
"&$ in () does not evaluate into a single term");
100 MUNLOCK(ErrorMessageLock);
123 rstop = r - ABS(r[-1]);
132 if ( type == TYPENORM4 ) {
133 GCDbuffer = NumberMalloc(
"execarg");
134 GCDbuffer2 = NumberMalloc(
"execarg");
135 LCMbuffer = NumberMalloc(
"execarg");
136 LCMb = NumberMalloc(
"execarg"); LCMc = NumberMalloc(
"execarg");
139 while ( t < rstop ) {
140 if ( *t >= FUNCTION && functions[*t-FUNCTION].spec <= 0 ) {
153 if ( count <= 0 ) { t += t[1];
continue; }
157 for ( i = 1; i <= count; i++ ) {
164 if ( *r == i )
goto RightNum;
173 if ( *t != FLOATFUN || TestFloat(t) == 0 )
191 r1 = SetElements + Sets[m[1]].first;
192 r2 = SetElements + Sets[m[1]].last;
194 if ( *r1++ == *t )
goto HaveTodo;
197 else if ( m[1] == *t )
goto HaveTodo;
210 if ( *t == AR.PolyFun ) didpolyratfun = 1;
214 while ( --j > 0 ) { NEXTARG(r) }
215 if ( ( type == TYPESPLITARG ) || ( type == TYPESPLITFIRSTARG )
216 || ( type == TYPESPLITLASTARG ) ) {
217 if ( *t > FUNCTION && *r > 0 ) {
219 AT.pWorkSpace[AT.pWorkPointer++] = t;
220 AT.pWorkSpace[AT.pWorkPointer++] = r;
224 else if ( type == TYPESPLITARG2 ) {
225 if ( *t > FUNCTION && *r > 0 ) {
227 AT.pWorkSpace[AT.pWorkPointer++] = t;
228 AT.pWorkSpace[AT.pWorkPointer++] = r;
232 else if ( type == TYPEFACTARG || type == TYPEFACTARG2 ) {
233 if ( *t > FUNCTION || *t == DENOMINATOR ) {
235 mm = r + ARGHEAD; mstop = r + *r;
236 if ( mm + *mm < mstop ) {
238 AT.pWorkSpace[AT.pWorkPointer++] = t;
239 AT.pWorkSpace[AT.pWorkPointer++] = r;
242 if ( *mm == 1+ABS(mstop[-1]) )
continue;
243 if ( mstop[-3] != 1 || mstop[-2] != 1
244 || mstop[-1] != 3 ) {
246 AT.pWorkSpace[AT.pWorkPointer++] = t;
247 AT.pWorkSpace[AT.pWorkPointer++] = r;
250 GETSTOP(mm,mstop); mm++;
251 if ( mm + mm[1] < mstop ) {
253 AT.pWorkSpace[AT.pWorkPointer++] = t;
254 AT.pWorkSpace[AT.pWorkPointer++] = r;
257 if ( *mm == SYMBOL && ( mm[1] > 4 ||
258 ( mm[3] != 1 && mm[3] != -1 ) ) ) {
260 AT.pWorkSpace[AT.pWorkPointer++] = t;
261 AT.pWorkSpace[AT.pWorkPointer++] = r;
264 else if ( *mm == DOTPRODUCT && ( mm[1] > 5 ||
265 ( mm[4] != 1 && mm[4] != -1 ) ) ) {
267 AT.pWorkSpace[AT.pWorkPointer++] = t;
268 AT.pWorkSpace[AT.pWorkPointer++] = r;
271 else if ( ( *mm == DELTA || *mm == VECTOR )
274 AT.pWorkSpace[AT.pWorkPointer++] = t;
275 AT.pWorkSpace[AT.pWorkPointer++] = r;
279 else if ( factor && *factor == 4 && factor[2] == 1 ) {
281 AT.pWorkSpace[AT.pWorkPointer++] = t;
282 AT.pWorkSpace[AT.pWorkPointer++] = r;
285 else if ( factor && *factor == 0
286 && ( *r == -SNUMBER && r[1] != 1 ) ) {
288 AT.pWorkSpace[AT.pWorkPointer++] = t;
289 AT.pWorkSpace[AT.pWorkPointer++] = r;
292 else if ( *r == -MINVECTOR ) {
294 AT.pWorkSpace[AT.pWorkPointer++] = t;
295 AT.pWorkSpace[AT.pWorkPointer++] = r;
301 else if ( type == TYPENORM || type == TYPENORM2 || type == TYPENORM3 || type == TYPENORM4 ) {
304 if ( *r == -MINVECTOR ) { rone = -1; *r = -INDEX; }
305 else if ( *r != -SNUMBER || r[1] == 1 || r[1] == 0 )
continue;
306 else { rone = r[1]; r[1] = 1; }
310 if ( scale && ( factor == 0 || *factor ) ) {
314 if ( type == TYPENORM3 ) k = 1;
321 size = REDLENG(size);
323 for ( jj = 0; jj < scale; jj++ ) {
324 if ( Mully(BHEAD (UWORD *)rstop,&size,(UWORD *)(&rone),k) )
329 for ( jj = 0; jj > scale; jj-- ) {
330 if ( Divvy(BHEAD (UWORD *)rstop,&size,(UWORD *)(&rone),k) )
334 size = INCLENG(size);
335 k = size < 0 ? -size: size;
337 *term = (WORD)(rstop - term) + k;
355 if ( type == TYPENORM4 ) {
369 if ( j < 0 ) sign = -1;
373 while ( ( k > 1 ) && ( r3[k-1] == 0 ) ) k--;
374 for ( kGCD = 0; kGCD < k; kGCD++ ) GCDbuffer[kGCD] = r3[kGCD];
378 while ( ( k > 1 ) && ( r3[k-1] == 0 ) ) k--;
379 for ( kLCM = 0; kLCM < k; kLCM++ ) LCMbuffer[kLCM] = r3[kLCM];
390 while ( ( k > 1 ) && ( r3[k-1] == 0 ) ) k--;
391 if ( ( ( GCDbuffer[0] == 1 ) && ( kGCD == 1 ) ) ) {
396 else if ( ( ( k != 1 ) || ( r3[0] != 1 ) ) ) {
397 if ( GcdLong(BHEAD GCDbuffer,kGCD,(UWORD *)r3,k,GCDbuffer2,&kGCD2) ) {
398 NumberFree(GCDbuffer,
"execarg");
399 NumberFree(GCDbuffer2,
"execarg");
400 NumberFree(LCMbuffer,
"execarg");
401 NumberFree(LCMb,
"execarg"); NumberFree(LCMc,
"execarg");
405 for ( ii = 0; ii < kGCD; ii++ ) GCDbuffer[ii] = GCDbuffer2[ii];
408 kGCD = 1; GCDbuffer[0] = 1;
413 while ( ( k > 1 ) && ( r3[k-1] == 0 ) ) k--;
414 if ( ( ( LCMbuffer[0] == 1 ) && ( kLCM == 1 ) ) ) {
415 for ( kLCM = 0; kLCM < k; kLCM++ )
416 LCMbuffer[kLCM] = r3[kLCM];
418 else if ( ( k != 1 ) || ( r3[0] != 1 ) ) {
419 if ( GcdLong(BHEAD LCMbuffer,kLCM,(UWORD *)r3,k,LCMb,&kkLCM) ) {
420 NumberFree(GCDbuffer,
"execarg"); NumberFree(GCDbuffer2,
"execarg");
421 NumberFree(LCMbuffer,
"execarg"); NumberFree(LCMb,
"execarg"); NumberFree(LCMc,
"execarg");
424 DivLong((UWORD *)r3,k,LCMb,kkLCM,LCMb,&kkLCM,LCMc,&jLCM);
425 MulLong(LCMbuffer,kLCM,LCMb,kkLCM,LCMc,&jLCM);
426 for ( kLCM = 0; kLCM < jLCM; kLCM++ )
427 LCMbuffer[kLCM] = LCMc[kLCM];
435 r3 = (WORD *)(GCDbuffer);
436 if ( kGCD == kLCM ) {
437 for ( jGCD = 0; jGCD < kGCD; jGCD++ )
438 r3[jGCD+kGCD] = LCMbuffer[jGCD];
441 else if ( kGCD > kLCM ) {
442 for ( jGCD = 0; jGCD < kLCM; jGCD++ )
443 r3[jGCD+kGCD] = LCMbuffer[jGCD];
444 for ( jGCD = kLCM; jGCD < kGCD; jGCD++ )
449 for ( jGCD = kGCD; jGCD < kLCM; jGCD++ )
451 for ( jGCD = 0; jGCD < kLCM; jGCD++ )
452 r3[jGCD+kLCM] = LCMbuffer[jGCD];
460 if ( scale && ( factor == 0 || *factor > 0 ) )
466 if ( scale && ( factor == 0 || *factor ) ) {
467 size = term[*term-1];
468 size = REDLENG(size);
469 if ( MulRat(BHEAD (UWORD *)rstop,size,(UWORD *)r3,k,
470 (UWORD *)rstop,&size) )
goto execargerr;
471 size = INCLENG(size);
472 k = size < 0 ? -size: size;
473 rstop[k-1] = size*sign;
474 *term = (WORD)(rstop - term) + k;
478 if ( factor && *factor >= 1 ) {
483 r3 = r2 - ABS(r2[-1]);
486 if ( j != *r5 ) { r1 = r2;
continue; }
489 if ( *r5 != *r6 )
break;
492 if ( j > 0 ) { r1 = r2;
continue; }
495 if ( r1 >= r4 )
continue;
500 r3 = r2 - ABS(r2[-1]);
502 if ( *r3 == 1 && r3[1] == 1 ) {
503 if ( r2[-1] == 3 )
continue;
504 if ( r2[-1] == -3 && type == TYPENORM3 )
continue;
511 if ( type == TYPENORM && scale && ( factor == 0 || *factor ) ) {
516 size = term[*term-1];
517 size = REDLENG(size);
519 for ( jj = 0; jj < scale; jj++ ) {
520 if ( MulRat(BHEAD (UWORD *)rstop,size,(UWORD *)r3,k,
521 (UWORD *)rstop,&size) )
goto execargerr;
525 for ( jj = 0; jj > scale; jj-- ) {
526 if ( DivRat(BHEAD (UWORD *)rstop,size,(UWORD *)r3,k,
527 (UWORD *)rstop,&size) )
goto execargerr;
530 size = INCLENG(size);
531 k = size < 0 ? -size: size;
532 rstop[k-1] = size*sign;
533 *term = (WORD)(rstop - term) + k;
540 r4 =
AddRHS(AT.ebufnum,1);
541 while ( (r4+j+12) > CC->Top ) r4 =
DoubleCbuffer(AT.ebufnum,r4,3);
544 for ( k = 0; k < i; k++ ) *r4++ = r3[i+k];
545 for ( k = 0; k < i; k++ ) *r4++ = r3[k];
546 if ( ( type == TYPENORM3 ) || ( type == TYPENORM4 ) ) *r4++ = j*sign;
547 else *r4++ = r3[j-1];
549 CC->rhs[CC->numrhs+1] = r4;
551 AT.mulpat[5] = CC->numrhs;
552 AT.mulpat[7] = AT.ebufnum;
554 else if ( type == TYPEARGTOEXTRASYMBOL ) {
558 WORD tmp[MaX(9,FUNHEAD+5)];
568 tmp[3] = r[1] > 0 ? 3 : -3;
592 tmp[6] = r[0] != -MINVECTOR ? 3 : -3;
596 if ( r[0] <= -FUNCTION ) {
608 MLOCK(ErrorMessageLock);
609 MesPrint(
"Unknown fast notation found (TYPEARGTOEXTRASYMBOL)");
610 MUNLOCK(ErrorMessageLock);
614 n = FindSubexpression(tmp);
622 WORD old_rr0 = r[r[0]];
624 n = FindSubexpression(r+ARGHEAD);
628 if ( AT.WorkPointer+2 > AT.WorkTop ) {
629 MLOCK(ErrorMessageLock);
631 MUNLOCK(ErrorMessageLock);
641 r1[1] = MAXVARIABLES-n;
644 r2 = r + (r[0] > 0 ? r[0] : r[0] <= -FUNCTION ? 1 : 2);
660 while ( --j >= 0 ) *m++ = *r++;
666 if ( type == TYPENORM || type == TYPENORM2 || type == TYPENORM3 || type == TYPENORM4 ) {
667 if ( MultDo(BHEAD r1,AT.mulpat) )
goto execargerr;
668 AT.WorkPointer = r1 + *r1;
670 if (
Generator(BHEAD r1,level) )
goto execargerr;
675 r2 = r + (( *r <= -FUNCTION ) ? 1:2);
679 AT.WorkPointer = r1 + *r1;
685 if ( type == TYPENORM || type == TYPENORM2 || type == TYPENORM3 || type == TYPENORM4 ) {
686 if ( MultDo(BHEAD m,AT.mulpat) )
goto execargerr;
687 AT.WorkPointer = m + *m;
689 if ( (*m != 0 ) &&
Generator(BHEAD m,level) )
goto execargerr;
692 if (
EndSort(BHEAD AT.WorkPointer+ARGHEAD,1) < 0 )
goto execargerr;
693 AR.DeferFlag = olddefer;
697 m = AT.WorkPointer+ARGHEAD;
698 while ( *m ) m += *m;
699 k = WORDDIF(m,AT.WorkPointer);
701 AT.WorkPointer[1] = 0;
702 if ( ToFast(AT.WorkPointer,AT.WorkPointer) ) {
703 if ( *AT.WorkPointer <= -FUNCTION ) k = 1;
707 if ( *r3 > 0 ) j = k - *r3;
708 else if ( *r3 <= -FUNCTION ) j = k - 1;
716 while ( m > AT.WorkPointer ) *--r = *--m;
720 while ( m > r2 ) *--r = *--m;
725 while ( r2 < r1 ) *r++ = *r2++;
732 CC->numrhs = oldnumrhs;
733 CC->Pointer = CC->Buffer + oldcpointer;
741 if ( type == TYPENORM4 ) {
742 NumberFree(GCDbuffer,
"execarg");
743 NumberFree(GCDbuffer2,
"execarg");
744 NumberFree(LCMbuffer,
"execarg");
745 NumberFree(LCMb,
"execarg"); NumberFree(LCMc,
"execarg");
747 if ( didpolyratfun ) {
748 PolyFunDirty(BHEAD term);
755 if ( ( type == TYPESPLITARG || type == TYPESPLITARG2
756 || type == TYPESPLITFIRSTARG || type == TYPESPLITLASTARG ) &&
757 AT.pWorkPointer > oldppointer ) {
759 r1 = AT.WorkPointer + 1;
761 while ( t < rstop ) {
762 if ( lp < AT.pWorkPointer && t == AT.pWorkSpace[lp] ) {
766 r2 = r1;
while ( t < m ) *r1++ = *t++;
770 if ( lp >= AT.pWorkPointer || t != AT.pWorkSpace[lp+1] ) {
771 if ( *t > 0 ) t[1] = 0;
772 while ( t < m ) *r1++ = *t++;
783 if ( type == TYPESPLITFIRSTARG ) {
784 r4 = r1; r5 = t; r7 = oldwork;
785 *r1++ = *t + ARGHEAD;
786 for ( i = 1; i < ARGHEAD; i++ ) *r1++ = 0;
800 if ( ToFast(r4,r4) ) {
802 if ( *r1 > -FUNCTION ) r1++;
808 *r1++ = i+ARGHEAD; *r1++ = 0;
811 if ( ToFast(r4,r4) ) {
813 if ( *r1 > -FUNCTION ) r1++;
820 else if ( type == TYPESPLITLASTARG ) {
821 r4 = r1; r5 = t; r7 = oldwork;
822 *r1++ = *t + ARGHEAD;
823 for ( i = 1; i < ARGHEAD; i++ ) *r1++ = 0;
837 if ( ToFast(r4,r4) ) {
839 if ( *r1 > -FUNCTION ) r1++;
845 *r1++ = i+ARGHEAD; *r1++ = 0;
848 if ( ToFast(r4,r4) ) {
850 if ( *r1 > -FUNCTION ) r1++;
857 else if ( factor == 0 || ( type == TYPESPLITARG2 && *factor == 0 ) ) {
860 *r1++ = *t + ARGHEAD;
861 for ( i = 1; i < ARGHEAD; i++ ) *r1++ = 0;
863 while ( --i >= 0 ) *r1++ = *t++;
864 if ( ToFast(r4,r4) ) {
866 if ( *r1 > -FUNCTION ) r1++;
871 else if ( type == TYPESPLITARG2 ) {
876 WORD *oRepFunList = AN.RepFunList;
877 WORD *oWildMask = AT.WildMask, *oWildValue = AN.WildValue;
878 AN.WildValue = AT.locwildvalue; AT.WildMask = AT.locwildvalue+2;
880 r4 = r1; r5 = t; r7 = oldwork;
881 *r1++ = *t + ARGHEAD;
882 for ( i = 1; i < ARGHEAD; i++ ) *r1++ = 0;
885 AN.UseFindOnly = 0; oldwork2 = AT.WorkPointer;
887 AT.WorkPointer = r1+AN.RepFunNum+2;
889 if ( FindRest(BHEAD t,factor) &&
890 ( AN.UsedOtherFind || FindOnce(BHEAD t,factor) ) ) {
894 else if ( factor[0] == FUNHEAD+1 && factor[1] >= FUNCTION ) {
895 WORD *rr1 = t+1, *rr2 = t+i;
897 while ( rr1 < rr2 ) {
898 if ( *rr1 == factor[1] )
break;
912 AT.WorkPointer = oldwork2;
914 AN.RepFunList = oRepFunList;
917 if ( ToFast(r4,r4) ) {
919 if ( *r1 > -FUNCTION ) r1++;
925 *r1++ = i+ARGHEAD; *r1++ = 0;
928 if ( ToFast(r4,r4) ) {
930 if ( *r1 > -FUNCTION ) r1++;
936 AT.WildMask = oWildMask; AN.WildValue = oWildValue;
943 *r1++ = *t + ARGHEAD;
944 for ( i = 1; i < ARGHEAD; i++ ) *r1++ = 0;
947 r6 = t + *t; r6 -= ABS(r6[-1]);
948 if ( (r6 - t) == *factor ) {
950 for ( ; k > 0; k-- ) {
951 if ( t[k] != factor[k] )
break;
954 j = r3 - t; t += *t;
continue;
957 else if ( (r6 - t) == 1 && *factor == 0 ) {
958 j = r3 - t; t += *t;
continue;
965 if ( ToFast(r4,r4) ) {
967 if ( *r1 > -FUNCTION ) r1++;
972 *r1++ = *t + ARGHEAD;
973 for ( i = 1; i < ARGHEAD; i++ ) *r1++ = 0;
975 while ( --i >= 0 ) *r1++ = *t++;
976 if ( ToFast(r4,r4) ) {
978 if ( *r1 > -FUNCTION ) r1++;
989 while ( t < r ) *r1++ = *t++;
993 while ( t < r ) *r1++ = *t++;
997 while ( --i >= 0 ) *t++ = *m++;
998 if ( AT.WorkPointer < m ) AT.WorkPointer = m;
1004 if ( ( type == TYPEFACTARG || type == TYPEFACTARG2 ) &&
1005 AT.pWorkPointer > oldppointer ) {
1007 r1 = AT.WorkPointer + 1;
1009 while ( t < rstop ) {
1010 if ( lp < AT.pWorkPointer && AT.pWorkSpace[lp] == t ) {
1014 r2 = r1;
while ( t < m ) *r1++ = *t++;
1018 if ( lp >= AT.pWorkPointer || AT.pWorkSpace[lp+1] != t ) {
1019 if ( *t > 0 ) t[1] = 0;
1020 while ( t < m ) *r1++ = *t++;
1029 if ( factor && ( *factor == 0 && *t == -SNUMBER ) ) {
1031 if ( *t == 0 ) *r1++ = *t++;
1032 else { *r1++ = 1; t++; }
1035 else if ( factor && *factor == 4 && factor[2] == 1 ) {
1036 if ( *t == -SNUMBER ) {
1037 if ( factor[3] < 0 || t[1] >= 0 ) {
1038 while ( t < m ) *r1++ = *t++;
1041 *r1++ = -SNUMBER; *r1++ = -1;
1042 *r1++ = *t++; *r1++ = -*t++;
1046 while ( t < m ) *r1++ = *t++;
1047 *r1++ = -SNUMBER; *r1++ = 1;
1051 else if ( *t == -MINVECTOR ) {
1052 if ( AC.OldFactArgFlag == NEWFACTARG ) {
1053 *r1++ = -SNUMBER; *r1++ = -1;
1054 *r1++ = -VECTOR; t++; *r1++ = *t++;
1057 *r1++ = -VECTOR; t++; *r1++ = *t++;
1058 *r1++ = -SNUMBER; *r1++ = -1;
1059 *r1++ = -SNUMBER; *r1++ = 1;
1068 t += ARGHEAD; r5 = t;
1070 if ( r5+*r5 == r3 && factor ) {
1071 if ( *factor == 0 ) {
1073 r9 = r1; *r1++ = 0; *r1++ = 1;
1075 *r1++ = (r6-t)+3; t++;
1076 while ( t < r6 ) *r1++ = *t++;
1077 *r1++ = 1; *r1++ = 1; *r1++ = 3;
1079 if ( ToFast(r9,r9) ) {
1080 if ( *r9 <= -FUNCTION ) r1 = r9+1;
1085 if ( factor[0] == 4 && factor[2] == 1 ) {
1087 r7 = r1; *r1++ = (r6-t)+3+ARGHEAD; *r1++ = 0;
1089 *r1++ = (r6-t)+3; t++;
1090 while ( t < r6 ) *r1++ = *t++;
1091 *r1++ = 1; *r1++ = 1; *r1++ = 3;
1092 if ( ToFast(r7,r7) ) {
1093 if ( *r7 <= -FUNCTION ) r1 = r7+1;
1096 if ( r3[-1] < 0 && factor[3] > 0 ) {
1097 *r1++ = -SNUMBER; *r1++ = -1;
1098 if ( r3[-1] == -3 && r3[-2] == 1
1099 && ( r3[-3] & MAXPOSITIVE ) == r3[-3] ) {
1100 *r1++ = -SNUMBER; *r1++ = r3[-3];
1103 *r1++ = (r3-r6)+1+ARGHEAD;
1107 while ( t < r3 ) *r1++ = *t++;
1112 if ( ( r3[-1] == -3 || r3[-1] == 3 )
1114 && ( r3[-3] & MAXPOSITIVE ) == r3[-3] ) {
1115 *r1++ = -SNUMBER; *r1++ = r3[-3];
1116 if ( r3[-1] < 0 ) r1[-1] = - r1[-1];
1119 *r1++ = (r3-r6)+1+ARGHEAD;
1123 while ( t < r3 ) *r1++ = *t++;
1137 if ( AC.OldFactArgFlag == NEWFACTARG ) {
1138 if ( factor == 0 ) {
1139 WORD *oldworkpointer2 = AT.WorkPointer;
1140 AT.WorkPointer = r1 + AM.MaxTer+FUNHEAD;
1141 if ( ArgFactorize(BHEAD t-ARGHEAD,r1) < 0 ) {
1145 AT.WorkPointer = oldworkpointer2;
1147 while ( *r1 ) { NEXTARG(r1) }
1155 t += *t;
if ( t[-1] > 0 ) { pow = 0;
break; }
1164 EAscrat = (UWORD *)(TermMalloc(
"execarg"));
1165 if ( t + *t == r3 ) {
1166 if ( factor == 0 || *factor > 2 ) {
1168 *r1++ = -SNUMBER; *r1++ = -1;
1171 t += *t; t[-1] = -t[-1];
1174 t = rr; *r1++ = *t++; *r1++ = 1; t++;
1176 while ( t < m ) *r1++ = *t++;
1183 while ( --i >= 0 ) EAscrat[i] = r6[i];
1188 if ( AccumGCD(BHEAD EAscrat,&ngcd,(UWORD *)r6,i) )
goto execargerr;
1189 if ( ngcd == 3 && EAscrat[0] == 1 && EAscrat[1] == 1 )
break;
1196 if ( pow ) ngcd = -ngcd;
1197 t = r5; r9 = r1; *r1++ = t[-ARGHEAD]; *r1++ = 1;
1198 FILLARG(r1); ngcd = REDLENG(ngcd);
1202 while ( r7 < r6) *r1++ = *r7++;
1205 if ( DivRat(BHEAD (UWORD *)r6,i,EAscrat,ngcd,(UWORD *)r1,&nq) )
goto execargerr;
1208 r1 += i; *r1++ = nq; *r8 = r1-r8;
1211 ngcd = INCLENG(ngcd);
1213 if ( factor && *factor == 0 ) {}
1214 else if ( ( factor && factor[0] == 4 && factor[2] == 1
1215 && factor[3] == -3 ) || pow == 0 ) {
1216 r9 = r1; *r1++ = ARGHEAD+2+i; *r1++ = 0;
1217 FILLARG(r1); *r1++ = i+2;
1218 for ( j = 0; j < i; j++ ) *r1++ = EAscrat[j];
1220 if ( ToFast(r9,r9) ) r1 = r9+2;
1222 else if ( factor && factor[0] == 4 && factor[2] == 1
1223 && factor[3] > 0 && pow ) {
1224 if ( ngcd < 0 ) ngcd = -ngcd;
1225 *r1++ = -SNUMBER; *r1++ = -1;
1226 r9 = r1; *r1++ = ARGHEAD+2+i; *r1++ = 0;
1227 FILLARG(r1); *r1++ = i+2;
1228 for ( j = 0; j < i; j++ ) *r1++ = EAscrat[j];
1230 if ( ToFast(r9,r9) ) r1 = r9+2;
1233 if ( ngcd < 0 ) ngcd = -ngcd;
1234 if ( pow ) { *r1++ = -SNUMBER; *r1++ = -1; }
1235 if ( ngcd != 3 || EAscrat[0] != 1 || EAscrat[1] != 1 ) {
1236 r9 = r1; *r1++ = ARGHEAD+2+i; *r1++ = 0;
1237 FILLARG(r1); *r1++ = i+2;
1238 for ( j = 0; j < i; j++ ) *r1++ = EAscrat[j];
1240 if ( ToFast(r9,r9) ) r1 = r9+2;
1265 TermFree(EAscrat,
"execarg");
1274 if ( factor == 0 ) {
1279 if ( *t == SYMBOL ) {
1280 r7 = t; r8 = t + t[1]; t += 2;
1286 GETSTOP(mm,mstop); mm++;
1287 while ( mm < mstop ) {
1288 if ( *mm != SYMBOL ) mm += mm[1];
1291 if ( *mm == SYMBOL ) {
1292 mstop = mm + mm[1]; mm += 2;
1293 while ( *mm != *t && mm < mstop ) mm += 2;
1294 if ( mm >= mstop ) pow = 0;
1295 else if ( pow > 0 && mm[1] > 0 ) {
1296 if ( mm[1] < pow ) pow = mm[1];
1298 else if ( pow < 0 && mm[1] < 0 ) {
1299 if ( mm[1] > pow ) pow = mm[1];
1304 if ( pow == 0 )
break;
1307 if ( pow == 0 ) { t += 2;
continue; }
1311 action = 1; i = pow;
1313 while ( --i >= 0 ) {
1320 *r1++ = 8 + ARGHEAD;
1321 for ( j = 1; j < ARGHEAD; j++ ) *r1++ = 0;
1322 *r1++ = 8; *r1++ = SYMBOL;
1323 *r1++ = 4; *r1++ = *t; *r1++ = -1;
1324 *r1++ = 1; *r1++ = 1; *r1++ = 3;
1334 GETSTOP(mm,mstop); mm++;
1335 while ( mm < mstop ) {
1336 if ( *mm != SYMBOL ) mm += mm[1];
1339 mstop = mm + mm[1]; mm += 2;
1340 while ( mm < mstop && *mm != *t ) mm += 2;
1351 else if ( *t == DOTPRODUCT ) {
1352 r7 = t; r8 = t + t[1]; t += 2;
1358 GETSTOP(mm,mstop); mm++;
1359 while ( mm < mstop ) {
1360 if ( *mm != DOTPRODUCT ) mm += mm[1];
1363 if ( *mm == DOTPRODUCT ) {
1364 mstop = mm + mm[1]; mm += 2;
1365 while ( ( *mm != *t || mm[1] != t[1] )
1366 && mm < mstop ) mm += 3;
1367 if ( mm >= mstop ) pow = 0;
1368 else if ( pow > 0 && mm[2] > 0 ) {
1369 if ( mm[2] < pow ) pow = mm[2];
1371 else if ( pow < 0 && mm[2] < 0 ) {
1372 if ( mm[2] > pow ) pow = mm[2];
1377 if ( pow == 0 )
break;
1380 if ( pow == 0 ) { t += 3;
continue; }
1384 action = 1; i = pow;
1386 while ( --i >= 0 ) {
1387 *r1++ = 9 + ARGHEAD;
1388 for ( j = 1; j < ARGHEAD; j++ ) *r1++ = 0;
1389 *r1++ = 9; *r1++ = DOTPRODUCT;
1390 *r1++ = 5; *r1++ = *t; *r1++ = t[1]; *r1++ = 1;
1391 *r1++ = 1; *r1++ = 1; *r1++ = 3;
1396 *r1++ = 9 + ARGHEAD;
1397 for ( j = 1; j < ARGHEAD; j++ ) *r1++ = 0;
1398 *r1++ = 9; *r1++ = DOTPRODUCT;
1399 *r1++ = 5; *r1++ = *t; *r1++ = t[1]; *r1++ = -1;
1400 *r1++ = 1; *r1++ = 1; *r1++ = 3;
1410 GETSTOP(mm,mstop); mm++;
1411 while ( mm < mstop ) {
1412 if ( *mm != DOTPRODUCT ) mm += mm[1];
1415 mstop = mm + mm[1]; mm += 2;
1416 while ( mm < mstop && ( *mm != *t
1417 || mm[1] != t[1] ) ) mm += 3;
1428 else if ( *t == DELTA || *t == VECTOR ) {
1429 r7 = t; r8 = t + t[1]; t += 2;
1435 GETSTOP(mm,mstop); mm++;
1436 while ( mm < mstop ) {
1437 if ( *mm != *r7 ) mm += mm[1];
1441 mstop = mm + mm[1]; mm += 2;
1442 while ( ( *mm != *t || mm[1] != t[1] )
1443 && mm < mstop ) mm += 2;
1444 if ( mm >= mstop ) pow = 0;
1447 if ( pow == 0 )
break;
1450 if ( pow == 0 ) { t += 2;
continue; }
1455 *r1++ = 8 + ARGHEAD;
1456 for ( j = 1; j < ARGHEAD; j++ ) *r1++ = 0;
1457 *r1++ = 8; *r1++ = *r7;
1458 *r1++ = 4; *r1++ = *t; *r1++ = t[1];
1459 *r1++ = 1; *r1++ = 1; *r1++ = 3;
1466 GETSTOP(mm,mstop); mm++;
1467 while ( mm < mstop ) {
1468 if ( *mm != *r7 ) mm += mm[1];
1471 mstop = mm + mm[1]; mm += 2;
1472 while ( mm < mstop && (
1473 *mm != *t || mm[1] != t[1] ) ) mm += 2;
1474 *mm = mm[1] = NOINDEX;
1477 *t = t[1] = NOINDEX;
1485 else if ( *t == INDEX ) {
1486 r7 = t; r8 = t + t[1]; t += 2;
1492 GETSTOP(mm,mstop); mm++;
1493 while ( mm < mstop ) {
1494 if ( *mm != *r7 ) mm += mm[1];
1498 mstop = mm + mm[1]; mm += 2;
1500 && mm < mstop ) mm++;
1501 if ( mm >= mstop ) pow = 0;
1504 if ( pow == 0 )
break;
1507 if ( pow == 0 ) { t++;
continue; }
1524 if ( *t < 0 ) { *r1++ = -VECTOR; }
1525 else { *r1++ = -INDEX; }
1534 GETSTOP(mm,mstop); mm++;
1535 while ( mm < mstop ) {
1536 if ( *mm != *r7 ) mm += mm[1];
1539 mstop = mm + mm[1]; mm += 2;
1540 while ( mm < mstop &&
1541 *mm != *t ) mm += 1;
1552 else if ( *t >= FUNCTION ) {
1557 if ( *t >= FUNCTION &&
1558 functions[*t-FUNCTION].commute == 0 ) ncom = 0;
1562 while ( mm < t && ( *mm == DUMMYFUN
1563 || *mm == DUMMYTEN ) ) mm += mm[1];
1564 if ( mm < t ) { t += t[1];
continue; }
1566 mm = rnext; pow = 1;
1569 GETSTOP(mm,mstop); mm++;
1570 while ( mm < mstop ) {
1571 if ( *mm == *t && mm[1] == t[1] ) {
1572 for ( i = 2; i < t[1]; i++ ) {
1573 if ( mm[i] != t[i] )
break;
1576 { mm += mm[1];
goto nextmterm; }
1578 if ( ncom && *mm != DUMMYFUN && *mm != DUMMYTEN )
1582 if ( mm >= mstop ) pow = 0;
1583 if ( pow == 0 )
break;
1584nextmterm: mm = mnext;
1586 if ( pow == 0 ) { t += t[1];
continue; }
1591 *r1++ = t[1] + 4 + ARGHEAD;
1592 for ( i = 1; i < ARGHEAD; i++ ) *r1++ = 0;
1594 for ( i = 0; i < t[1]; i++ ) *r1++ = t[i];
1595 *r1++ = 1; *r1++ = 1; *r1++ = 3;
1602 GETSTOP(mm,mstop); mm++;
1603 while ( mm < mstop ) {
1604 if ( *mm == *t && mm[1] == t[1] ) {
1605 for ( i = 2; i < t[1]; i++ ) {
1606 if ( mm[i] != t[i] )
break;
1609 if ( functions[*t-FUNCTION].spec > 0 )
1619nextterm: mm = mnext;
1621 if ( functions[*t-FUNCTION].spec > 0 )
1639 t += *t;
if ( t[-1] > 0 ) { pow = 0;
break; }
1649 EAscrat = (UWORD *)(TermMalloc(
"execarg"));
1650 if ( t + *t == r3 )
goto oneterm;
1654 while ( --i >= 0 ) EAscrat[i] = r6[i];
1659 if ( AccumGCD(BHEAD EAscrat,&ngcd,(UWORD *)r6,i) )
goto execargerr;
1660 if ( ngcd == 3 && EAscrat[0] == 1 && EAscrat[1] == 1 )
break;
1663 if ( ngcd != 3 || EAscrat[0] != 1 || EAscrat[1] != 1 ) {
1664 if ( pow ) ngcd = -ngcd;
1665 t = r5; r9 = r1; *r1++ = t[-ARGHEAD]; *r1++ = 1;
1666 FILLARG(r1); ngcd = REDLENG(ngcd);
1670 while ( r7 < r6) *r1++ = *r7++;
1673 if ( DivRat(BHEAD (UWORD *)r6,i,EAscrat,ngcd,(UWORD *)r1,&nq) )
goto execargerr;
1676 r1 += i; *r1++ = nq; *r8 = r1-r8;
1679 ngcd = INCLENG(ngcd);
1681 if ( factor && *factor == 0 ) {}
1682 else if ( ( factor && factor[0] == 4 && factor[2] == 1
1683 && factor[3] == -3 ) || pow == 0 ) {
1684 r9 = r1; *r1++ = ARGHEAD+2+i; *r1++ = 0;
1685 FILLARG(r1); *r1++ = i+2;
1686 for ( j = 0; j < i; j++ ) *r1++ = EAscrat[j];
1688 if ( ToFast(r9,r9) ) r1 = r9+2;
1690 else if ( factor && factor[0] == 4 && factor[2] == 1
1691 && factor[3] > 0 && pow ) {
1692 if ( ngcd < 0 ) ngcd = -ngcd;
1693 *r1++ = -SNUMBER; *r1++ = -1;
1694 r9 = r1; *r1++ = ARGHEAD+2+i; *r1++ = 0;
1695 FILLARG(r1); *r1++ = i+2;
1696 for ( j = 0; j < i; j++ ) *r1++ = EAscrat[j];
1698 if ( ToFast(r9,r9) ) r1 = r9+2;
1701 if ( ngcd < 0 ) ngcd = -ngcd;
1702 if ( pow ) { *r1++ = -SNUMBER; *r1++ = -1; }
1703 if ( ngcd != 3 || EAscrat[0] != 1 || EAscrat[1] != 1 ) {
1704 r9 = r1; *r1++ = ARGHEAD+2+i; *r1++ = 0;
1705 FILLARG(r1); *r1++ = i+2;
1706 for ( j = 0; j < i; j++ ) *r1++ = EAscrat[j];
1708 if ( ToFast(r9,r9) ) r1 = r9+2;
1717 if ( factor == 0 || *factor > 2 ) {
1719 *r1++ = -SNUMBER; *r1++ = -1;
1722 t += *t; t[-1] = -t[-1];
1725 t = rr; *r1++ = *t++; *r1++ = 1; t++;
1727 while ( t < m ) *r1++ = *t++;
1730 TermFree(EAscrat,
"execarg");
1741 while ( t < r ) *r1++ = *t++;
1745 while ( t < r ) *r1++ = *t++;
1749 while ( --i >= 0 ) *t++ = *m++;
1750 if ( AT.WorkPointer < t ) AT.WorkPointer = t;
1755 AR.Cnumlhs = oldnumlhs;
1756 if ( action && Normalize(BHEAD term) )
goto execargerr;
1757 AT.WorkPointer = oldwork;
1758 if ( AT.WorkPointer < term + *term ) AT.WorkPointer = term + *term;
1759 AT.pWorkPointer = oldppointer;
1762 AT.WorkPointer = oldwork;
1763 AT.pWorkPointer = oldppointer;
1764 MLOCK(ErrorMessageLock);
1766 MUNLOCK(ErrorMessageLock);
1775int execterm(PHEAD WORD *term, WORD level)
1778 CBUF *C = cbuf+AM.rbufnum;
1779 WORD oldnumlhs = AR.Cnumlhs;
1780 WORD maxisat = C->lhs[level][2];
1782 WORD *oldworkpointer = AT.WorkPointer;
1784 WORD olddeferflag = AR.DeferFlag, tryterm = 0;
1787 AR.Cnumlhs = C->lhs[level][3];
1794 AN.FunSorts[AR.sLevel]->PolyFlag = ( AR.PolyFun != 0 ) ? AR.PolyFunType: 0;
1795 if ( AR.PolyFun == 0 ) { AN.FunSorts[AR.sLevel]->PolyFlag = 0; }
1796 else if ( AR.PolyFunType == 1 ) { AN.FunSorts[AR.sLevel]->PolyFlag = 1; }
1797 else if ( AR.PolyFunType == 2 ) {
1798 if ( AR.PolyFunExp == 2 ) AN.FunSorts[AR.sLevel]->PolyFlag = 1;
1799 else AN.FunSorts[AR.sLevel]->PolyFlag = 2;
1804 t1 = oldworkpointer;
1805 i = *term;
while ( --i >= 0 ) *t1++ = *term++;
1806 AT.WorkPointer = t1;
1807 if (
Generator(BHEAD oldworkpointer,level) )
goto exectermerr;
1811 if (
Generator(BHEAD term,level) )
goto exectermerr;
1814 if ( tryterm ) { TermFree(buffer1,
"buffer in sort statement"); tryterm = 0; }
1815 else { M_free((
void *)buffer1,
"buffer in sort statement"); }
1819 if (
EndSort(BHEAD (WORD *)((
void *)(&buffer1)),2) < 0 )
goto exectermerr;
1820 tryterm = AN.tryterm; AN.tryterm = 0;
1822 }
while ( AR.Cnumlhs < maxisat );
1823 AR.Cnumlhs = oldnumlhs;
1824 AR.DeferFlag = olddeferflag;
1827 t1 = oldworkpointer;
1828 i = *term;
while ( --i >= 0 ) *t1++ = *term++;
1829 AT.WorkPointer = t1;
1830 if (
Generator(BHEAD oldworkpointer,level) )
goto exectermerr;
1832 if ( tryterm ) { TermFree(buffer1,
"buffer in term statement"); tryterm = 0; }
1833 else { M_free(buffer1,
"buffer in term statement"); }
1835 AT.WorkPointer = oldworkpointer;
1838 AT.WorkPointer = oldworkpointer;
1839 AR.DeferFlag = olddeferflag;
1840 MLOCK(ErrorMessageLock);
1841 MesCall(
"execterm");
1842 MUNLOCK(ErrorMessageLock);
1851int ArgumentImplode(PHEAD WORD *term, WORD *thelist)
1854 WORD *liststart, *liststop, *inlist;
1855 WORD *w, *t, *tend, *tstop, *tt, *ttstop, *ttt, ncount, i;
1857 liststop = thelist + thelist[1];
1858 liststart = thelist + 2;
1861 tstop = tend - ABS(tend[-1]);
1863 while ( t < tstop ) {
1864 if ( *t >= FUNCTION ) {
1866 while ( inlist < liststop && *inlist != *t ) inlist += inlist[1];
1867 if ( inlist < liststop ) {
1868 tt = t; ttstop = t + t[1]; w = AT.WorkPointer;
1869 for ( i = 0; i < FUNHEAD; i++ ) *w++ = *tt++;
1870 while ( tt < ttstop ) {
1872 if ( *tt == -SNUMBER && tt[1] == 0 ) {
1873 ncount = 1; ttt = tt; tt += 2;
1874 while ( tt < ttstop && *tt == -SNUMBER && tt[1] == 0 ) {
1879 if ( tt < ttstop && *tt == -SNUMBER && ( tt[1] == 1 || tt[1] == -1 ) ) {
1881 *w++ = (ncount+1) * tt[1];
1885 else if ( ( tt[0] == tt[ARGHEAD] + ARGHEAD )
1886 && ( ABS(tt[tt[0]-1]) == 3 )
1887 && ( tt[tt[0]-2] == 1 )
1888 && ( tt[tt[0]-3] == 1 ) ) {
1889 i = *tt; NCOPY(w,tt,i)
1893 else if ( *tt == -SYMBOL ) {
1901 *w++ = ncount+1; *w++ = 1; *w++ = 3;
1905 else if ( *tt <= -FUNCTION ) {
1906 *w++ = ARGHEAD+FUNHEAD+4;
1912 *w++ = ncount+1; *w++ = 1; *w++ = 3;
1916 while ( ttt < tt ) *w++ = *ttt++;
1917 if ( tt < ttstop && *tt == -SNUMBER ) {
1918 *w++ = *tt++; *w++ = *tt++;
1922 else if ( *tt <= -FUNCTION ) {
1925 else if ( *tt < 0 ) {
1930 i = *tt; NCOPY(w,tt,i)
1933 AT.WorkPointer[1] = w - AT.WorkPointer;
1934 while ( tt < tend ) *w++ = *tt++;
1935 ttt = AT.WorkPointer; tt = t;
1936 while ( ttt < w ) *tt++ = *ttt++;
1937 term[0] = tt - term;
1938 AT.WorkPointer = tt;
1939 tend = tt; tstop = tt - ABS(tt[-1]);
1945 if ( Normalize(BHEAD term) )
return(-1);
1955int ArgumentExplode(PHEAD WORD *term, WORD *thelist)
1958 WORD *liststart, *liststop, *inlist, *old;
1959 WORD *w, *t, *tend, *tstop, *tt, *ttstop, *ttt, ncount, i;
1962 liststop = thelist + thelist[1];
1963 liststart = thelist + 2;
1966 tstop = tend - ABS(tend[-1]);
1968 while ( t < tstop ) {
1969 if ( *t >= FUNCTION ) {
1971 while ( inlist < liststop && *inlist != *t ) inlist += inlist[1];
1972 if ( inlist < liststop ) {
1973 tt = t; ttstop = t + t[1]; w = AT.WorkPointer;
1974 for ( i = 0; i < FUNHEAD; i++ ) *w++ = *tt++;
1975 while ( tt < ttstop ) {
1976 if ( *tt == -SNUMBER && tt[1] != 0 ) {
1977 if ( tt[1] < AM.MaxTer/((WORD)
sizeof(WORD)*4)
1978 && tt[1] > -(AM.MaxTer/((WORD)
sizeof(WORD)*4))
1979 && ( tt[1] > 1 || tt[1] < -1 ) ) {
1980 ncount = ABS(tt[1]);
1981 while ( ncount > 1 ) {
1982 *w++ = -SNUMBER; *w++ = 0; ncount--;
1985 if ( tt[1] < 0 ) *w++ = -1;
1991 *w++ = *tt++; *w++ = *tt++;
1994 else if ( *tt <= -FUNCTION ) {
1997 else if ( *tt < 0 ) {
2001 else if ( tt[0] == tt[ARGHEAD]+ARGHEAD ) {
2002 ttt = tt + tt[0] - 1;
2003 i = (ABS(ttt[0])-1)/2;
2005TooMany: old = AN.currentTerm;
2006 AN.currentTerm = term;
2007 MesPrint(
"Too many arguments in output of ArgExplode");
2008 MesPrint(
"Term = %t");
2009 AN.currentTerm = old;
2012 if ( ttt[-1] != 1 )
goto NoExplode;
2014 if ( 2*x > (AT.WorkTop-w)-*term )
goto TooMany;
2016 while ( ncount > 0 ) {
2017 *w++ = -SNUMBER; *w++ = 0; ncount--;
2020 i = *tt; NCOPY(w,tt,i)
2025 i = *tt; NCOPY(w,tt,i)
2028 AT.WorkPointer[1] = w - AT.WorkPointer;
2029 while ( tt < tend ) *w++ = *tt++;
2030 ttt = AT.WorkPointer; tt = t;
2031 while ( ttt < w ) *tt++ = *ttt++;
2032 term[0] = tt - term;
2033 AT.WorkPointer = tt;
2034 tend = tt; tstop = tt - ABS(tt[-1]);
2040 if ( Normalize(BHEAD term) )
return(-1);
2066int ArgFactorize(PHEAD WORD *argin, WORD *argout)
2071 WORD *argfree, *argextra, *argcopy, *t, *tstop, *a, *a1, *a2;
2075 WORD startebuf = cbuf[AT.ebufnum].numrhs,oldword;
2076 WORD oldsorttype = AR.SortType, numargs;
2077 int error = 0, action = 0, i, ii, number, sign = 1;
2084 AR.SortType = SORTHIGHFIRST;
2085 if ( oldsorttype != AR.SortType ) {
2087 oldword = argin[*argin]; argin[*argin] = 0;
2091 if ( AN.ncmod != 0 ) {
2092 if ( AN.ncmod != 1 || ( (WORD)AN.cmod[0] < 0 ) ) {
2093 MLOCK(ErrorMessageLock);
2094 MesPrint(
"Factorization modulus a number, greater than a WORD not implemented.");
2095 MUNLOCK(ErrorMessageLock);
2099 MLOCK(ErrorMessageLock);
2100 MesCall(
"ArgFactorize");
2101 MUNLOCK(ErrorMessageLock);
2104 if ( !*t) { t = tstop;
continue; }
2110 EndSort(BHEAD argin+ARGHEAD,1);
2111 argin[*argin] = oldword;
2121 if ( a1[0] == -SNUMBER && ( a1[1] == 1 || a1[1] == -1 ) ) {
2122 if ( a1[1] == -1 ) { sign = -sign; a1[1] = 1; }
2124 a = t = a1+2;
while ( *t ) NEXTARG(t);
2126 t = a1; NCOPY(t,a,i);
2135 else if ( a1[0] == FUNHEAD+ARGHEAD+4 && a1[ARGHEAD] == FUNHEAD+4
2136 && a1[*a1-1] == 3 && a1[*a1-2] == 1 && a1[*a1-3] == 1
2137 && a1[ARGHEAD+1] >= FUNCTION ) {
2138 a = t = a1+*a1;
while ( *t ) NEXTARG(t);
2140 *a1 = -a1[ARGHEAD+1]; t = a1+1; NCOPY(t,a,i);
2146 if ( argfree == 0 ) {
2149 else if ( argfree[0] == ( argfree[ARGHEAD]+ARGHEAD ) ) {
2150 Normalize(BHEAD argfree+ARGHEAD);
2151 argfree[0] = argfree[ARGHEAD]+ARGHEAD;
2153 if ( ( argfree[0] == ARGHEAD+4 ) && ( argfree[ARGHEAD+3] == 3 )
2154 && ( argfree[ARGHEAD+1] == 1 ) && ( argfree[ARGHEAD+2] == 1 ) ) {
2164 t = argfree+ARGHEAD;
2172 EndSort(BHEAD argfree+ARGHEAD,1);
2173 t = argfree+ARGHEAD;
2174 while ( *t ) t += *t;
2175 *argfree = t - argfree;
2181 if ( ( number =
FindArg(BHEAD argfree) ) != 0 ) {
2182 if ( number > 0 ) t = cbuf[AT.fbufnum].rhs[number-1];
2183 else t = cbuf[AC.ffbufnum].rhs[-number-1];
2195 if ( *tstop == -SNUMBER && tstop[1] == -1 ) {
2196 sign = -sign; ii += 2;
2200 a = argout;
while ( *a ) NEXTARG(a);
2202 if ( sign == -1 ) { *a++ = -SNUMBER; *a++ = -1; *a = 0; sign = 1; }
2208 while ( ii > 0 ) { *--a1 = *--a2; ii--; }
2211 if ( *t == -SNUMBER && t[1] == -1 ) { t += 2; }
2212 else { COPY1ARG(a,t) }
2222 argcopy = TermMalloc(
"argcopy");
2223 for ( i = 0; i <= *argfree; i++ ) argcopy[i] = argfree[i];
2225 tstop = argfree + *argfree;
2228 t = argfree + ARGHEAD;
2229 while ( t < tstop ) {
2230 sumcommu += DoesCommu(t);
2233 if ( sumcommu > 1 ) {
2234 MesPrint(
"ERROR: Cannot factorize an argument with more than one noncommuting object");
2238 t = argfree + ARGHEAD;
2240 while ( t < tstop ) {
2241 if ( ( t[1] != SYMBOL ) && ( *t != (ABS(t[*t-1])+1) ) ) {
2247 t = argfree + ARGHEAD;
2248 argextra = AT.WorkPointer;
2250 while ( t < tstop ) {
2254 AR.SortType = oldsorttype;
2255 TermFree(argcopy,
"argcopy");
2256 if ( argfree != argin ) TermFree(argfree,
"argfree");
2257 MesCall(
"ArgFactorize");
2262 t += *t; argextra += *argextra;
2265 if (
EndSort(BHEAD argfree+ARGHEAD,1) < 0 ) { error = -2;
goto getout; }
2266 t = argfree + ARGHEAD;
2267 while ( *t > 0 ) t += *t;
2268 *argfree = t - argfree;
2276 while ( *a ) NEXTARG(a);
2278 MesCall(
"ArgFactorize");
2287 if ( error == 0 && action ) {
2288 a1 = a; NEXTARG(a1);
2290 CBUF *C = cbuf+AC.cbufnum;
2291 CBUF *CC = cbuf+AT.ebufnum;
2292 WORD *oldworkpointer = AT.WorkPointer;
2293 WORD *argcopy2 = TermMalloc(
"argcopy2"), *a1, *a2;
2294 a1 = a; a2 = argcopy2;
2297 if ( *a1 > -FUNCTION ) *a2++ = *a1++;
2298 *a2++ = *a1++; *a2 = 0;
2303 argextra = AT.WorkPointer;
2305 while ( t < tstop ) {
2306 if ( ConvertFromPoly(BHEAD t,argextra,numxsymbol,CC->numrhs-startebuf+numxsymbol
2307 ,startebuf-numxsymbol,1) <= 0 ) {
2308 TermFree(argcopy2,
"argcopy2");
2314 AT.WorkPointer = argextra + *argextra;
2318 if (
Generator(BHEAD argextra,C->numlhs) ) {
2319 TermFree(argcopy2,
"argcopy2");
2325 AT.WorkPointer = oldworkpointer;
2327 if (
EndSort(BHEAD a2+ARGHEAD,1) < 0 ) { error = -5;
goto getout; }
2328 t = a2+ARGHEAD;
while ( *t ) t += *t;
2329 *a2 = t - a2; a2[1] = 0; ZEROARG(a2);
2330 ToFast(a2,a2); NEXTARG(a2);
2334 a2 = argcopy2; a1 = a;
2337 TermFree(argcopy2,
"argcopy2");
2341 CC->numrhs = startebuf;
2344 for ( i = 0; i <= *argcopy; i++ ) a[i] = argcopy[i];
2354 if ( error == 0 && AN.ncmod == 0 ) {
2355 if (
InsertArg(BHEAD argcopy,a,0) < 0 ) { error = -1; }
2365 for ( i = 0; i < ii; i++ ) argcopy[i] = argout[i];
2368 if ( *a1 == -SNUMBER && a1[1] < 0 ) {
2369 sign = -sign; a1[1] = -a1[1];
2371 a2 = a1+2;
while ( *a2 ) NEXTARG(a2);
2372 i = a2-a1-2; a2 = a1+2;
2376 while ( *a1 ) NEXTARG(a1);
2380 if ( *a1 > 0 && *a1 == a1[ARGHEAD]+ARGHEAD && a1[*a1-1] < 0 ) {
2381 a1[*a1-1] = -a1[*a1-1]; sign = -sign;
2383 if ( *a1 == ARGHEAD+4 && a1[ARGHEAD+1] == 1 && a1[ARGHEAD+2] == 1 ) {
2384 a2 = a1+ARGHEAD+4;
while ( *a2 ) NEXTARG(a2);
2385 i = a2-a1-ARGHEAD-4; a2 = a1+ARGHEAD+4;
2390 while ( *a1 ) NEXTARG(a1);
2398 for ( i = 0; i < ii; i++ ) *a2++ = argcopy[i];
2400 if ( sign == -1 ) { *a2++ = -SNUMBER; *a2++ = -1; sign = 1; }
2403 TermFree(argcopy,
"argcopy");
2405 if ( argfree != argin ) TermFree(argfree,
"argfree");
2406 if ( oldsorttype != AR.SortType ) {
2407 AR.SortType = oldsorttype;
2412 oldword = a[*a]; a[*a] = 0;
2424 else { NEXTARG(a); }
2428 t = argout; numargs = 0;
2432 if ( *tt == ABS(t[-1])+1+ARGHEAD && sign == -1 ) { t[-1] = -t[-1]; sign = 1; }
2433 else if ( *tt == -SNUMBER && sign == -1 ) { tt[1] = -tt[1]; sign = 1; }
2437 *t++ = -SNUMBER; *t++ = -1; *t = 0; sign = 1; numargs++;
2448 t = argout; numargs = 0;
2449 while ( *t && *t != -SNUMBER && ( *t < 0 || ( ABS(t[*t-1]) != *t-1 ) ) ) {
2454 if ( numargs > 1 ) {
2457 x[0] = argout[-FUNHEAD];
2458 x[1] = argout[-FUNHEAD+1];
2459 x[2] = argout[-FUNHEAD+2];
2460 while ( *t ) { NEXTARG(t); }
2461 argout[-FUNHEAD] = SQRTFUNCTION;
2462 argout[-FUNHEAD+1] = t-argout+FUNHEAD;
2463 argout[-FUNHEAD+2] = 0;
2464 AT.WorkPointer = t+1;
2465 Lijst = AT.WorkPointer;
2466 for ( i = 0; i < numargs; i++ ) Lijst[i] = i;
2467 AT.WorkPointer += numargs;
2468 error = Symmetrize(BHEAD argout-FUNHEAD,Lijst,numargs,1,SYMMETRIC);
2469 AT.WorkPointer = Lijst;
2470 argout[-FUNHEAD] = x[0];
2471 argout[-FUNHEAD+1] = x[1];
2472 argout[-FUNHEAD+2] = x[2];
2477 tstop = argout;
while ( *tstop ) { NEXTARG(tstop); }
2478 t = argout; number = 0;
2481 if ( *tt == -SNUMBER ) {
2482 if ( number == 0 )
break;
2484 while ( tt > argout ) { *--t = *--tt; }
2485 argout[0] = -SNUMBER; argout[1] = x[0];
2488 else if ( *tt == ABS(t[-1])+1+ARGHEAD ) {
2489 if ( number == 0 )
break;
2491 for ( i = 0; i < ii; i++ ) tstop[i] = tt[i];
2492 while ( tt > argout ) { *--t = *--tt; }
2493 for ( i = 0; i < ii; i++ ) argout[i] = tstop[i];
2522 if ( AN.ncmod != 0 )
return(0);
2523 number = FindTree(AT.fbufnum,a);
2524 if ( number >= 0 )
return(number+1);
2525 number = FindTree(AC.ffbufnum,a);
2526 if ( number >= 0 )
return(-number-1);
2548 bufnum = AT.fbufnum;
2552 else if ( par == 1 ) {
2553 bufnum = AC.ffbufnum;
2556 else {
return(-1); }
2558 AddNtoC(bufnum,*argin,argin,1);
2560 a = argout;
while ( *a ) NEXTARG(a);
2564 return(InsTree(bufnum,C->numrhs));
2580 CBUF *C = cbuf + bufnum;
2582 LONG *weights = (LONG *)Malloc1(2*(C->numrhs+1)*
sizeof(LONG),
"CleanupArgCache");
2583 LONG w, whalf, *extraweights;
2584 WORD *a, *to, *from;
2586 for ( i = 1; i <= C->numrhs; i++ ) {
2587 weights[i] = ((LONG)i) * (boomlijst[i].
usage);
2592 extraweights = weights+C->numrhs+1;
2594 whalf = weights[C->numrhs/2+1];
2600 for ( i = 1; i <= C->numrhs; i++ ) {
2601 from = C->
rhs[i]; w = ((LONG)i) * (boomlijst[i].
usage);
2603 if ( i < C->numrhs-1 ) {
2608 j = C->
rhs[i+1] - from;
2613 else if ( to == from ) {
2614 to += *to + 1;
while ( *to ) NEXTARG(to); to++;
2617 a = from; a += *a+1;
while ( *a ) NEXTARG(a); a++;
2622 weights[k++] = boomlijst[i].
usage;
2632 ClearTree(AT.fbufnum);
2633 for ( i = 1; i <= k; i++ ) {
2634 InsTree(AT.fbufnum,i);
2635 boomlijst[i].
usage = weights[i];
2640 M_free(weights,
"CleanupArgCache");
2649int ArgSymbolMerge(WORD *t1, WORD *t2)
2651 WORD *t1e = t1+t1[1];
2652 WORD *t2e = t2+t2[1];
2656 while ( t1a < t1e && t2a < t2e ) {
2657 if ( *t1a < *t2a ) {
2658 if ( t1a[1] >= 0 ) {
2660 while ( t3 < t1e ) { t3[-2] = *t3; t3[-1] = t3[1]; t3 += 2; }
2665 else if ( *t1a > *t2a ) {
2666 if ( t2a[1] >= 0 ) t2a += 2;
2669 while ( t3 > t1a ) { *t3 = t3[-2]; t3[1] = t3[-1]; t3 -= 2; }
2676 if ( t2a[1] < t1a[1] ) t1a[1] = t2a[1];
2680 while ( t2a < t2e ) {
2687 while ( t1a < t1e ) {
2688 if ( t1a[1] >= 0 ) {
2690 while ( t3 < t1e ) { t3[-2] = *t3; t3[-1] = t3[1]; t3 += 2; }
2704int ArgDotproductMerge(WORD *t1, WORD *t2)
2706 WORD *t1e = t1+t1[1];
2707 WORD *t2e = t2+t2[1];
2711 while ( t1a < t1e && t2a < t2e ) {
2712 if ( *t1a < *t2a || ( *t1a == *t2a && t1a[1] < t2a[1] ) ) {
2713 if ( t1a[2] >= 0 ) {
2715 while ( t3 < t1e ) { t3[-3] = *t3; t3[-2] = t3[1]; t3[-1] = t3[2]; t3 += 3; }
2720 else if ( *t1a > *t2a || ( *t1a == *t2a && t1a[1] > t2a[1] ) ) {
2721 if ( t2a[2] >= 0 ) t2a += 3;
2724 while ( t3 > t1a ) { *t3 = t3[-3]; t3[1] = t3[-2]; t3[2] = t3[-1]; t3 -= 3; }
2732 if ( t2a[2] < t1a[2] ) t1a[2] = t2a[2];
2736 while ( t2a < t2e ) {
2744 while ( t1a < t1e ) {
2745 if ( t1a[2] >= 0 ) {
2747 while ( t3 < t1e ) { t3[-3] = *t3; t3[-2] = t3[1]; t3[-1] = t3[2]; t3 += 3; }
2775 WORD *t, *rnext, *r1, *r2, *r3, *r5, *r6, *r7, *r8, *r9;
2776 WORD pow, *mm, *mnext, *mstop, *argin2 = argin, *argin3 = argin, *argfree;
2779 r5 = t = argin + ARGHEAD;
2780 r3 = argin + *argin;
2794 if ( *t == DELTA || *t == VECTOR ) {
2795 r7 = t; r8 = t + t[1]; t += 2;
2801 GETSTOP(mm,mstop); mm++;
2802 while ( mm < mstop ) {
2803 if ( *mm != *r7 ) mm += mm[1];
2807 mstop = mm + mm[1]; mm += 2;
2808 while ( ( *mm != *t || mm[1] != t[1] )
2809 && mm < mstop ) mm += 2;
2810 if ( mm >= mstop ) pow = 0;
2813 if ( pow == 0 )
break;
2816 if ( pow == 0 ) { t += 2;
continue; }
2820 *r1++ = 8 + ARGHEAD;
2821 for ( j = 1; j < ARGHEAD; j++ ) *r1++ = 0;
2822 *r1++ = 8; *r1++ = *r7;
2823 *r1++ = 4; *r1++ = *t; *r1++ = t[1];
2824 *r1++ = 1; *r1++ = 1; *r1++ = 3;
2832 GETSTOP(mm,mstop); mm++;
2833 while ( mm < mstop ) {
2834 if ( *mm != *r7 ) mm += mm[1];
2837 mstop = mm + mm[1]; mm += 2;
2838 while ( mm < mstop && (
2839 *mm != *t || mm[1] != t[1] ) ) mm += 2;
2840 *mm = mm[1] = NOINDEX;
2843 *t = t[1] = NOINDEX;
2851 else if ( *t == INDEX ) {
2852 r7 = t; r8 = t + t[1]; t += 2;
2858 GETSTOP(mm,mstop); mm++;
2859 while ( mm < mstop ) {
2860 if ( *mm != *r7 ) mm += mm[1];
2864 mstop = mm + mm[1]; mm += 2;
2866 && mm < mstop ) mm++;
2867 if ( mm >= mstop ) pow = 0;
2870 if ( pow == 0 )
break;
2873 if ( pow == 0 ) { t++;
continue; }
2877 if ( *t < 0 ) { *r1++ = -VECTOR; }
2878 else { *r1++ = -INDEX; }
2888 GETSTOP(mm,mstop); mm++;
2889 while ( mm < mstop ) {
2890 if ( *mm != *r7 ) mm += mm[1];
2893 mstop = mm + mm[1]; mm += 2;
2894 while ( mm < mstop &&
2895 *mm != *t ) mm += 1;
2906 else if ( *t >= FUNCTION ) {
2911 if ( *t >= FUNCTION &&
2912 functions[*t-FUNCTION].commute == 0 ) ncom = 0;
2916 while ( mm < t && ( *mm == DUMMYFUN
2917 || *mm == DUMMYTEN ) ) mm += mm[1];
2918 if ( mm < t ) { t += t[1];
continue; }
2920 mm = rnext; pow = 1;
2923 GETSTOP(mm,mstop); mm++;
2924 while ( mm < mstop ) {
2925 if ( *mm == *t && mm[1] == t[1] ) {
2926 for ( i = 2; i < t[1]; i++ ) {
2927 if ( mm[i] != t[i] )
break;
2930 { mm += mm[1];
goto nextmterm; }
2932 if ( ncom && *mm != DUMMYFUN && *mm != DUMMYTEN )
2936 if ( mm >= mstop ) pow = 0;
2937 if ( pow == 0 )
break;
2938nextmterm: mm = mnext;
2940 if ( pow == 0 ) { t += t[1];
continue; }
2944 *r1++ = t[1] + 4 + ARGHEAD;
2945 for ( i = 1; i < ARGHEAD; i++ ) *r1++ = 0;
2947 for ( i = 0; i < t[1]; i++ ) *r1++ = t[i];
2948 *r1++ = 1; *r1++ = 1; *r1++ = 3;
2956 GETSTOP(mm,mstop); mm++;
2957 while ( mm < mstop ) {
2958 if ( *mm == *t && mm[1] == t[1] ) {
2959 for ( i = 2; i < t[1]; i++ ) {
2960 if ( mm[i] != t[i] )
break;
2963 if ( functions[*t-FUNCTION].spec > 0 )
2973nextterm: mm = mnext;
2975 if ( functions[*t-FUNCTION].spec > 0 )
3001 if ( *t == SYMBOL ) {
3009 *r2++ = SYMBOL; *r2++ = 2;
3011 t = rnext; rnext = rnext + *rnext;
3025 ArgSymbolMerge(r7,r8);
3038 if ( r8[1] < 0 ) { act = 1; pow += -r8[1]*(ARGHEAD+8); }
3039 else { pow += 2*r8[1]; }
3046 t = argin + ARGHEAD;
3052 if ( *t != SYMBOL ) { t += t[1];
continue; }
3053 r8 = r7+2; r9 = t + t[1]; t += 2;
3054 while ( ( t < r9 ) && ( r8 < r2 ) ) {
3056 t[1] -= r8[1]; t += 2; r8 += 2;
3070 r8 = r7+pow; i = r7[1];
3071 while ( --i >= 0 ) r8[i] = r7[i];
3075 for ( i = 0; i < r8[1]; i++ ) { *r1++ = -SYMBOL; *r1++ = *r8; }
3080 argin2 = TermMalloc(
"TakeArgContent2");
3085 r5 = argin2; *r5++ = 0; *r5++ = 0; FILLARG(r5);
3091 *r5++ = *t++ + r7[1];
3092 while ( t < r6 ) *r5++ = *t++;
3093 i = r7[1] - 2; r8 = r7+2;
3094 *r5++ = r7[0]; *r5++ = r7[1];
3095 while ( i > 0 ) { *r5++ = *r8++; *r5++ = -*r8++; i -= 2; }
3096 while ( t < rnext ) *r5++ = *t++;
3097 Normalize(BHEAD r9);
3101 *argin2 = r5-argin2;
3112 if (
EndSort(BHEAD t,0) < 0 )
goto Irreg;
3113 while ( *t ) t += *t;
3114 *argin2 = t - argin2;
3120 r8 = r7+pow; i = r7[1];
3121 while ( --i >= 0 ) r8[i] = r7[i];
3126 for ( i = 0; i < r8[1]; i++ ) { *r1++ = -SYMBOL; *r1++ = *r8; }
3129 for ( i = 0; i < -r8[1]; i++ ) {
3130 *r1++ = ARGHEAD+8; *r1++ = 0;
3132 *r1++ = 8; *r1++ = SYMBOL; *r1++ = 4; *r1++ = *r8;
3133 *r1++ = -1; *r1++ = 1; *r1++ = 1; *r1++ = 3;
3155 if ( *t == DOTPRODUCT ) {
3163 *r2++ = DOTPRODUCT; *r2++ = 2;
3165 t = rnext; rnext = rnext + *rnext;
3179 ArgDotproductMerge(r7,r8);
3192 if ( r8[2] < 0 ) { pow += -r8[2]*(ARGHEAD+9); }
3193 else { pow += r8[2]*(ARGHEAD+9); }
3201 argin3 = TermMalloc(
"TakeArgContent3");
3206 r5 = argin3; *r5++ = 0; *r5++ = 0; FILLARG(r5);
3212 *r5++ = *t++ + r7[1];
3213 while ( t < r6 ) *r5++ = *t++;
3214 i = r7[1] - 2; r8 = r7+2;
3215 *r5++ = r7[0]; *r5++ = r7[1];
3216 while ( i > 0 ) { *r5++ = *r8++; *r5++ = *r8++; *r5++ = -*r8++; i -= 3; }
3217 while ( t < rnext ) *r5++ = *t++;
3218 Normalize(BHEAD r9);
3222 *argin3 = r5-argin3;
3233 if (
EndSort(BHEAD t,0) < 0 )
goto Irreg;
3234 while ( *t ) t += *t;
3235 *argin3 = t - argin3;
3241 r8 = r7+pow; i = r7[1];
3242 while ( --i >= 0 ) r8[i] = r7[i];
3246 for ( i = ABS(r8[2]); i > 0; i-- ) {
3247 *r1++ = ARGHEAD+9; *r1++ = 0; FILLARG(r1);
3248 *r1++ = 9; *r1++ = DOTPRODUCT; *r1++ = 5; *r1++ = *r8;
3249 *r1++ = r8[1]; *r1++ = r8[2] < 0 ? -1: 1;
3250 *r1++ = 1; *r1++ = 1; *r1++ = 3;
3266 t = argin3 + ARGHEAD; pow = 1;
3272 t += *t; t[-1] = -t[-1];
3278 argfree = TermMalloc(
"TakeArgContent1");
3279 if ( AN.cmod != 0 ) {
3280 r1 =
MakeMod(BHEAD argin3,r1,argfree);
3293 if ( argin3 != argin2 ) TermFree(argin3,
"TakeArgContent3");
3294 if ( argin2 != argin ) TermFree(argin2,
"TakeArgContent2");
3297 MesPrint(
"Irregularity while sorting argument in TakeArgContent");
3298 if ( argin3 != argin2 ) TermFree(argin3,
"TakeArgContent3");
3299 if ( argin2 != argin ) TermFree(argin2,
"TakeArgContent2");
3320 UWORD *GCDbuffer, *GCDbuffer2, *LCMbuffer, *LCMb, *LCMc;
3321 WORD *r, *r1, *r2, *r3, *r4, *r5, *rnext, i, k, j;
3322 WORD kGCD, kLCM, kGCD2, kkLCM, jLCM, jGCD;
3323 GCDbuffer = NumberMalloc(
"MakeInteger");
3324 GCDbuffer2 = NumberMalloc(
"MakeInteger");
3325 LCMbuffer = NumberMalloc(
"MakeInteger");
3326 LCMb = NumberMalloc(
"MakeInteger");
3327 LCMc = NumberMalloc(
"MakeInteger");
3328 r4 = argin + *argin;
3329 r = argin + ARGHEAD;
3337 if ( k < 0 ) k = -k;
3338 while ( ( k > 1 ) && ( r3[k-1] == 0 ) ) k--;
3339 for ( kGCD = 0; kGCD < k; kGCD++ ) GCDbuffer[kGCD] = r3[kGCD];
3341 if ( k < 0 ) k = -k;
3343 while ( ( k > 1 ) && ( r3[k-1] == 0 ) ) k--;
3344 for ( kLCM = 0; kLCM < k; kLCM++ ) LCMbuffer[kLCM] = r3[kLCM];
3354 if ( k < 0 ) k = -k;
3355 while ( ( k > 1 ) && ( r3[k-1] == 0 ) ) k--;
3356 if ( ( ( GCDbuffer[0] == 1 ) && ( kGCD == 1 ) ) ) {
3361 else if ( ( ( k != 1 ) || ( r3[0] != 1 ) ) ) {
3362 if ( GcdLong(BHEAD GCDbuffer,kGCD,(UWORD *)r3,k,GCDbuffer2,&kGCD2) ) {
3363 NumberFree(GCDbuffer,
"MakeInteger");
3364 NumberFree(GCDbuffer2,
"MakeInteger");
3365 NumberFree(LCMbuffer,
"MakeInteger");
3366 NumberFree(LCMb,
"MakeInteger"); NumberFree(LCMc,
"MakeInteger");
3367 goto MakeIntegerErr;
3370 for ( i = 0; i < kGCD; i++ ) GCDbuffer[i] = GCDbuffer2[i];
3373 kGCD = 1; GCDbuffer[0] = 1;
3376 if ( k < 0 ) k = -k;
3378 while ( ( k > 1 ) && ( r3[k-1] == 0 ) ) k--;
3379 if ( ( ( LCMbuffer[0] == 1 ) && ( kLCM == 1 ) ) ) {
3380 for ( kLCM = 0; kLCM < k; kLCM++ )
3381 LCMbuffer[kLCM] = r3[kLCM];
3383 else if ( ( k != 1 ) || ( r3[0] != 1 ) ) {
3384 if ( GcdLong(BHEAD LCMbuffer,kLCM,(UWORD *)r3,k,LCMb,&kkLCM) ) {
3385 NumberFree(GCDbuffer,
"MakeInteger"); NumberFree(GCDbuffer2,
"MakeInteger");
3386 NumberFree(LCMbuffer,
"MakeInteger"); NumberFree(LCMb,
"MakeInteger"); NumberFree(LCMc,
"MakeInteger");
3387 goto MakeIntegerErr;
3389 DivLong((UWORD *)r3,k,LCMb,kkLCM,LCMb,&kkLCM,LCMc,&jLCM);
3390 MulLong(LCMbuffer,kLCM,LCMb,kkLCM,LCMc,&jLCM);
3391 for ( kLCM = 0; kLCM < jLCM; kLCM++ )
3392 LCMbuffer[kLCM] = LCMc[kLCM];
3400 r3 = (WORD *)(GCDbuffer);
3401 if ( kGCD == kLCM ) {
3402 for ( jGCD = 0; jGCD < kGCD; jGCD++ )
3403 r3[jGCD+kGCD] = LCMbuffer[jGCD];
3406 else if ( kGCD > kLCM ) {
3407 for ( jGCD = 0; jGCD < kLCM; jGCD++ )
3408 r3[jGCD+kGCD] = LCMbuffer[jGCD];
3409 for ( jGCD = kLCM; jGCD < kGCD; jGCD++ )
3414 for ( jGCD = kGCD; jGCD < kLCM; jGCD++ )
3416 for ( jGCD = 0; jGCD < kLCM; jGCD++ )
3417 r3[jGCD+kLCM] = LCMbuffer[jGCD];
3424 if ( ( j == 3 ) && ( r3[1] == 1 ) && ( (WORD)(r3[0]) > 0 ) ) {
3431 *r1++ = j+1+ARGHEAD; *r1++ = 0; FILLARG(r1);
3432 *r1++ = j+1; r2 = r3;
3433 for ( i = 0; i < k; i++ ) { *r1++ = *r2++; *r1++ = *r2++; }
3441 r2 = argfree + 2; FILLARG(r2)
3447 while ( r < r5 ) *r2++ = *r++;
3449 if ( DivRat(BHEAD (UWORD *)r5,j,GCDbuffer,k,(UWORD *)r2,&i) ) {
3450 goto MakeIntegerErr;
3454 if ( rnext[-1] < 0 ) r2[-1] = -i;
3460 argfree[0] = r2-argfree;
3465 NumberFree(LCMc,
"MakeInteger");
3466 NumberFree(LCMb,
"MakeInteger");
3467 NumberFree(LCMbuffer,
"MakeInteger");
3468 NumberFree(GCDbuffer2,
"MakeInteger");
3469 NumberFree(GCDbuffer,
"MakeInteger");
3473 MesCall(
"MakeInteger");
3489WORD *
MakeMod(PHEAD WORD *argin,WORD *argout,WORD *argfree)
3491 WORD *r, *instop, *r1, *m, x, xx, ix, ip;
3493 r = argin; instop = r + *r; r += ARGHEAD;
3495 if ( r[*r-1] < 0 ) x += AN.cmod[0];
3499 argout[0] = -SNUMBER;
3508 m = argfree + ARGHEAD;
3509 while ( r < instop ) {
3510 xx = r[*r-3];
if ( r[*r-1] < 0 ) xx += AN.cmod[0];
3511 xx = (WORD)((((LONG)xx)*ix) % AN.cmod[0]);
3513 i = *r; NCOPY(m,r,i);
3514 m[-3] = xx; m[-1] = 3;
3519 *argfree = m - argfree;
3521 argfree += 2; FILLARG(argfree);
3536 LONG w, *fill, *from1, *from2;
3538 if ( number >= 4 ) {
3539 n1 = number/2; n2 = number - n1;
3546 for ( i = 0; i < n1; i++ ) extraspace[i] = weights[i];
3547 fill = weights; from1 = extraspace; from2 = weights+n1;
3548 while ( n1 > 0 && n2 > 0 ) {
3549 if ( *from1 <= *from2 ) { *fill++ = *from1++; n1--; }
3550 else { *fill++ = *from2++; n2--; }
3552 while ( n1 > 0 ) { *fill++ = *from1++; n1--; }
3557 else if ( number == 3 ) {
3558 if ( weights[0] > weights[1] ) {
3559 if ( weights[1] > weights[2] ) {
3560 w = weights[0]; weights[0] = weights[2]; weights[2] = w;
3562 else if ( weights[0] > weights[2] ) {
3563 w = weights[0]; weights[0] = weights[1];
3564 weights[1] = weights[2]; weights[2] = w;
3567 w = weights[0]; weights[0] = weights[1]; weights[1] = w;
3570 else if ( weights[0] > weights[2] ) {
3571 w = weights[0]; weights[0] = weights[2];
3572 weights[2] = weights[1]; weights[1] = w;
3574 else if ( weights[1] > weights[2] ) {
3575 w = weights[1]; weights[1] = weights[2]; weights[2] = w;
3578 else if ( number == 2 ) {
3579 if ( weights[0] > weights[1] ) {
3580 w = weights[0]; weights[0] = weights[1]; weights[1] = w;
WORD * TakeArgContent(PHEAD WORD *argin, WORD *argout)
WORD * MakeMod(PHEAD WORD *argin, WORD *argout, WORD *argfree)
int CleanupArgCache(PHEAD WORD bufnum)
WORD * MakeInteger(PHEAD WORD *argin, WORD *argout, WORD *argfree)
int InsertArg(PHEAD WORD *argin, WORD *argout, int par)
void SortWeights(LONG *weights, LONG *extraspace, WORD number)
WORD FindArg(PHEAD WORD *a)
int LocalConvertToPoly(PHEAD WORD *, WORD *, WORD, WORD)
LONG EndSort(PHEAD WORD *, int)
#define ZeroFillRange(w, begin, end)
int Generator(PHEAD WORD *, WORD)
void LowerSortLevel(void)
int StoreTerm(PHEAD WORD *)
int poly_factorize_argument(PHEAD WORD *, WORD *)
int GetModInverses(WORD, WORD, WORD *, WORD *)