46int FactorIn(PHEAD WORD *term, WORD level)
49 WORD *t, *tstop, *m, *mm, *oldwork, *mstop, *n1, *n2, *n3, *n4, *n1stop, *n2stop;
50 WORD *r1, *r2, *r3, *r4, j, k, kGCD, kGCD2, kLCM, jGCD, kkLCM, jLCM, size;
51 UWORD *GCDbuffer, *GCDbuffer2, *LCMbuffer, *LCMb, *LCMc;
54 t = term; GETSTOP(t,tstop); t++;
55 while ( ( t < tstop ) && ( *t != FACTORIN || ( ( *t == FACTORIN )
56 && ( t[FUNHEAD] != -DOLLAREXPRESSION || t[1] != FUNHEAD+2 ) ) ) ) t += t[1];
59 MLOCK(ErrorMessageLock);
60 MesPrint(
"!>Internal error. Could not find proper factorin_ function.");
61 MUNLOCK(ErrorMessageLock);
65 oldwork = AT.WorkPointer;
66 d = Dollars + t[FUNHEAD+1];
69 int nummodopt, dtype = -1;
70 if ( AS.MultiThreaded ) {
71 for ( nummodopt = 0; nummodopt < NumModOptdollars; nummodopt++ ) {
72 if ( t[FUNHEAD+1] == ModOptdollars[nummodopt].number )
break;
74 if ( nummodopt < NumModOptdollars ) {
75 dtype = ModOptdollars[nummodopt].type;
76 if ( DollarLocalCopy(dtype) ) {
77 d = ModOptdollars[nummodopt].dstruct+AT.identity;
84 if ( d->type == DOLTERMS ) {
87 else if ( ( d = DolToTerms(BHEAD t[FUNHEAD+1]) ) == 0 ) {
92 m = oldwork; n1 = term;
93 while ( n1 < t ) *m++ = *n1++;
94 n1 = t + t[1]; tstop = term + *term;
95 while ( n1 < tstop ) *m++ = *n1++;
96 *oldwork = m - oldwork;
98 if (
Generator(BHEAD oldwork,level) )
return(-1);
99 AT.WorkPointer = oldwork;
102 if ( d->where[0] == 0 ) {
103 if ( fromwhere == 0 ) {
104 if ( d->factors ) M_free(d->factors,
"Dollar factors");
105 M_free(d,
"Dollar in FactorIn_");
120 k = *mm - ABS((mm[*mm-1]));
121 for ( j = 0; j < k; j++ ) *m++ = *mm++;
127 mm = d->where + d->where[0];
133 while ( m < mstop ) {
136 r1 += r1[1];
continue;
142 if ( *m == SYMBOL ) {
143 n1 = m+2; n1stop = m+m[1];
145 while ( n1 < n1stop ) {
147 while ( n2 < n2stop ) {
148 if ( *n1 != *n2 ) { n2 += 2;
continue; }
150 if ( n2[1] < 0 ) { n2 += 2;
continue; }
151 if ( n2[1] < n1[1] ) n1[1] = n2[1];
154 if ( n2[1] > 0 ) { n2 += 2;
continue; }
155 if ( n2[1] > n1[1] ) n1[1] = n2[1];
159 if ( n2 >= n2stop ) {
160 if ( m[1] == 4 )
goto scratch;
163 while ( n4 < mstop ) *n3++ = *n4++;
164 *oldwork = n3 - oldwork;
165 mstop -= 2; n1stop -= 2;
176 else if ( *m == DOTPRODUCT ) {
177 n1 = m+2; n1stop = m+m[1];
179 while ( n1 < n1stop ) {
181 while ( n2 < n2stop ) {
182 if ( *n1 != *n2 || n1[1] != n2[1] ) { n2 += 3;
continue; }
184 if ( n2[2] < 0 ) { n2 += 3;
continue; }
185 if ( n2[2] < n1[2] ) n1[2] = n2[2];
188 if ( n2[2] > 0 ) { n2 += 3;
continue; }
189 if ( n2[2] > n1[2] ) n1[2] = n2[2];
193 if ( n2 >= n2stop ) {
194 if ( m[1] == 5 )
goto scratch;
197 while ( n4 < mstop ) *n3++ = *n4++;
198 *oldwork = n3 - oldwork;
199 mstop -= 3; n1stop -= 3;
210 else if ( *m == VECTOR ) {
215 n1 = m+2; n1stop = m+m[1];
216 n2 = r1+2;n2stop = r1+r1[1];
217 while ( n1 < n1stop ) {
218 while ( n2 < n2stop ) {
219 if ( *n1 == *n2 && n1[1] == n2[1] ) {
220 n2 += 2;
goto nextn1;
224 if ( n2 >= n2stop ) {
225 if ( m[1] == 4 )
goto scratch;
228 while ( n4 < mstop ) *n3++ = *n4++;
229 *oldwork = n3 - oldwork;
230 mstop -= 2; n1stop -= 2;
246 if ( m[1] != r1[1] ) { r1 += r1[1];
continue; }
247 for ( j = 2; j < m[1]; j++ ) {
248 if ( m[j] != r1[j] )
break;
250 if ( j < m[1] ) { r1 += r1[1];
continue; }
260 r3 = m + m[1]; r4 = m;
261 while ( r3 < mstop ) *r4++ = *r3++;
262 *oldwork = r4 - oldwork;
263 if ( *oldwork == 1 )
goto nofactor;
279 GCDbuffer = NumberMalloc(
"FactorIn"); GCDbuffer2 = NumberMalloc(
"FactorIn");
280 LCMbuffer = NumberMalloc(
"FactorIn"); LCMb = NumberMalloc(
"FactorIn"); LCMc = NumberMalloc(
"FactorIn");
290 while ( ( k > 1 ) && ( r3[k-1] == 0 ) ) k--;
291 for ( kGCD = 0; kGCD < k; kGCD++ ) GCDbuffer[kGCD] = r3[kGCD];
295 while ( ( k > 1 ) && ( r3[k-1] == 0 ) ) k--;
296 for ( kLCM = 0; kLCM < k; kLCM++ ) LCMbuffer[kLCM] = r3[kLCM];
307 while ( ( k > 1 ) && ( r3[k-1] == 0 ) ) k--;
308 if ( ( ( GCDbuffer[0] == 1 ) && ( kGCD == 1 ) ) ) {
313 else if ( ( ( k != 1 ) || ( r3[0] != 1 ) ) ) {
314 if ( GcdLong(BHEAD GCDbuffer,kGCD,(UWORD *)r3,k,GCDbuffer2,&kGCD2) ) {
318 for ( i = 0; i < kGCD; i++ ) GCDbuffer[i] = GCDbuffer2[i];
321 kGCD = 1; GCDbuffer[0] = 1;
326 while ( ( k > 1 ) && ( r3[k-1] == 0 ) ) k--;
327 if ( ( ( LCMbuffer[0] == 1 ) && ( kLCM == 1 ) ) ) {
328 for ( kLCM = 0; kLCM < k; kLCM++ )
329 LCMbuffer[kLCM] = r3[kLCM];
331 else if ( ( k != 1 ) || ( r3[0] != 1 ) ) {
332 if ( GcdLong(BHEAD LCMbuffer,kLCM,(UWORD *)r3,k,LCMb,&kkLCM) ) {
335 DivLong((UWORD *)r3,k,LCMb,kkLCM,LCMb,&kkLCM,LCMc,&jLCM);
336 MulLong(LCMbuffer,kLCM,LCMb,kkLCM,LCMc,&jLCM);
337 for ( kLCM = 0; kLCM < jLCM; kLCM++ )
338 LCMbuffer[kLCM] = LCMc[kLCM];
346 r3 = (WORD *)(GCDbuffer);
347 if ( kGCD == kLCM ) {
348 for ( jGCD = 0; jGCD < kGCD; jGCD++ )
349 r3[jGCD+kGCD] = LCMbuffer[jGCD];
352 else if ( kGCD > kLCM ) {
353 for ( jGCD = 0; jGCD < kLCM; jGCD++ )
354 r3[jGCD+kGCD] = LCMbuffer[jGCD];
355 for ( jGCD = kLCM; jGCD < kGCD; jGCD++ )
360 for ( jGCD = kGCD; jGCD < kLCM; jGCD++ )
362 for ( jGCD = 0; jGCD < kLCM; jGCD++ )
363 r3[jGCD+kLCM] = LCMbuffer[jGCD];
367 mm = m = oldwork + oldwork[0];
372 while ( n1 < t ) *m++ = *n1++;
375 while ( n2 < mm ) *m++ = *n2++;
376 while ( n1 < tstop ) *m++ = *n1++;
380 size = term[*term-1];
381 size = REDLENG(size);
382 if ( MulRat(BHEAD (UWORD *)tstop,size,(UWORD *)r3,k,
383 (UWORD *)m,&size) )
goto onerror;
384 size = INCLENG(size);
385 k = size < 0 ? -size: size;
388 *mm = (WORD)(m - mm);
390 if (
Generator(BHEAD mm,level) )
goto onerror;
391 AT.WorkPointer = oldwork;
392 if ( fromwhere == 0 ) {
393 if ( d->factors ) M_free(d->factors,
"Dollar factors");
394 M_free(d,
"Dollar in FactorIn");
396 NumberFree(GCDbuffer,
"FactorIn"); NumberFree(GCDbuffer2,
"FactorIn");
397 NumberFree(LCMbuffer,
"FactorIn"); NumberFree(LCMb,
"FactorIn"); NumberFree(LCMc,
"FactorIn");
400 AT.WorkPointer = oldwork;
401 MLOCK(ErrorMessageLock);
403 MUNLOCK(ErrorMessageLock);
404 NumberFree(GCDbuffer,
"FactorIn"); NumberFree(GCDbuffer2,
"FactorIn");
405 NumberFree(LCMbuffer,
"FactorIn"); NumberFree(LCMb,
"FactorIn"); NumberFree(LCMc,
"FactorIn");
423int FactorInExpr(PHEAD WORD *term, WORD level)
426 WORD *t, *tstop, *m, *oldwork, *mstop, *n1, *n2, *n3, *n4, *n1stop, *n2stop;
427 WORD *r1, *r2, *r3, *r4, j, k, kGCD, kGCD2, kLCM, jGCD, kkLCM, jLCM, size, sign;
428 WORD *newterm, expr = 0;
429 WORD olddeferflag = AR.DeferFlag, oldgetfile = AR.GetFile, oldhold = AR.KeptInHold;
430 WORD newgetfile, newhold;
434 POSITION position, oldposition, startposition;
435 WORD *oldcpointer = AR.CompressPointer;
436 UWORD *GCDbuffer, *GCDbuffer2, *LCMbuffer, *LCMb, *LCMc;
437 GCDbuffer = NumberMalloc(
"FactorInExpr"); GCDbuffer2 = NumberMalloc(
"FactorInExpr");
438 LCMbuffer = NumberMalloc(
"FactorInExpr"); LCMb = NumberMalloc(
"FactorInExpr"); LCMc = NumberMalloc(
"FactorInExpr");
439 t = term; GETSTOP(t,tstop); t++;
440 while ( t < tstop ) {
441 if ( *t == FACTORIN && t[1] == FUNHEAD+2 && t[FUNHEAD] == -EXPRESSION ) {
449 MLOCK(ErrorMessageLock);
450 MesPrint(
"!>Internal error. Could not find proper factorin_ function.");
451 MUNLOCK(ErrorMessageLock);
452 NumberFree(GCDbuffer,
"FactorInExpr"); NumberFree(GCDbuffer2,
"FactorInExpr");
453 NumberFree(LCMbuffer,
"FactorInExpr"); NumberFree(LCMb,
"FactorInExpr"); NumberFree(LCMc,
"FactorInExpr");
457 oldwork = AT.WorkPointer;
458 if ( AT.previousEfactor && ( expr == AT.previousEfactor[0] ) ) {
470 e = Expressions + expr;
471 switch ( e->status ) {
472 case LOCALEXPRESSION:
473 case SKIPLEXPRESSION:
474 case DROPLEXPRESSION:
475 case GLOBALEXPRESSION:
476 case SKIPGEXPRESSION:
477 case DROPGEXPRESSION:
487 case HIDDENLEXPRESSION:
488 case HIDDENGEXPRESSION:
489 case HIDELEXPRESSION:
490 case HIDEGEXPRESSION:
491 case DROPHLEXPRESSION:
492 case DROPHGEXPRESSION:
493 case UNHIDELEXPRESSION:
494 case UNHIDEGEXPRESSION:
504 case STOREDEXPRESSION:
508 MLOCK(ErrorMessageLock);
509 MesPrint(
"Error: factorin_ cannot determine factors in stored expressions.");
510 MUNLOCK(ErrorMessageLock);
511 NumberFree(GCDbuffer,
"FactorInExpr"); NumberFree(GCDbuffer2,
"FactorInExpr");
512 NumberFree(LCMbuffer,
"FactorInExpr"); NumberFree(LCMb,
"FactorInExpr"); NumberFree(LCMc,
"FactorInExpr");
514 case DROPPEDEXPRESSION:
518 m = oldwork; n1 = term;
519 while ( n1 < t ) *m++ = *n1++;
520 n1 = t + t[1]; tstop = term + *term;
521 while ( n1 < tstop ) *m++ = *n1++;
522 *oldwork = m - oldwork;
525 NumberFree(GCDbuffer,
"FactorInExpr"); NumberFree(GCDbuffer2,
"FactorInExpr");
526 NumberFree(LCMbuffer,
"FactorInExpr"); NumberFree(LCMb,
"FactorInExpr"); NumberFree(LCMc,
"FactorInExpr");
529 AT.WorkPointer = oldwork;
530 NumberFree(GCDbuffer,
"FactorInExpr"); NumberFree(GCDbuffer2,
"FactorInExpr");
531 NumberFree(LCMbuffer,
"FactorInExpr"); NumberFree(LCMb,
"FactorInExpr"); NumberFree(LCMc,
"FactorInExpr");
534 MLOCK(ErrorMessageLock);
535 MesPrint(
"Error: Illegal expression in factorinexpr.");
536 MUNLOCK(ErrorMessageLock);
537 NumberFree(GCDbuffer,
"FactorInExpr"); NumberFree(GCDbuffer2,
"FactorInExpr");
538 NumberFree(LCMbuffer,
"FactorInExpr"); NumberFree(LCMb,
"FactorInExpr"); NumberFree(LCMc,
"FactorInExpr");
546 position = AS.OldOnFile[expr];
547 AR.DeferFlag = 0; AR.KeptInHold = newhold; AR.GetFile = newgetfile;
548 SeekScratch(file,&oldposition);
549 SetScratch(file,&position);
550 if ( GetTerm(BHEAD oldwork) <= 0 ) {
552 MLOCK(ErrorMessageLock);
553 MesPrint(
"!>(5) Expression %d has problems in scratchfile",expr);
554 MUNLOCK(ErrorMessageLock);
555 NumberFree(GCDbuffer,
"FactorInExpr"); NumberFree(GCDbuffer2,
"FactorInExpr");
556 NumberFree(LCMbuffer,
"FactorInExpr"); NumberFree(LCMb,
"FactorInExpr"); NumberFree(LCMc,
"FactorInExpr");
560 SeekScratch(file,&startposition);
561 SeekScratch(file,&position);
565 if ( GetTerm(BHEAD oldwork) == 0 ) {
566 SetScratch(file,&oldposition);
567 AR.DeferFlag = olddeferflag;
568 oldwork[0] = 4; oldwork[1] = 1; oldwork[2] = 1; oldwork[3] = 3;
571 SeekScratch(file,&position);
572 AR.DeferFlag = olddeferflag; AR.KeptInHold = oldhold; AR.GetFile = oldgetfile;
574 r2 = m = oldwork + *oldwork;
577 *oldwork = (WORD)(m-oldwork);
578 AT.WorkPointer = newterm = mstop = m;
584 if ( k < 0 ) { k = -k; sign = -1; }
586 while ( ( k > 1 ) && ( r3[k-1] == 0 ) ) k--;
587 for ( kGCD = 0; kGCD < k; kGCD++ ) GCDbuffer[kGCD] = r3[kGCD];
591 while ( ( k > 1 ) && ( r3[k-1] == 0 ) ) k--;
592 for ( kLCM = 0; kLCM < k; kLCM++ ) LCMbuffer[kLCM] = r3[kLCM];
597 AR.DeferFlag = 0; AR.KeptInHold = newhold; AR.GetFile = newgetfile;
598 SetScratch(file,&position);
599 size = GetTerm(BHEAD newterm);
600 SeekScratch(file,&position);
601 AR.DeferFlag = olddeferflag; AR.KeptInHold = oldhold; AR.GetFile = oldgetfile;
602 if ( size == 0 )
break;
604 r2 = newterm + *newterm;
607 while ( m < mstop ) {
610 r1 += r1[1];
continue;
616 if ( *m == SYMBOL ) {
617 n1 = m+2; n1stop = m+m[1];
619 while ( n1 < n1stop ) {
621 while ( n2 < n2stop ) {
622 if ( *n1 != *n2 ) { n2 += 2;
continue; }
624 if ( n2[1] < 0 ) { n2 += 2;
continue; }
625 if ( n2[1] < n1[1] ) n1[1] = n2[1];
628 if ( n2[1] > 0 ) { n2 += 2;
continue; }
629 if ( n2[1] > n1[1] ) n1[1] = n2[1];
633 if ( n2 >= n2stop ) {
634 if ( m[1] == 4 )
goto scratch;
637 while ( n4 < mstop ) *n3++ = *n4++;
638 *oldwork = n3 - oldwork;
639 mstop -= 2; n1stop -= 2;
650 else if ( *m == DOTPRODUCT ) {
651 n1 = m+2; n1stop = m+m[1];
653 while ( n1 < n1stop ) {
655 while ( n2 < n2stop ) {
656 if ( *n1 != *n2 || n1[1] != n2[1] ) { n2 += 3;
continue; }
658 if ( n2[2] < 0 ) { n2 += 3;
continue; }
659 if ( n2[2] < n1[2] ) n1[2] = n2[2];
662 if ( n2[2] > 0 ) { n2 += 3;
continue; }
663 if ( n2[2] > n1[2] ) n1[2] = n2[2];
667 if ( n2 >= n2stop ) {
668 if ( m[1] == 5 )
goto scratch;
671 while ( n4 < mstop ) *n3++ = *n4++;
672 *oldwork = n3 - oldwork;
673 mstop -= 3; n1stop -= 3;
684 else if ( *m == VECTOR ) {
689 n1 = m+2; n1stop = m+m[1];
690 n2 = r1+2;n2stop = r1+r1[1];
691 while ( n1 < n1stop ) {
692 while ( n2 < n2stop ) {
693 if ( *n1 == *n2 && n1[1] == n2[1] ) {
694 n2 += 2;
goto nextn1;
698 if ( n2 >= n2stop ) {
699 if ( m[1] == 4 )
goto scratch;
702 while ( n4 < mstop ) *n3++ = *n4++;
703 *oldwork = n3 - oldwork;
704 mstop -= 2; n1stop -= 2;
720 if ( m[1] != r1[1] ) { r1 += r1[1];
continue; }
721 for ( j = 2; j < m[1]; j++ ) {
722 if ( m[j] != r1[j] )
break;
724 if ( j < m[1] ) { r1 += r1[1];
continue; }
734 r3 = m + m[1]; r4 = m;
735 while ( r3 < mstop ) *r4++ = *r3++;
736 *oldwork = r4 - oldwork;
737 if ( *oldwork == 1 )
goto nofactor;
749 r2 = newterm + *newterm;
754 while ( ( k > 1 ) && ( r3[k-1] == 0 ) ) k--;
755 if ( ( ( GCDbuffer[0] == 1 ) && ( kGCD == 1 ) ) ) {
760 else if ( ( ( k != 1 ) || ( r3[0] != 1 ) ) ) {
761 if ( GcdLong(BHEAD GCDbuffer,kGCD,(UWORD *)r3,k,GCDbuffer2,&kGCD2) ) {
765 for ( i = 0; i < kGCD; i++ ) GCDbuffer[i] = GCDbuffer2[i];
768 kGCD = 1; GCDbuffer[0] = 1;
773 while ( ( k > 1 ) && ( r3[k-1] == 0 ) ) k--;
774 if ( ( ( LCMbuffer[0] == 1 ) && ( kLCM == 1 ) ) ) {
775 for ( kLCM = 0; kLCM < k; kLCM++ )
776 LCMbuffer[kLCM] = r3[kLCM];
778 else if ( ( k != 1 ) || ( r3[0] != 1 ) ) {
779 if ( GcdLong(BHEAD LCMbuffer,kLCM,(UWORD *)r3,k,LCMb,&kkLCM) ) {
782 DivLong((UWORD *)r3,k,LCMb,kkLCM,LCMb,&kkLCM,LCMc,&jLCM);
783 MulLong(LCMbuffer,kLCM,LCMb,kkLCM,LCMc,&jLCM);
784 for ( kLCM = 0; kLCM < jLCM; kLCM++ )
785 LCMbuffer[kLCM] = LCMc[kLCM];
789 SetScratch(file,&oldposition);
790 AR.DeferFlag = olddeferflag;
795 r3 = (WORD *)(GCDbuffer);
796 r4 = (WORD *)(LCMbuffer);
797 r1 = oldwork + *oldwork;
798 if ( kGCD == kLCM ) {
799 for ( jGCD = 0; jGCD < kGCD; jGCD++ ) *r1++ = *r3++;
800 for ( jGCD = 0; jGCD < kGCD; jGCD++ ) *r1++ = *r4++;
803 else if ( kGCD > kLCM ) {
804 for ( jGCD = 0; jGCD < kGCD; jGCD++ ) *r1++ = *r3++;
805 for ( jGCD = 0; jGCD < kLCM; jGCD++ ) *r1++ = *r4++;
806 for ( jGCD = kLCM; jGCD < kGCD; jGCD++ ) *r1++ = 0;
810 for ( jGCD = 0; jGCD < kGCD; jGCD++ ) *r1++ = *r3++;
811 for ( jGCD = kGCD; jGCD < kLCM; jGCD++ ) *r1++ = 0;
812 for ( jGCD = 0; jGCD < kLCM; jGCD++ ) *r1++ = *r4++;
815 if ( sign < 0 ) *r1++ = -k;
817 *oldwork = (WORD)(r1-oldwork);
822 if ( AT.previousEfactor ) M_free(AT.previousEfactor,
"Efactor cache");
823 AT.previousEfactor = (WORD *)Malloc1((*oldwork+2)*
sizeof(WORD),
"Efactor cache");
824 AT.previousEfactor[0] = expr;
825 r1 = oldwork; r2 = AT.previousEfactor + 2; k = *oldwork;
827 AT.previousEfactor[1] = 0;
832 if ( AT.WorkPointer + AT.previousEfactor[2] >= AT.WorkTop ) {
833 MLOCK(ErrorMessageLock);
835 MesPrint(
"Called from factorin_");
836 MUNLOCK(ErrorMessageLock);
837 NumberFree(GCDbuffer,
"FactorInExpr"); NumberFree(GCDbuffer2,
"FactorInExpr");
838 NumberFree(LCMbuffer,
"FactorInExpr"); NumberFree(LCMb,
"FactorInExpr"); NumberFree(LCMc,
"FactorInExpr");
841 n1 = oldwork; n2 = term;
while ( n2 < t ) *n1++ = *n2++;
842 n2 = AT.previousEfactor+2; GETSTOP(n2,n2stop); n3 = n2 + *n2;
843 n2++;
while ( n2 < n2stop ) *n1++ = *n2++;
844 n2 = t + t[1];
while ( n2 < tstop ) *n1++ = *n2++;
845 size = term[*term-1];
846 size = REDLENG(size);
847 k = n3[-1]; k = REDLENG(k);
848 if ( MulRat(BHEAD (UWORD *)tstop,size,(UWORD *)n2stop,k,
849 (UWORD *)n1,&size) )
goto onerror;
850 size = INCLENG(size);
851 k = size < 0 ? -size: size;
852 n1 += k; n1[-1] = size;
853 *oldwork = n1 - oldwork;
856 NumberFree(GCDbuffer,
"FactorInExpr"); NumberFree(GCDbuffer2,
"FactorInExpr");
857 NumberFree(LCMbuffer,
"FactorInExpr"); NumberFree(LCMb,
"FactorInExpr"); NumberFree(LCMc,
"FactorInExpr");
860 AT.WorkPointer = oldwork;
861 AR.CompressPointer = oldcpointer;
862 NumberFree(GCDbuffer,
"FactorInExpr"); NumberFree(GCDbuffer2,
"FactorInExpr");
863 NumberFree(LCMbuffer,
"FactorInExpr"); NumberFree(LCMb,
"FactorInExpr"); NumberFree(LCMc,
"FactorInExpr");
866 AT.WorkPointer = oldwork;
867 AR.CompressPointer = oldcpointer;
868 MLOCK(ErrorMessageLock);
869 MesCall(
"FactorInExpr");
870 MUNLOCK(ErrorMessageLock);
871 NumberFree(GCDbuffer,
"FactorInExpr"); NumberFree(GCDbuffer2,
"FactorInExpr");
872 NumberFree(LCMbuffer,
"FactorInExpr"); NumberFree(LCMb,
"FactorInExpr"); NumberFree(LCMc,
"FactorInExpr");
int Generator(PHEAD WORD *, WORD)