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 ) {
609 MLOCK(ErrorMessageLock);
610 MesPrint(
"!>Unknown fast notation found (TYPEARGTOEXTRASYMBOL)");
611 MUNLOCK(ErrorMessageLock);
616 n = FindSubexpression(tmp);
624 WORD old_rr0 = r[r[0]];
626 n = FindSubexpression(r+ARGHEAD);
630 if ( AT.WorkPointer+2 > AT.WorkTop ) {
631 MLOCK(ErrorMessageLock);
633 MUNLOCK(ErrorMessageLock);
643 r1[1] = MAXVARIABLES-n;
646 r2 = r + (r[0] > 0 ? r[0] : r[0] <= -FUNCTION ? 1 : 2);
662 while ( --j >= 0 ) *m++ = *r++;
668 if ( type == TYPENORM || type == TYPENORM2 || type == TYPENORM3 || type == TYPENORM4 ) {
669 if ( MultDo(BHEAD r1,AT.mulpat) )
goto execargerr;
670 AT.WorkPointer = r1 + *r1;
672 if (
Generator(BHEAD r1,level) )
goto execargerr;
677 r2 = r + (( *r <= -FUNCTION ) ? 1:2);
681 AT.WorkPointer = r1 + *r1;
687 if ( type == TYPENORM || type == TYPENORM2 || type == TYPENORM3 || type == TYPENORM4 ) {
688 if ( MultDo(BHEAD m,AT.mulpat) )
goto execargerr;
689 AT.WorkPointer = m + *m;
691 if ( (*m != 0 ) &&
Generator(BHEAD m,level) )
goto execargerr;
694 if (
EndSort(BHEAD AT.WorkPointer+ARGHEAD,1) < 0 )
goto execargerr;
695 AR.DeferFlag = olddefer;
699 m = AT.WorkPointer+ARGHEAD;
700 while ( *m ) m += *m;
701 k = WORDDIF(m,AT.WorkPointer);
703 AT.WorkPointer[1] = 0;
704 if ( ToFast(AT.WorkPointer,AT.WorkPointer) ) {
705 if ( *AT.WorkPointer <= -FUNCTION ) k = 1;
709 if ( *r3 > 0 ) j = k - *r3;
710 else if ( *r3 <= -FUNCTION ) j = k - 1;
718 while ( m > AT.WorkPointer ) *--r = *--m;
722 while ( m > r2 ) *--r = *--m;
727 while ( r2 < r1 ) *r++ = *r2++;
734 CC->numrhs = oldnumrhs;
735 CC->Pointer = CC->Buffer + oldcpointer;
743 if ( type == TYPENORM4 ) {
744 NumberFree(GCDbuffer,
"execarg");
745 NumberFree(GCDbuffer2,
"execarg");
746 NumberFree(LCMbuffer,
"execarg");
747 NumberFree(LCMb,
"execarg"); NumberFree(LCMc,
"execarg");
749 if ( didpolyratfun ) {
750 PolyFunDirty(BHEAD term);
757 if ( ( type == TYPESPLITARG || type == TYPESPLITARG2
758 || type == TYPESPLITFIRSTARG || type == TYPESPLITLASTARG ) &&
759 AT.pWorkPointer > oldppointer ) {
761 r1 = AT.WorkPointer + 1;
763 while ( t < rstop ) {
764 if ( lp < AT.pWorkPointer && t == AT.pWorkSpace[lp] ) {
768 r2 = r1;
while ( t < m ) *r1++ = *t++;
772 if ( lp >= AT.pWorkPointer || t != AT.pWorkSpace[lp+1] ) {
773 if ( *t > 0 ) t[1] = 0;
774 while ( t < m ) *r1++ = *t++;
785 if ( type == TYPESPLITFIRSTARG ) {
786 r4 = r1; r5 = t; r7 = oldwork;
787 *r1++ = *t + ARGHEAD;
788 for ( i = 1; i < ARGHEAD; i++ ) *r1++ = 0;
802 if ( ToFast(r4,r4) ) {
804 if ( *r1 > -FUNCTION ) r1++;
810 *r1++ = i+ARGHEAD; *r1++ = 0;
813 if ( ToFast(r4,r4) ) {
815 if ( *r1 > -FUNCTION ) r1++;
822 else if ( type == TYPESPLITLASTARG ) {
823 r4 = r1; r5 = t; r7 = oldwork;
824 *r1++ = *t + ARGHEAD;
825 for ( i = 1; i < ARGHEAD; i++ ) *r1++ = 0;
839 if ( ToFast(r4,r4) ) {
841 if ( *r1 > -FUNCTION ) r1++;
847 *r1++ = i+ARGHEAD; *r1++ = 0;
850 if ( ToFast(r4,r4) ) {
852 if ( *r1 > -FUNCTION ) r1++;
859 else if ( factor == 0 || ( type == TYPESPLITARG2 && *factor == 0 ) ) {
862 *r1++ = *t + ARGHEAD;
863 for ( i = 1; i < ARGHEAD; i++ ) *r1++ = 0;
865 while ( --i >= 0 ) *r1++ = *t++;
866 if ( ToFast(r4,r4) ) {
868 if ( *r1 > -FUNCTION ) r1++;
873 else if ( type == TYPESPLITARG2 ) {
878 WORD *oRepFunList = AN.RepFunList;
879 WORD *oWildMask = AT.WildMask, *oWildValue = AN.WildValue;
880 AN.WildValue = AT.locwildvalue; AT.WildMask = AT.locwildvalue+2;
882 r4 = r1; r5 = t; r7 = oldwork;
883 *r1++ = *t + ARGHEAD;
884 for ( i = 1; i < ARGHEAD; i++ ) *r1++ = 0;
887 AN.UseFindOnly = 0; oldwork2 = AT.WorkPointer;
889 AT.WorkPointer = r1+AN.RepFunNum+2;
891 if ( FindRest(BHEAD t,factor) &&
892 ( AN.UsedOtherFind || FindOnce(BHEAD t,factor) ) ) {
896 else if ( factor[0] == FUNHEAD+1 && factor[1] >= FUNCTION ) {
897 WORD *rr1 = t+1, *rr2 = t+i;
899 while ( rr1 < rr2 ) {
900 if ( *rr1 == factor[1] )
break;
914 AT.WorkPointer = oldwork2;
916 AN.RepFunList = oRepFunList;
919 if ( ToFast(r4,r4) ) {
921 if ( *r1 > -FUNCTION ) r1++;
927 *r1++ = i+ARGHEAD; *r1++ = 0;
930 if ( ToFast(r4,r4) ) {
932 if ( *r1 > -FUNCTION ) r1++;
938 AT.WildMask = oWildMask; AN.WildValue = oWildValue;
945 *r1++ = *t + ARGHEAD;
946 for ( i = 1; i < ARGHEAD; i++ ) *r1++ = 0;
949 r6 = t + *t; r6 -= ABS(r6[-1]);
950 if ( (r6 - t) == *factor ) {
952 for ( ; k > 0; k-- ) {
953 if ( t[k] != factor[k] )
break;
956 j = r3 - t; t += *t;
continue;
959 else if ( (r6 - t) == 1 && *factor == 0 ) {
960 j = r3 - t; t += *t;
continue;
967 if ( ToFast(r4,r4) ) {
969 if ( *r1 > -FUNCTION ) r1++;
974 *r1++ = *t + ARGHEAD;
975 for ( i = 1; i < ARGHEAD; i++ ) *r1++ = 0;
977 while ( --i >= 0 ) *r1++ = *t++;
978 if ( ToFast(r4,r4) ) {
980 if ( *r1 > -FUNCTION ) r1++;
991 while ( t < r ) *r1++ = *t++;
995 while ( t < r ) *r1++ = *t++;
999 while ( --i >= 0 ) *t++ = *m++;
1000 if ( AT.WorkPointer < m ) AT.WorkPointer = m;
1006 if ( ( type == TYPEFACTARG || type == TYPEFACTARG2 ) &&
1007 AT.pWorkPointer > oldppointer ) {
1009 r1 = AT.WorkPointer + 1;
1011 while ( t < rstop ) {
1012 if ( lp < AT.pWorkPointer && AT.pWorkSpace[lp] == t ) {
1016 r2 = r1;
while ( t < m ) *r1++ = *t++;
1020 if ( lp >= AT.pWorkPointer || AT.pWorkSpace[lp+1] != t ) {
1021 if ( *t > 0 ) t[1] = 0;
1022 while ( t < m ) *r1++ = *t++;
1031 if ( factor && ( *factor == 0 && *t == -SNUMBER ) ) {
1033 if ( *t == 0 ) *r1++ = *t++;
1034 else { *r1++ = 1; t++; }
1037 else if ( factor && *factor == 4 && factor[2] == 1 ) {
1038 if ( *t == -SNUMBER ) {
1039 if ( factor[3] < 0 || t[1] >= 0 ) {
1040 while ( t < m ) *r1++ = *t++;
1043 *r1++ = -SNUMBER; *r1++ = -1;
1044 *r1++ = *t++; *r1++ = -*t++;
1048 while ( t < m ) *r1++ = *t++;
1049 *r1++ = -SNUMBER; *r1++ = 1;
1053 else if ( *t == -MINVECTOR ) {
1054 if ( AC.OldFactArgFlag == NEWFACTARG ) {
1055 *r1++ = -SNUMBER; *r1++ = -1;
1056 *r1++ = -VECTOR; t++; *r1++ = *t++;
1059 *r1++ = -VECTOR; t++; *r1++ = *t++;
1060 *r1++ = -SNUMBER; *r1++ = -1;
1061 *r1++ = -SNUMBER; *r1++ = 1;
1070 t += ARGHEAD; r5 = t;
1072 if ( r5+*r5 == r3 && factor ) {
1073 if ( *factor == 0 ) {
1075 r9 = r1; *r1++ = 0; *r1++ = 1;
1077 *r1++ = (r6-t)+3; t++;
1078 while ( t < r6 ) *r1++ = *t++;
1079 *r1++ = 1; *r1++ = 1; *r1++ = 3;
1081 if ( ToFast(r9,r9) ) {
1082 if ( *r9 <= -FUNCTION ) r1 = r9+1;
1087 if ( factor[0] == 4 && factor[2] == 1 ) {
1089 r7 = r1; *r1++ = (r6-t)+3+ARGHEAD; *r1++ = 0;
1091 *r1++ = (r6-t)+3; t++;
1092 while ( t < r6 ) *r1++ = *t++;
1093 *r1++ = 1; *r1++ = 1; *r1++ = 3;
1094 if ( ToFast(r7,r7) ) {
1095 if ( *r7 <= -FUNCTION ) r1 = r7+1;
1098 if ( r3[-1] < 0 && factor[3] > 0 ) {
1099 *r1++ = -SNUMBER; *r1++ = -1;
1100 if ( r3[-1] == -3 && r3[-2] == 1
1101 && ( r3[-3] & MAXPOSITIVE ) == r3[-3] ) {
1102 *r1++ = -SNUMBER; *r1++ = r3[-3];
1105 *r1++ = (r3-r6)+1+ARGHEAD;
1109 while ( t < r3 ) *r1++ = *t++;
1114 if ( ( r3[-1] == -3 || r3[-1] == 3 )
1116 && ( r3[-3] & MAXPOSITIVE ) == r3[-3] ) {
1117 *r1++ = -SNUMBER; *r1++ = r3[-3];
1118 if ( r3[-1] < 0 ) r1[-1] = - r1[-1];
1121 *r1++ = (r3-r6)+1+ARGHEAD;
1125 while ( t < r3 ) *r1++ = *t++;
1139 if ( AC.OldFactArgFlag == NEWFACTARG ) {
1140 if ( factor == 0 ) {
1141 WORD *oldworkpointer2 = AT.WorkPointer;
1142 AT.WorkPointer = r1 + AM.MaxTer+FUNHEAD;
1143 if ( ArgFactorize(BHEAD t-ARGHEAD,r1) < 0 ) {
1147 AT.WorkPointer = oldworkpointer2;
1149 while ( *r1 ) { NEXTARG(r1) }
1157 t += *t;
if ( t[-1] > 0 ) { pow = 0;
break; }
1166 EAscrat = (UWORD *)(TermMalloc(
"execarg"));
1167 if ( t + *t == r3 ) {
1168 if ( factor == 0 || *factor > 2 ) {
1170 *r1++ = -SNUMBER; *r1++ = -1;
1173 t += *t; t[-1] = -t[-1];
1176 t = rr; *r1++ = *t++; *r1++ = 1; t++;
1178 while ( t < m ) *r1++ = *t++;
1185 while ( --i >= 0 ) EAscrat[i] = r6[i];
1190 if ( AccumGCD(BHEAD EAscrat,&ngcd,(UWORD *)r6,i) )
goto execargerr;
1191 if ( ngcd == 3 && EAscrat[0] == 1 && EAscrat[1] == 1 )
break;
1198 if ( pow ) ngcd = -ngcd;
1199 t = r5; r9 = r1; *r1++ = t[-ARGHEAD]; *r1++ = 1;
1200 FILLARG(r1); ngcd = REDLENG(ngcd);
1204 while ( r7 < r6) *r1++ = *r7++;
1207 if ( DivRat(BHEAD (UWORD *)r6,i,EAscrat,ngcd,(UWORD *)r1,&nq) )
goto execargerr;
1210 r1 += i; *r1++ = nq; *r8 = r1-r8;
1213 ngcd = INCLENG(ngcd);
1215 if ( factor && *factor == 0 ) {}
1216 else if ( ( factor && factor[0] == 4 && factor[2] == 1
1217 && factor[3] == -3 ) || pow == 0 ) {
1218 r9 = r1; *r1++ = ARGHEAD+2+i; *r1++ = 0;
1219 FILLARG(r1); *r1++ = i+2;
1220 for ( j = 0; j < i; j++ ) *r1++ = EAscrat[j];
1222 if ( ToFast(r9,r9) ) r1 = r9+2;
1224 else if ( factor && factor[0] == 4 && factor[2] == 1
1225 && factor[3] > 0 && pow ) {
1226 if ( ngcd < 0 ) ngcd = -ngcd;
1227 *r1++ = -SNUMBER; *r1++ = -1;
1228 r9 = r1; *r1++ = ARGHEAD+2+i; *r1++ = 0;
1229 FILLARG(r1); *r1++ = i+2;
1230 for ( j = 0; j < i; j++ ) *r1++ = EAscrat[j];
1232 if ( ToFast(r9,r9) ) r1 = r9+2;
1235 if ( ngcd < 0 ) ngcd = -ngcd;
1236 if ( pow ) { *r1++ = -SNUMBER; *r1++ = -1; }
1237 if ( ngcd != 3 || EAscrat[0] != 1 || EAscrat[1] != 1 ) {
1238 r9 = r1; *r1++ = ARGHEAD+2+i; *r1++ = 0;
1239 FILLARG(r1); *r1++ = i+2;
1240 for ( j = 0; j < i; j++ ) *r1++ = EAscrat[j];
1242 if ( ToFast(r9,r9) ) r1 = r9+2;
1267 TermFree(EAscrat,
"execarg");
1276 if ( factor == 0 ) {
1281 if ( *t == SYMBOL ) {
1282 r7 = t; r8 = t + t[1]; t += 2;
1288 GETSTOP(mm,mstop); mm++;
1289 while ( mm < mstop ) {
1290 if ( *mm != SYMBOL ) mm += mm[1];
1293 if ( *mm == SYMBOL ) {
1294 mstop = mm + mm[1]; mm += 2;
1295 while ( *mm != *t && mm < mstop ) mm += 2;
1296 if ( mm >= mstop ) pow = 0;
1297 else if ( pow > 0 && mm[1] > 0 ) {
1298 if ( mm[1] < pow ) pow = mm[1];
1300 else if ( pow < 0 && mm[1] < 0 ) {
1301 if ( mm[1] > pow ) pow = mm[1];
1306 if ( pow == 0 )
break;
1309 if ( pow == 0 ) { t += 2;
continue; }
1313 action = 1; i = pow;
1315 while ( --i >= 0 ) {
1322 *r1++ = 8 + ARGHEAD;
1323 for ( j = 1; j < ARGHEAD; j++ ) *r1++ = 0;
1324 *r1++ = 8; *r1++ = SYMBOL;
1325 *r1++ = 4; *r1++ = *t; *r1++ = -1;
1326 *r1++ = 1; *r1++ = 1; *r1++ = 3;
1336 GETSTOP(mm,mstop); mm++;
1337 while ( mm < mstop ) {
1338 if ( *mm != SYMBOL ) mm += mm[1];
1341 mstop = mm + mm[1]; mm += 2;
1342 while ( mm < mstop && *mm != *t ) mm += 2;
1353 else if ( *t == DOTPRODUCT ) {
1354 r7 = t; r8 = t + t[1]; t += 2;
1360 GETSTOP(mm,mstop); mm++;
1361 while ( mm < mstop ) {
1362 if ( *mm != DOTPRODUCT ) mm += mm[1];
1365 if ( *mm == DOTPRODUCT ) {
1366 mstop = mm + mm[1]; mm += 2;
1367 while ( ( *mm != *t || mm[1] != t[1] )
1368 && mm < mstop ) mm += 3;
1369 if ( mm >= mstop ) pow = 0;
1370 else if ( pow > 0 && mm[2] > 0 ) {
1371 if ( mm[2] < pow ) pow = mm[2];
1373 else if ( pow < 0 && mm[2] < 0 ) {
1374 if ( mm[2] > pow ) pow = mm[2];
1379 if ( pow == 0 )
break;
1382 if ( pow == 0 ) { t += 3;
continue; }
1386 action = 1; i = pow;
1388 while ( --i >= 0 ) {
1389 *r1++ = 9 + ARGHEAD;
1390 for ( j = 1; j < ARGHEAD; j++ ) *r1++ = 0;
1391 *r1++ = 9; *r1++ = DOTPRODUCT;
1392 *r1++ = 5; *r1++ = *t; *r1++ = t[1]; *r1++ = 1;
1393 *r1++ = 1; *r1++ = 1; *r1++ = 3;
1398 *r1++ = 9 + ARGHEAD;
1399 for ( j = 1; j < ARGHEAD; j++ ) *r1++ = 0;
1400 *r1++ = 9; *r1++ = DOTPRODUCT;
1401 *r1++ = 5; *r1++ = *t; *r1++ = t[1]; *r1++ = -1;
1402 *r1++ = 1; *r1++ = 1; *r1++ = 3;
1412 GETSTOP(mm,mstop); mm++;
1413 while ( mm < mstop ) {
1414 if ( *mm != DOTPRODUCT ) mm += mm[1];
1417 mstop = mm + mm[1]; mm += 2;
1418 while ( mm < mstop && ( *mm != *t
1419 || mm[1] != t[1] ) ) mm += 3;
1430 else if ( *t == DELTA || *t == VECTOR ) {
1431 r7 = t; r8 = t + t[1]; t += 2;
1437 GETSTOP(mm,mstop); mm++;
1438 while ( mm < mstop ) {
1439 if ( *mm != *r7 ) mm += mm[1];
1443 mstop = mm + mm[1]; mm += 2;
1444 while ( ( *mm != *t || mm[1] != t[1] )
1445 && mm < mstop ) mm += 2;
1446 if ( mm >= mstop ) pow = 0;
1449 if ( pow == 0 )
break;
1452 if ( pow == 0 ) { t += 2;
continue; }
1457 *r1++ = 8 + ARGHEAD;
1458 for ( j = 1; j < ARGHEAD; j++ ) *r1++ = 0;
1459 *r1++ = 8; *r1++ = *r7;
1460 *r1++ = 4; *r1++ = *t; *r1++ = t[1];
1461 *r1++ = 1; *r1++ = 1; *r1++ = 3;
1468 GETSTOP(mm,mstop); mm++;
1469 while ( mm < mstop ) {
1470 if ( *mm != *r7 ) mm += mm[1];
1473 mstop = mm + mm[1]; mm += 2;
1474 while ( mm < mstop && (
1475 *mm != *t || mm[1] != t[1] ) ) mm += 2;
1476 *mm = mm[1] = NOINDEX;
1479 *t = t[1] = NOINDEX;
1487 else if ( *t == INDEX ) {
1488 r7 = t; r8 = t + t[1]; t += 2;
1494 GETSTOP(mm,mstop); mm++;
1495 while ( mm < mstop ) {
1496 if ( *mm != *r7 ) mm += mm[1];
1500 mstop = mm + mm[1]; mm += 2;
1502 && mm < mstop ) mm++;
1503 if ( mm >= mstop ) pow = 0;
1506 if ( pow == 0 )
break;
1509 if ( pow == 0 ) { t++;
continue; }
1526 if ( *t < 0 ) { *r1++ = -VECTOR; }
1527 else { *r1++ = -INDEX; }
1536 GETSTOP(mm,mstop); mm++;
1537 while ( mm < mstop ) {
1538 if ( *mm != *r7 ) mm += mm[1];
1541 mstop = mm + mm[1]; mm += 2;
1542 while ( mm < mstop &&
1543 *mm != *t ) mm += 1;
1554 else if ( *t >= FUNCTION ) {
1559 if ( *t >= FUNCTION &&
1560 functions[*t-FUNCTION].commute == 0 ) ncom = 0;
1564 while ( mm < t && ( *mm == DUMMYFUN
1565 || *mm == DUMMYTEN ) ) mm += mm[1];
1566 if ( mm < t ) { t += t[1];
continue; }
1568 mm = rnext; pow = 1;
1571 GETSTOP(mm,mstop); mm++;
1572 while ( mm < mstop ) {
1573 if ( *mm == *t && mm[1] == t[1] ) {
1574 for ( i = 2; i < t[1]; i++ ) {
1575 if ( mm[i] != t[i] )
break;
1578 { mm += mm[1];
goto nextmterm; }
1580 if ( ncom && *mm != DUMMYFUN && *mm != DUMMYTEN )
1584 if ( mm >= mstop ) pow = 0;
1585 if ( pow == 0 )
break;
1586nextmterm: mm = mnext;
1588 if ( pow == 0 ) { t += t[1];
continue; }
1593 *r1++ = t[1] + 4 + ARGHEAD;
1594 for ( i = 1; i < ARGHEAD; i++ ) *r1++ = 0;
1596 for ( i = 0; i < t[1]; i++ ) *r1++ = t[i];
1597 *r1++ = 1; *r1++ = 1; *r1++ = 3;
1604 GETSTOP(mm,mstop); mm++;
1605 while ( mm < mstop ) {
1606 if ( *mm == *t && mm[1] == t[1] ) {
1607 for ( i = 2; i < t[1]; i++ ) {
1608 if ( mm[i] != t[i] )
break;
1611 if ( functions[*t-FUNCTION].spec > 0 )
1621nextterm: mm = mnext;
1623 if ( functions[*t-FUNCTION].spec > 0 )
1641 t += *t;
if ( t[-1] > 0 ) { pow = 0;
break; }
1651 EAscrat = (UWORD *)(TermMalloc(
"execarg"));
1652 if ( t + *t == r3 )
goto oneterm;
1656 while ( --i >= 0 ) EAscrat[i] = r6[i];
1661 if ( AccumGCD(BHEAD EAscrat,&ngcd,(UWORD *)r6,i) )
goto execargerr;
1662 if ( ngcd == 3 && EAscrat[0] == 1 && EAscrat[1] == 1 )
break;
1665 if ( ngcd != 3 || EAscrat[0] != 1 || EAscrat[1] != 1 ) {
1666 if ( pow ) ngcd = -ngcd;
1667 t = r5; r9 = r1; *r1++ = t[-ARGHEAD]; *r1++ = 1;
1668 FILLARG(r1); ngcd = REDLENG(ngcd);
1672 while ( r7 < r6) *r1++ = *r7++;
1675 if ( DivRat(BHEAD (UWORD *)r6,i,EAscrat,ngcd,(UWORD *)r1,&nq) )
goto execargerr;
1678 r1 += i; *r1++ = nq; *r8 = r1-r8;
1681 ngcd = INCLENG(ngcd);
1683 if ( factor && *factor == 0 ) {}
1684 else if ( ( factor && factor[0] == 4 && factor[2] == 1
1685 && factor[3] == -3 ) || pow == 0 ) {
1686 r9 = r1; *r1++ = ARGHEAD+2+i; *r1++ = 0;
1687 FILLARG(r1); *r1++ = i+2;
1688 for ( j = 0; j < i; j++ ) *r1++ = EAscrat[j];
1690 if ( ToFast(r9,r9) ) r1 = r9+2;
1692 else if ( factor && factor[0] == 4 && factor[2] == 1
1693 && factor[3] > 0 && pow ) {
1694 if ( ngcd < 0 ) ngcd = -ngcd;
1695 *r1++ = -SNUMBER; *r1++ = -1;
1696 r9 = r1; *r1++ = ARGHEAD+2+i; *r1++ = 0;
1697 FILLARG(r1); *r1++ = i+2;
1698 for ( j = 0; j < i; j++ ) *r1++ = EAscrat[j];
1700 if ( ToFast(r9,r9) ) r1 = r9+2;
1703 if ( ngcd < 0 ) ngcd = -ngcd;
1704 if ( pow ) { *r1++ = -SNUMBER; *r1++ = -1; }
1705 if ( ngcd != 3 || EAscrat[0] != 1 || EAscrat[1] != 1 ) {
1706 r9 = r1; *r1++ = ARGHEAD+2+i; *r1++ = 0;
1707 FILLARG(r1); *r1++ = i+2;
1708 for ( j = 0; j < i; j++ ) *r1++ = EAscrat[j];
1710 if ( ToFast(r9,r9) ) r1 = r9+2;
1719 if ( factor == 0 || *factor > 2 ) {
1721 *r1++ = -SNUMBER; *r1++ = -1;
1724 t += *t; t[-1] = -t[-1];
1727 t = rr; *r1++ = *t++; *r1++ = 1; t++;
1729 while ( t < m ) *r1++ = *t++;
1732 TermFree(EAscrat,
"execarg");
1743 while ( t < r ) *r1++ = *t++;
1747 while ( t < r ) *r1++ = *t++;
1751 while ( --i >= 0 ) *t++ = *m++;
1752 if ( AT.WorkPointer < t ) AT.WorkPointer = t;
1757 AR.Cnumlhs = oldnumlhs;
1758 if ( action && Normalize(BHEAD term) )
goto execargerr;
1759 AT.WorkPointer = oldwork;
1760 if ( AT.WorkPointer < term + *term ) AT.WorkPointer = term + *term;
1761 AT.pWorkPointer = oldppointer;
1764 AT.WorkPointer = oldwork;
1765 AT.pWorkPointer = oldppointer;
1766 MLOCK(ErrorMessageLock);
1768 MUNLOCK(ErrorMessageLock);
1777int execterm(PHEAD WORD *term, WORD level)
1780 CBUF *C = cbuf+AM.rbufnum;
1781 WORD oldnumlhs = AR.Cnumlhs;
1782 WORD maxisat = C->lhs[level][2];
1784 WORD *oldworkpointer = AT.WorkPointer;
1786 WORD olddeferflag = AR.DeferFlag, tryterm = 0;
1789 AR.Cnumlhs = C->lhs[level][3];
1796 AN.FunSorts[AR.sLevel]->PolyFlag = ( AR.PolyFun != 0 ) ? AR.PolyFunType: 0;
1797 if ( AR.PolyFun == 0 ) { AN.FunSorts[AR.sLevel]->PolyFlag = 0; }
1798 else if ( AR.PolyFunType == 1 ) { AN.FunSorts[AR.sLevel]->PolyFlag = 1; }
1799 else if ( AR.PolyFunType == 2 ) {
1800 if ( AR.PolyFunExp == 2 ) AN.FunSorts[AR.sLevel]->PolyFlag = 1;
1801 else AN.FunSorts[AR.sLevel]->PolyFlag = 2;
1806 t1 = oldworkpointer;
1807 i = *term;
while ( --i >= 0 ) *t1++ = *term++;
1808 AT.WorkPointer = t1;
1809 if (
Generator(BHEAD oldworkpointer,level) )
goto exectermerr;
1813 if (
Generator(BHEAD term,level) )
goto exectermerr;
1816 if ( tryterm ) { TermFree(buffer1,
"buffer in sort statement"); tryterm = 0; }
1817 else { M_free((
void *)buffer1,
"buffer in sort statement"); }
1821 if (
EndSort(BHEAD (WORD *)((
void *)(&buffer1)),2) < 0 )
goto exectermerr;
1822 tryterm = AN.tryterm; AN.tryterm = 0;
1824 }
while ( AR.Cnumlhs < maxisat );
1825 AR.Cnumlhs = oldnumlhs;
1826 AR.DeferFlag = olddeferflag;
1829 t1 = oldworkpointer;
1830 i = *term;
while ( --i >= 0 ) *t1++ = *term++;
1831 AT.WorkPointer = t1;
1832 if (
Generator(BHEAD oldworkpointer,level) )
goto exectermerr;
1834 if ( tryterm ) { TermFree(buffer1,
"buffer in term statement"); tryterm = 0; }
1835 else { M_free(buffer1,
"buffer in term statement"); }
1837 AT.WorkPointer = oldworkpointer;
1840 AT.WorkPointer = oldworkpointer;
1841 AR.DeferFlag = olddeferflag;
1842 MLOCK(ErrorMessageLock);
1843 MesCall(
"execterm");
1844 MUNLOCK(ErrorMessageLock);
1853int ArgumentImplode(PHEAD WORD *term, WORD *thelist)
1856 WORD *liststart, *liststop, *inlist;
1857 WORD *w, *t, *tend, *tstop, *tt, *ttstop, *ttt, ncount, i;
1859 liststop = thelist + thelist[1];
1860 liststart = thelist + 2;
1863 tstop = tend - ABS(tend[-1]);
1865 while ( t < tstop ) {
1866 if ( *t >= FUNCTION ) {
1868 while ( inlist < liststop && *inlist != *t ) inlist += inlist[1];
1869 if ( inlist < liststop ) {
1870 tt = t; ttstop = t + t[1]; w = AT.WorkPointer;
1871 for ( i = 0; i < FUNHEAD; i++ ) *w++ = *tt++;
1872 while ( tt < ttstop ) {
1874 if ( *tt == -SNUMBER && tt[1] == 0 ) {
1875 ncount = 1; ttt = tt; tt += 2;
1876 while ( tt < ttstop && *tt == -SNUMBER && tt[1] == 0 ) {
1881 if ( tt < ttstop && *tt == -SNUMBER && ( tt[1] == 1 || tt[1] == -1 ) ) {
1883 *w++ = (ncount+1) * tt[1];
1887 else if ( ( tt[0] == tt[ARGHEAD] + ARGHEAD )
1888 && ( ABS(tt[tt[0]-1]) == 3 )
1889 && ( tt[tt[0]-2] == 1 )
1890 && ( tt[tt[0]-3] == 1 ) ) {
1891 i = *tt; NCOPY(w,tt,i)
1895 else if ( *tt == -SYMBOL ) {
1903 *w++ = ncount+1; *w++ = 1; *w++ = 3;
1907 else if ( *tt <= -FUNCTION ) {
1908 *w++ = ARGHEAD+FUNHEAD+4;
1914 *w++ = ncount+1; *w++ = 1; *w++ = 3;
1918 while ( ttt < tt ) *w++ = *ttt++;
1919 if ( tt < ttstop && *tt == -SNUMBER ) {
1920 *w++ = *tt++; *w++ = *tt++;
1924 else if ( *tt <= -FUNCTION ) {
1927 else if ( *tt < 0 ) {
1932 i = *tt; NCOPY(w,tt,i)
1935 AT.WorkPointer[1] = w - AT.WorkPointer;
1936 while ( tt < tend ) *w++ = *tt++;
1937 ttt = AT.WorkPointer; tt = t;
1938 while ( ttt < w ) *tt++ = *ttt++;
1939 term[0] = tt - term;
1940 AT.WorkPointer = tt;
1941 tend = tt; tstop = tt - ABS(tt[-1]);
1947 if ( Normalize(BHEAD term) )
return(-1);
1957int ArgumentExplode(PHEAD WORD *term, WORD *thelist)
1960 WORD *liststart, *liststop, *inlist, *old;
1961 WORD *w, *t, *tend, *tstop, *tt, *ttstop, *ttt, ncount, i;
1964 liststop = thelist + thelist[1];
1965 liststart = thelist + 2;
1968 tstop = tend - ABS(tend[-1]);
1970 while ( t < tstop ) {
1971 if ( *t >= FUNCTION ) {
1973 while ( inlist < liststop && *inlist != *t ) inlist += inlist[1];
1974 if ( inlist < liststop ) {
1975 tt = t; ttstop = t + t[1]; w = AT.WorkPointer;
1976 for ( i = 0; i < FUNHEAD; i++ ) *w++ = *tt++;
1977 while ( tt < ttstop ) {
1978 if ( *tt == -SNUMBER && tt[1] != 0 ) {
1979 if ( tt[1] < AM.MaxTer/((WORD)
sizeof(WORD)*4)
1980 && tt[1] > -(AM.MaxTer/((WORD)
sizeof(WORD)*4))
1981 && ( tt[1] > 1 || tt[1] < -1 ) ) {
1982 ncount = ABS(tt[1]);
1983 while ( ncount > 1 ) {
1984 *w++ = -SNUMBER; *w++ = 0; ncount--;
1987 if ( tt[1] < 0 ) *w++ = -1;
1993 *w++ = *tt++; *w++ = *tt++;
1996 else if ( *tt <= -FUNCTION ) {
1999 else if ( *tt < 0 ) {
2003 else if ( tt[0] == tt[ARGHEAD]+ARGHEAD ) {
2004 ttt = tt + tt[0] - 1;
2005 i = (ABS(ttt[0])-1)/2;
2007TooMany: old = AN.currentTerm;
2008 AN.currentTerm = term;
2009 MLOCK(ErrorMessageLock);
2010 MesPrint(
"Too many arguments in output of ArgExplode");
2011 MesPrint(
"Term = %t");
2012 MUNLOCK(ErrorMessageLock);
2013 AN.currentTerm = old;
2016 if ( ttt[-1] != 1 )
goto NoExplode;
2018 if ( 2*x > (AT.WorkTop-w)-*term )
goto TooMany;
2020 while ( ncount > 0 ) {
2021 *w++ = -SNUMBER; *w++ = 0; ncount--;
2024 i = *tt; NCOPY(w,tt,i)
2029 i = *tt; NCOPY(w,tt,i)
2032 AT.WorkPointer[1] = w - AT.WorkPointer;
2033 while ( tt < tend ) *w++ = *tt++;
2034 ttt = AT.WorkPointer; tt = t;
2035 while ( ttt < w ) *tt++ = *ttt++;
2036 term[0] = tt - term;
2037 AT.WorkPointer = tt;
2038 tend = tt; tstop = tt - ABS(tt[-1]);
2044 if ( Normalize(BHEAD term) )
return(-1);
2070int ArgFactorize(PHEAD WORD *argin, WORD *argout)
2075 WORD *argfree, *argextra, *argcopy, *t, *tstop, *a, *a1, *a2;
2079 WORD startebuf = cbuf[AT.ebufnum].numrhs,oldword;
2080 WORD oldsorttype = AR.SortType, numargs;
2081 int error = 0, action = 0, i, ii, number, sign = 1;
2088 AR.SortType = SORTHIGHFIRST;
2089 if ( oldsorttype != AR.SortType ) {
2091 oldword = argin[*argin]; argin[*argin] = 0;
2095 if ( AN.ncmod != 0 ) {
2096 if ( AN.ncmod != 1 || ( (WORD)AN.cmod[0] < 0 ) ) {
2097 MLOCK(ErrorMessageLock);
2098 MesPrint(
"Factorization modulus a number, greater than a WORD not implemented.");
2099 MUNLOCK(ErrorMessageLock);
2103 MLOCK(ErrorMessageLock);
2104 MesCall(
"ArgFactorize");
2105 MUNLOCK(ErrorMessageLock);
2108 if ( !*t) { t = tstop;
continue; }
2114 EndSort(BHEAD argin+ARGHEAD,1);
2115 argin[*argin] = oldword;
2125 if ( a1[0] == -SNUMBER && ( a1[1] == 1 || a1[1] == -1 ) ) {
2126 if ( a1[1] == -1 ) { sign = -sign; a1[1] = 1; }
2128 a = t = a1+2;
while ( *t ) NEXTARG(t);
2130 t = a1; NCOPY(t,a,i);
2139 else if ( a1[0] == FUNHEAD+ARGHEAD+4 && a1[ARGHEAD] == FUNHEAD+4
2140 && a1[*a1-1] == 3 && a1[*a1-2] == 1 && a1[*a1-3] == 1
2141 && a1[ARGHEAD+1] >= FUNCTION ) {
2142 a = t = a1+*a1;
while ( *t ) NEXTARG(t);
2144 *a1 = -a1[ARGHEAD+1]; t = a1+1; NCOPY(t,a,i);
2150 if ( argfree == 0 ) {
2153 else if ( argfree[0] == ( argfree[ARGHEAD]+ARGHEAD ) ) {
2154 Normalize(BHEAD argfree+ARGHEAD);
2155 argfree[0] = argfree[ARGHEAD]+ARGHEAD;
2157 if ( ( argfree[0] == ARGHEAD+4 ) && ( argfree[ARGHEAD+3] == 3 )
2158 && ( argfree[ARGHEAD+1] == 1 ) && ( argfree[ARGHEAD+2] == 1 ) ) {
2168 t = argfree+ARGHEAD;
2176 EndSort(BHEAD argfree+ARGHEAD,1);
2177 t = argfree+ARGHEAD;
2178 while ( *t ) t += *t;
2179 *argfree = t - argfree;
2185 if ( ( number =
FindArg(BHEAD argfree) ) != 0 ) {
2186 if ( number > 0 ) t = cbuf[AT.fbufnum].rhs[number-1];
2187 else t = cbuf[AC.ffbufnum].rhs[-number-1];
2199 if ( *tstop == -SNUMBER && tstop[1] == -1 ) {
2200 sign = -sign; ii += 2;
2204 a = argout;
while ( *a ) NEXTARG(a);
2206 if ( sign == -1 ) { *a++ = -SNUMBER; *a++ = -1; *a = 0; sign = 1; }
2212 while ( ii > 0 ) { *--a1 = *--a2; ii--; }
2215 if ( *t == -SNUMBER && t[1] == -1 ) { t += 2; }
2216 else { COPY1ARG(a,t) }
2226 argcopy = TermMalloc(
"argcopy");
2227 for ( i = 0; i <= *argfree; i++ ) argcopy[i] = argfree[i];
2229 tstop = argfree + *argfree;
2232 t = argfree + ARGHEAD;
2233 while ( t < tstop ) {
2234 sumcommu += DoesCommu(t);
2237 if ( sumcommu > 1 ) {
2238 MLOCK(ErrorMessageLock);
2239 MesPrint(
"ERROR: Cannot factorize an argument with more than one noncommuting object");
2240 MUNLOCK(ErrorMessageLock);
2244 t = argfree + ARGHEAD;
2246 while ( t < tstop ) {
2247 if ( ( t[1] != SYMBOL ) && ( *t != (ABS(t[*t-1])+1) ) ) {
2253 t = argfree + ARGHEAD;
2254 argextra = AT.WorkPointer;
2256 while ( t < tstop ) {
2260 AR.SortType = oldsorttype;
2261 TermFree(argcopy,
"argcopy");
2262 if ( argfree != argin ) TermFree(argfree,
"argfree");
2263 MesCall(
"ArgFactorize");
2268 t += *t; argextra += *argextra;
2271 if (
EndSort(BHEAD argfree+ARGHEAD,1) < 0 ) { error = -2;
goto getout; }
2272 t = argfree + ARGHEAD;
2273 while ( *t > 0 ) t += *t;
2274 *argfree = t - argfree;
2282 while ( *a ) NEXTARG(a);
2284 MesCall(
"ArgFactorize");
2293 if ( error == 0 && action ) {
2294 a1 = a; NEXTARG(a1);
2296 CBUF *C = cbuf+AC.cbufnum;
2297 CBUF *CC = cbuf+AT.ebufnum;
2298 WORD *oldworkpointer = AT.WorkPointer;
2299 WORD *argcopy2 = TermMalloc(
"argcopy2"), *a1, *a2;
2300 a1 = a; a2 = argcopy2;
2303 if ( *a1 > -FUNCTION ) *a2++ = *a1++;
2304 *a2++ = *a1++; *a2 = 0;
2309 argextra = AT.WorkPointer;
2311 while ( t < tstop ) {
2312 if ( ConvertFromPoly(BHEAD t,argextra,numxsymbol,CC->numrhs-startebuf+numxsymbol
2313 ,startebuf-numxsymbol,1) <= 0 ) {
2314 TermFree(argcopy2,
"argcopy2");
2320 AT.WorkPointer = argextra + *argextra;
2324 if (
Generator(BHEAD argextra,C->numlhs) ) {
2325 TermFree(argcopy2,
"argcopy2");
2331 AT.WorkPointer = oldworkpointer;
2333 if (
EndSort(BHEAD a2+ARGHEAD,1) < 0 ) { error = -5;
goto getout; }
2334 t = a2+ARGHEAD;
while ( *t ) t += *t;
2335 *a2 = t - a2; a2[1] = 0; ZEROARG(a2);
2336 ToFast(a2,a2); NEXTARG(a2);
2340 a2 = argcopy2; a1 = a;
2343 TermFree(argcopy2,
"argcopy2");
2347 CC->numrhs = startebuf;
2350 for ( i = 0; i <= *argcopy; i++ ) a[i] = argcopy[i];
2360 if ( error == 0 && AN.ncmod == 0 ) {
2361 if (
InsertArg(BHEAD argcopy,a,0) < 0 ) { error = -1; }
2371 for ( i = 0; i < ii; i++ ) argcopy[i] = argout[i];
2374 if ( *a1 == -SNUMBER && a1[1] < 0 ) {
2375 sign = -sign; a1[1] = -a1[1];
2377 a2 = a1+2;
while ( *a2 ) NEXTARG(a2);
2378 i = a2-a1-2; a2 = a1+2;
2382 while ( *a1 ) NEXTARG(a1);
2386 if ( *a1 > 0 && *a1 == a1[ARGHEAD]+ARGHEAD && a1[*a1-1] < 0 ) {
2387 a1[*a1-1] = -a1[*a1-1]; sign = -sign;
2389 if ( *a1 == ARGHEAD+4 && a1[ARGHEAD+1] == 1 && a1[ARGHEAD+2] == 1 ) {
2390 a2 = a1+ARGHEAD+4;
while ( *a2 ) NEXTARG(a2);
2391 i = a2-a1-ARGHEAD-4; a2 = a1+ARGHEAD+4;
2396 while ( *a1 ) NEXTARG(a1);
2404 for ( i = 0; i < ii; i++ ) *a2++ = argcopy[i];
2406 if ( sign == -1 ) { *a2++ = -SNUMBER; *a2++ = -1; sign = 1; }
2409 TermFree(argcopy,
"argcopy");
2411 if ( argfree != argin ) TermFree(argfree,
"argfree");
2412 if ( oldsorttype != AR.SortType ) {
2413 AR.SortType = oldsorttype;
2418 oldword = a[*a]; a[*a] = 0;
2430 else { NEXTARG(a); }
2434 t = argout; numargs = 0;
2438 if ( *tt == ABS(t[-1])+1+ARGHEAD && sign == -1 ) { t[-1] = -t[-1]; sign = 1; }
2439 else if ( *tt == -SNUMBER && sign == -1 ) { tt[1] = -tt[1]; sign = 1; }
2443 *t++ = -SNUMBER; *t++ = -1; *t = 0; sign = 1; numargs++;
2454 t = argout; numargs = 0;
2455 while ( *t && *t != -SNUMBER && ( *t < 0 || ( ABS(t[*t-1]) != *t-1 ) ) ) {
2460 if ( numargs > 1 ) {
2463 x[0] = argout[-FUNHEAD];
2464 x[1] = argout[-FUNHEAD+1];
2465 x[2] = argout[-FUNHEAD+2];
2466 while ( *t ) { NEXTARG(t); }
2467 argout[-FUNHEAD] = SQRTFUNCTION;
2468 argout[-FUNHEAD+1] = t-argout+FUNHEAD;
2469 argout[-FUNHEAD+2] = 0;
2470 AT.WorkPointer = t+1;
2471 Lijst = AT.WorkPointer;
2472 for ( i = 0; i < numargs; i++ ) Lijst[i] = i;
2473 AT.WorkPointer += numargs;
2474 error = Symmetrize(BHEAD argout-FUNHEAD,Lijst,numargs,1,SYMMETRIC);
2475 AT.WorkPointer = Lijst;
2476 argout[-FUNHEAD] = x[0];
2477 argout[-FUNHEAD+1] = x[1];
2478 argout[-FUNHEAD+2] = x[2];
2483 tstop = argout;
while ( *tstop ) { NEXTARG(tstop); }
2484 t = argout; number = 0;
2487 if ( *tt == -SNUMBER ) {
2488 if ( number == 0 )
break;
2490 while ( tt > argout ) { *--t = *--tt; }
2491 argout[0] = -SNUMBER; argout[1] = x[0];
2494 else if ( *tt == ABS(t[-1])+1+ARGHEAD ) {
2495 if ( number == 0 )
break;
2497 for ( i = 0; i < ii; i++ ) tstop[i] = tt[i];
2498 while ( tt > argout ) { *--t = *--tt; }
2499 for ( i = 0; i < ii; i++ ) argout[i] = tstop[i];
2528 if ( AN.ncmod != 0 )
return(0);
2529 number = FindTree(AT.fbufnum,a);
2530 if ( number >= 0 )
return(number+1);
2531 number = FindTree(AC.ffbufnum,a);
2532 if ( number >= 0 )
return(-number-1);
2554 bufnum = AT.fbufnum;
2558 else if ( par == 1 ) {
2559 bufnum = AC.ffbufnum;
2562 else {
return(-1); }
2564 AddNtoC(bufnum,*argin,argin,1);
2566 a = argout;
while ( *a ) NEXTARG(a);
2570 return(InsTree(bufnum,C->numrhs));
2586 CBUF *C = cbuf + bufnum;
2588 LONG *weights = (LONG *)Malloc1(2*(C->numrhs+1)*
sizeof(LONG),
"CleanupArgCache");
2589 LONG w, whalf, *extraweights;
2590 WORD *a, *to, *from;
2592 for ( i = 1; i <= C->numrhs; i++ ) {
2593 weights[i] = ((LONG)i) * (boomlijst[i].
usage);
2598 extraweights = weights+C->numrhs+1;
2600 whalf = weights[C->numrhs/2+1];
2606 for ( i = 1; i <= C->numrhs; i++ ) {
2607 from = C->
rhs[i]; w = ((LONG)i) * (boomlijst[i].
usage);
2609 if ( i < C->numrhs-1 ) {
2614 j = C->
rhs[i+1] - from;
2619 else if ( to == from ) {
2620 to += *to + 1;
while ( *to ) NEXTARG(to); to++;
2623 a = from; a += *a+1;
while ( *a ) NEXTARG(a); a++;
2628 weights[k++] = boomlijst[i].
usage;
2638 ClearTree(AT.fbufnum);
2639 for ( i = 1; i <= k; i++ ) {
2640 InsTree(AT.fbufnum,i);
2641 boomlijst[i].
usage = weights[i];
2646 M_free(weights,
"CleanupArgCache");
2655int ArgSymbolMerge(WORD *t1, WORD *t2)
2657 WORD *t1e = t1+t1[1];
2658 WORD *t2e = t2+t2[1];
2662 while ( t1a < t1e && t2a < t2e ) {
2663 if ( *t1a < *t2a ) {
2664 if ( t1a[1] >= 0 ) {
2666 while ( t3 < t1e ) { t3[-2] = *t3; t3[-1] = t3[1]; t3 += 2; }
2671 else if ( *t1a > *t2a ) {
2672 if ( t2a[1] >= 0 ) t2a += 2;
2675 while ( t3 > t1a ) { *t3 = t3[-2]; t3[1] = t3[-1]; t3 -= 2; }
2682 if ( t2a[1] < t1a[1] ) t1a[1] = t2a[1];
2686 while ( t2a < t2e ) {
2693 while ( t1a < t1e ) {
2694 if ( t1a[1] >= 0 ) {
2696 while ( t3 < t1e ) { t3[-2] = *t3; t3[-1] = t3[1]; t3 += 2; }
2710int ArgDotproductMerge(WORD *t1, WORD *t2)
2712 WORD *t1e = t1+t1[1];
2713 WORD *t2e = t2+t2[1];
2717 while ( t1a < t1e && t2a < t2e ) {
2718 if ( *t1a < *t2a || ( *t1a == *t2a && t1a[1] < t2a[1] ) ) {
2719 if ( t1a[2] >= 0 ) {
2721 while ( t3 < t1e ) { t3[-3] = *t3; t3[-2] = t3[1]; t3[-1] = t3[2]; t3 += 3; }
2726 else if ( *t1a > *t2a || ( *t1a == *t2a && t1a[1] > t2a[1] ) ) {
2727 if ( t2a[2] >= 0 ) t2a += 3;
2730 while ( t3 > t1a ) { *t3 = t3[-3]; t3[1] = t3[-2]; t3[2] = t3[-1]; t3 -= 3; }
2738 if ( t2a[2] < t1a[2] ) t1a[2] = t2a[2];
2742 while ( t2a < t2e ) {
2750 while ( t1a < t1e ) {
2751 if ( t1a[2] >= 0 ) {
2753 while ( t3 < t1e ) { t3[-3] = *t3; t3[-2] = t3[1]; t3[-1] = t3[2]; t3 += 3; }
2781 WORD *t, *rnext, *r1, *r2, *r3, *r5, *r6, *r7, *r8, *r9;
2782 WORD pow, *mm, *mnext, *mstop, *argin2 = argin, *argin3 = argin, *argfree;
2785 r5 = t = argin + ARGHEAD;
2786 r3 = argin + *argin;
2800 if ( *t == DELTA || *t == VECTOR ) {
2801 r7 = t; r8 = t + t[1]; t += 2;
2807 GETSTOP(mm,mstop); mm++;
2808 while ( mm < mstop ) {
2809 if ( *mm != *r7 ) mm += mm[1];
2813 mstop = mm + mm[1]; mm += 2;
2814 while ( ( *mm != *t || mm[1] != t[1] )
2815 && mm < mstop ) mm += 2;
2816 if ( mm >= mstop ) pow = 0;
2819 if ( pow == 0 )
break;
2822 if ( pow == 0 ) { t += 2;
continue; }
2826 *r1++ = 8 + ARGHEAD;
2827 for ( j = 1; j < ARGHEAD; j++ ) *r1++ = 0;
2828 *r1++ = 8; *r1++ = *r7;
2829 *r1++ = 4; *r1++ = *t; *r1++ = t[1];
2830 *r1++ = 1; *r1++ = 1; *r1++ = 3;
2838 GETSTOP(mm,mstop); mm++;
2839 while ( mm < mstop ) {
2840 if ( *mm != *r7 ) mm += mm[1];
2843 mstop = mm + mm[1]; mm += 2;
2844 while ( mm < mstop && (
2845 *mm != *t || mm[1] != t[1] ) ) mm += 2;
2846 *mm = mm[1] = NOINDEX;
2849 *t = t[1] = NOINDEX;
2857 else if ( *t == INDEX ) {
2858 r7 = t; r8 = t + t[1]; t += 2;
2864 GETSTOP(mm,mstop); mm++;
2865 while ( mm < mstop ) {
2866 if ( *mm != *r7 ) mm += mm[1];
2870 mstop = mm + mm[1]; mm += 2;
2872 && mm < mstop ) mm++;
2873 if ( mm >= mstop ) pow = 0;
2876 if ( pow == 0 )
break;
2879 if ( pow == 0 ) { t++;
continue; }
2883 if ( *t < 0 ) { *r1++ = -VECTOR; }
2884 else { *r1++ = -INDEX; }
2894 GETSTOP(mm,mstop); mm++;
2895 while ( mm < mstop ) {
2896 if ( *mm != *r7 ) mm += mm[1];
2899 mstop = mm + mm[1]; mm += 2;
2900 while ( mm < mstop &&
2901 *mm != *t ) mm += 1;
2912 else if ( *t >= FUNCTION ) {
2917 if ( *t >= FUNCTION &&
2918 functions[*t-FUNCTION].commute == 0 ) ncom = 0;
2922 while ( mm < t && ( *mm == DUMMYFUN
2923 || *mm == DUMMYTEN ) ) mm += mm[1];
2924 if ( mm < t ) { t += t[1];
continue; }
2926 mm = rnext; pow = 1;
2929 GETSTOP(mm,mstop); mm++;
2930 while ( mm < mstop ) {
2931 if ( *mm == *t && mm[1] == t[1] ) {
2932 for ( i = 2; i < t[1]; i++ ) {
2933 if ( mm[i] != t[i] )
break;
2936 { mm += mm[1];
goto nextmterm; }
2938 if ( ncom && *mm != DUMMYFUN && *mm != DUMMYTEN )
2942 if ( mm >= mstop ) pow = 0;
2943 if ( pow == 0 )
break;
2944nextmterm: mm = mnext;
2946 if ( pow == 0 ) { t += t[1];
continue; }
2950 *r1++ = t[1] + 4 + ARGHEAD;
2951 for ( i = 1; i < ARGHEAD; i++ ) *r1++ = 0;
2953 for ( i = 0; i < t[1]; i++ ) *r1++ = t[i];
2954 *r1++ = 1; *r1++ = 1; *r1++ = 3;
2962 GETSTOP(mm,mstop); mm++;
2963 while ( mm < mstop ) {
2964 if ( *mm == *t && mm[1] == t[1] ) {
2965 for ( i = 2; i < t[1]; i++ ) {
2966 if ( mm[i] != t[i] )
break;
2969 if ( functions[*t-FUNCTION].spec > 0 )
2979nextterm: mm = mnext;
2981 if ( functions[*t-FUNCTION].spec > 0 )
3007 if ( *t == SYMBOL ) {
3015 *r2++ = SYMBOL; *r2++ = 2;
3017 t = rnext; rnext = rnext + *rnext;
3031 ArgSymbolMerge(r7,r8);
3044 if ( r8[1] < 0 ) { act = 1; pow += -r8[1]*(ARGHEAD+8); }
3045 else { pow += 2*r8[1]; }
3052 t = argin + ARGHEAD;
3058 if ( *t != SYMBOL ) { t += t[1];
continue; }
3059 r8 = r7+2; r9 = t + t[1]; t += 2;
3060 while ( ( t < r9 ) && ( r8 < r2 ) ) {
3062 t[1] -= r8[1]; t += 2; r8 += 2;
3076 r8 = r7+pow; i = r7[1];
3077 while ( --i >= 0 ) r8[i] = r7[i];
3081 for ( i = 0; i < r8[1]; i++ ) { *r1++ = -SYMBOL; *r1++ = *r8; }
3086 argin2 = TermMalloc(
"TakeArgContent2");
3091 r5 = argin2; *r5++ = 0; *r5++ = 0; FILLARG(r5);
3097 *r5++ = *t++ + r7[1];
3098 while ( t < r6 ) *r5++ = *t++;
3099 i = r7[1] - 2; r8 = r7+2;
3100 *r5++ = r7[0]; *r5++ = r7[1];
3101 while ( i > 0 ) { *r5++ = *r8++; *r5++ = -*r8++; i -= 2; }
3102 while ( t < rnext ) *r5++ = *t++;
3103 Normalize(BHEAD r9);
3107 *argin2 = r5-argin2;
3118 if (
EndSort(BHEAD t,0) < 0 )
goto Irreg;
3119 while ( *t ) t += *t;
3120 *argin2 = t - argin2;
3126 r8 = r7+pow; i = r7[1];
3127 while ( --i >= 0 ) r8[i] = r7[i];
3132 for ( i = 0; i < r8[1]; i++ ) { *r1++ = -SYMBOL; *r1++ = *r8; }
3135 for ( i = 0; i < -r8[1]; i++ ) {
3136 *r1++ = ARGHEAD+8; *r1++ = 0;
3138 *r1++ = 8; *r1++ = SYMBOL; *r1++ = 4; *r1++ = *r8;
3139 *r1++ = -1; *r1++ = 1; *r1++ = 1; *r1++ = 3;
3161 if ( *t == DOTPRODUCT ) {
3169 *r2++ = DOTPRODUCT; *r2++ = 2;
3171 t = rnext; rnext = rnext + *rnext;
3185 ArgDotproductMerge(r7,r8);
3198 if ( r8[2] < 0 ) { pow += -r8[2]*(ARGHEAD+9); }
3199 else { pow += r8[2]*(ARGHEAD+9); }
3207 argin3 = TermMalloc(
"TakeArgContent3");
3212 r5 = argin3; *r5++ = 0; *r5++ = 0; FILLARG(r5);
3218 *r5++ = *t++ + r7[1];
3219 while ( t < r6 ) *r5++ = *t++;
3220 i = r7[1] - 2; r8 = r7+2;
3221 *r5++ = r7[0]; *r5++ = r7[1];
3222 while ( i > 0 ) { *r5++ = *r8++; *r5++ = *r8++; *r5++ = -*r8++; i -= 3; }
3223 while ( t < rnext ) *r5++ = *t++;
3224 Normalize(BHEAD r9);
3228 *argin3 = r5-argin3;
3239 if (
EndSort(BHEAD t,0) < 0 )
goto Irreg;
3240 while ( *t ) t += *t;
3241 *argin3 = t - argin3;
3247 r8 = r7+pow; i = r7[1];
3248 while ( --i >= 0 ) r8[i] = r7[i];
3252 for ( i = ABS(r8[2]); i > 0; i-- ) {
3253 *r1++ = ARGHEAD+9; *r1++ = 0; FILLARG(r1);
3254 *r1++ = 9; *r1++ = DOTPRODUCT; *r1++ = 5; *r1++ = *r8;
3255 *r1++ = r8[1]; *r1++ = r8[2] < 0 ? -1: 1;
3256 *r1++ = 1; *r1++ = 1; *r1++ = 3;
3272 t = argin3 + ARGHEAD; pow = 1;
3278 t += *t; t[-1] = -t[-1];
3284 argfree = TermMalloc(
"TakeArgContent1");
3285 if ( AN.cmod != 0 ) {
3286 r1 =
MakeMod(BHEAD argin3,r1,argfree);
3299 if ( argin3 != argin2 ) TermFree(argin3,
"TakeArgContent3");
3300 if ( argin2 != argin ) TermFree(argin2,
"TakeArgContent2");
3304 MLOCK(ErrorMessageLock);
3305 MesPrint(
"!>Irregularity while sorting argument in TakeArgContent");
3306 MUNLOCK(ErrorMessageLock);
3307 if ( argin3 != argin2 ) TermFree(argin3,
"TakeArgContent3");
3308 if ( argin2 != argin ) TermFree(argin2,
"TakeArgContent2");
3330 UWORD *GCDbuffer, *GCDbuffer2, *LCMbuffer, *LCMb, *LCMc;
3331 WORD *r, *r1, *r2, *r3, *r4, *r5, *rnext, i, k, j;
3332 WORD kGCD, kLCM, kGCD2, kkLCM, jLCM, jGCD;
3333 GCDbuffer = NumberMalloc(
"MakeInteger");
3334 GCDbuffer2 = NumberMalloc(
"MakeInteger");
3335 LCMbuffer = NumberMalloc(
"MakeInteger");
3336 LCMb = NumberMalloc(
"MakeInteger");
3337 LCMc = NumberMalloc(
"MakeInteger");
3338 r4 = argin + *argin;
3339 r = argin + ARGHEAD;
3347 if ( k < 0 ) k = -k;
3348 while ( ( k > 1 ) && ( r3[k-1] == 0 ) ) k--;
3349 for ( kGCD = 0; kGCD < k; kGCD++ ) GCDbuffer[kGCD] = r3[kGCD];
3351 if ( k < 0 ) k = -k;
3353 while ( ( k > 1 ) && ( r3[k-1] == 0 ) ) k--;
3354 for ( kLCM = 0; kLCM < k; kLCM++ ) LCMbuffer[kLCM] = r3[kLCM];
3364 if ( k < 0 ) k = -k;
3365 while ( ( k > 1 ) && ( r3[k-1] == 0 ) ) k--;
3366 if ( ( ( GCDbuffer[0] == 1 ) && ( kGCD == 1 ) ) ) {
3371 else if ( ( ( k != 1 ) || ( r3[0] != 1 ) ) ) {
3372 if ( GcdLong(BHEAD GCDbuffer,kGCD,(UWORD *)r3,k,GCDbuffer2,&kGCD2) ) {
3373 NumberFree(GCDbuffer,
"MakeInteger");
3374 NumberFree(GCDbuffer2,
"MakeInteger");
3375 NumberFree(LCMbuffer,
"MakeInteger");
3376 NumberFree(LCMb,
"MakeInteger"); NumberFree(LCMc,
"MakeInteger");
3377 goto MakeIntegerErr;
3380 for ( i = 0; i < kGCD; i++ ) GCDbuffer[i] = GCDbuffer2[i];
3383 kGCD = 1; GCDbuffer[0] = 1;
3386 if ( k < 0 ) k = -k;
3388 while ( ( k > 1 ) && ( r3[k-1] == 0 ) ) k--;
3389 if ( ( ( LCMbuffer[0] == 1 ) && ( kLCM == 1 ) ) ) {
3390 for ( kLCM = 0; kLCM < k; kLCM++ )
3391 LCMbuffer[kLCM] = r3[kLCM];
3393 else if ( ( k != 1 ) || ( r3[0] != 1 ) ) {
3394 if ( GcdLong(BHEAD LCMbuffer,kLCM,(UWORD *)r3,k,LCMb,&kkLCM) ) {
3395 NumberFree(GCDbuffer,
"MakeInteger"); NumberFree(GCDbuffer2,
"MakeInteger");
3396 NumberFree(LCMbuffer,
"MakeInteger"); NumberFree(LCMb,
"MakeInteger"); NumberFree(LCMc,
"MakeInteger");
3397 goto MakeIntegerErr;
3399 DivLong((UWORD *)r3,k,LCMb,kkLCM,LCMb,&kkLCM,LCMc,&jLCM);
3400 MulLong(LCMbuffer,kLCM,LCMb,kkLCM,LCMc,&jLCM);
3401 for ( kLCM = 0; kLCM < jLCM; kLCM++ )
3402 LCMbuffer[kLCM] = LCMc[kLCM];
3410 r3 = (WORD *)(GCDbuffer);
3411 if ( kGCD == kLCM ) {
3412 for ( jGCD = 0; jGCD < kGCD; jGCD++ )
3413 r3[jGCD+kGCD] = LCMbuffer[jGCD];
3416 else if ( kGCD > kLCM ) {
3417 for ( jGCD = 0; jGCD < kLCM; jGCD++ )
3418 r3[jGCD+kGCD] = LCMbuffer[jGCD];
3419 for ( jGCD = kLCM; jGCD < kGCD; jGCD++ )
3424 for ( jGCD = kGCD; jGCD < kLCM; jGCD++ )
3426 for ( jGCD = 0; jGCD < kLCM; jGCD++ )
3427 r3[jGCD+kLCM] = LCMbuffer[jGCD];
3434 if ( ( j == 3 ) && ( r3[1] == 1 ) && ( (WORD)(r3[0]) > 0 ) ) {
3441 *r1++ = j+1+ARGHEAD; *r1++ = 0; FILLARG(r1);
3442 *r1++ = j+1; r2 = r3;
3443 for ( i = 0; i < k; i++ ) { *r1++ = *r2++; *r1++ = *r2++; }
3451 r2 = argfree + 2; FILLARG(r2)
3457 while ( r < r5 ) *r2++ = *r++;
3459 if ( DivRat(BHEAD (UWORD *)r5,j,GCDbuffer,k,(UWORD *)r2,&i) ) {
3460 goto MakeIntegerErr;
3464 if ( rnext[-1] < 0 ) r2[-1] = -i;
3470 argfree[0] = r2-argfree;
3475 NumberFree(LCMc,
"MakeInteger");
3476 NumberFree(LCMb,
"MakeInteger");
3477 NumberFree(LCMbuffer,
"MakeInteger");
3478 NumberFree(GCDbuffer2,
"MakeInteger");
3479 NumberFree(GCDbuffer,
"MakeInteger");
3483 MesCall(
"MakeInteger");
3499WORD *
MakeMod(PHEAD WORD *argin,WORD *argout,WORD *argfree)
3501 WORD *r, *instop, *r1, *m, x, xx, ix, ip;
3503 r = argin; instop = r + *r; r += ARGHEAD;
3505 if ( r[*r-1] < 0 ) x += AN.cmod[0];
3509 argout[0] = -SNUMBER;
3518 m = argfree + ARGHEAD;
3519 while ( r < instop ) {
3520 xx = r[*r-3];
if ( r[*r-1] < 0 ) xx += AN.cmod[0];
3521 xx = (WORD)((((LONG)xx)*ix) % AN.cmod[0]);
3523 i = *r; NCOPY(m,r,i);
3524 m[-3] = xx; m[-1] = 3;
3529 *argfree = m - argfree;
3531 argfree += 2; FILLARG(argfree);
3546 LONG w, *fill, *from1, *from2;
3548 if ( number >= 4 ) {
3549 n1 = number/2; n2 = number - n1;
3556 for ( i = 0; i < n1; i++ ) extraspace[i] = weights[i];
3557 fill = weights; from1 = extraspace; from2 = weights+n1;
3558 while ( n1 > 0 && n2 > 0 ) {
3559 if ( *from1 <= *from2 ) { *fill++ = *from1++; n1--; }
3560 else { *fill++ = *from2++; n2--; }
3562 while ( n1 > 0 ) { *fill++ = *from1++; n1--; }
3567 else if ( number == 3 ) {
3568 if ( weights[0] > weights[1] ) {
3569 if ( weights[1] > weights[2] ) {
3570 w = weights[0]; weights[0] = weights[2]; weights[2] = w;
3572 else if ( weights[0] > weights[2] ) {
3573 w = weights[0]; weights[0] = weights[1];
3574 weights[1] = weights[2]; weights[2] = w;
3577 w = weights[0]; weights[0] = weights[1]; weights[1] = w;
3580 else if ( weights[0] > weights[2] ) {
3581 w = weights[0]; weights[0] = weights[2];
3582 weights[2] = weights[1]; weights[1] = w;
3584 else if ( weights[1] > weights[2] ) {
3585 w = weights[1]; weights[1] = weights[2]; weights[2] = w;
3588 else if ( number == 2 ) {
3589 if ( weights[0] > weights[1] ) {
3590 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 *)