46 int 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];
58 MLOCK(ErrorMessageLock);
59 MesPrint(
"Internal error. Could not find proper factorin_ function.");
60 MUNLOCK(ErrorMessageLock);
63 oldwork = AT.WorkPointer;
64 d = Dollars + t[FUNHEAD+1];
67 int nummodopt, dtype = -1;
68 if ( AS.MultiThreaded ) {
69 for ( nummodopt = 0; nummodopt < NumModOptdollars; nummodopt++ ) {
70 if ( t[FUNHEAD+1] == ModOptdollars[nummodopt].number )
break;
72 if ( nummodopt < NumModOptdollars ) {
73 dtype = ModOptdollars[nummodopt].type;
74 if ( dtype == MODLOCAL ) {
75 d = ModOptdollars[nummodopt].dstruct+AT.identity;
82 if ( d->type == DOLTERMS ) {
85 else if ( ( d = DolToTerms(BHEAD t[FUNHEAD+1]) ) == 0 ) {
90 m = oldwork; n1 = term;
91 while ( n1 < t ) *m++ = *n1++;
92 n1 = t + t[1]; tstop = term + *term;
93 while ( n1 < tstop ) *m++ = *n1++;
94 *oldwork = m - oldwork;
96 if (
Generator(BHEAD oldwork,level) )
return(-1);
97 AT.WorkPointer = oldwork;
100 if ( d->where[0] == 0 ) {
101 if ( fromwhere == 0 ) {
102 if ( d->factors ) M_free(d->factors,
"Dollar factors");
103 M_free(d,
"Dollar in FactorIn_");
118 k = *mm - ABS((mm[*mm-1]));
119 for ( j = 0; j < k; j++ ) *m++ = *mm++;
125 mm = d->where + d->where[0];
131 while ( m < mstop ) {
134 r1 += r1[1];
continue;
140 if ( *m == SYMBOL ) {
141 n1 = m+2; n1stop = m+m[1];
143 while ( n1 < n1stop ) {
145 while ( n2 < n2stop ) {
146 if ( *n1 != *n2 ) { n2 += 2;
continue; }
148 if ( n2[1] < 0 ) { n2 += 2;
continue; }
149 if ( n2[1] < n1[1] ) n1[1] = n2[1];
152 if ( n2[1] > 0 ) { n2 += 2;
continue; }
153 if ( n2[1] > n1[1] ) n1[1] = n2[1];
157 if ( n2 >= n2stop ) {
158 if ( m[1] == 4 )
goto scratch;
161 while ( n4 < mstop ) *n3++ = *n4++;
162 *oldwork = n3 - oldwork;
163 mstop -= 2; n1stop -= 2;
174 else if ( *m == DOTPRODUCT ) {
175 n1 = m+2; n1stop = m+m[1];
177 while ( n1 < n1stop ) {
179 while ( n2 < n2stop ) {
180 if ( *n1 != *n2 || n1[1] != n2[1] ) { n2 += 3;
continue; }
182 if ( n2[2] < 0 ) { n2 += 3;
continue; }
183 if ( n2[2] < n1[2] ) n1[2] = n2[2];
186 if ( n2[2] > 0 ) { n2 += 3;
continue; }
187 if ( n2[2] > n1[2] ) n1[2] = n2[2];
191 if ( n2 >= n2stop ) {
192 if ( m[1] == 5 )
goto scratch;
195 while ( n4 < mstop ) *n3++ = *n4++;
196 *oldwork = n3 - oldwork;
197 mstop -= 3; n1stop -= 3;
208 else if ( *m == VECTOR ) {
213 n1 = m+2; n1stop = m+m[1];
214 n2 = r1+2;n2stop = r1+r1[1];
215 while ( n1 < n1stop ) {
216 while ( n2 < n2stop ) {
217 if ( *n1 == *n2 && n1[1] == n2[1] ) {
218 n2 += 2;
goto nextn1;
222 if ( n2 >= n2stop ) {
223 if ( m[1] == 4 )
goto scratch;
226 while ( n4 < mstop ) *n3++ = *n4++;
227 *oldwork = n3 - oldwork;
228 mstop -= 2; n1stop -= 2;
244 if ( m[1] != r1[1] ) { r1 += r1[1];
continue; }
245 for ( j = 2; j < m[1]; j++ ) {
246 if ( m[j] != r1[j] )
break;
248 if ( j < m[1] ) { r1 += r1[1];
continue; }
258 r3 = m + m[1]; r4 = m;
259 while ( r3 < mstop ) *r4++ = *r3++;
260 *oldwork = r4 - oldwork;
261 if ( *oldwork == 1 )
goto nofactor;
277 GCDbuffer = NumberMalloc(
"FactorIn"); GCDbuffer2 = NumberMalloc(
"FactorIn");
278 LCMbuffer = NumberMalloc(
"FactorIn"); LCMb = NumberMalloc(
"FactorIn"); LCMc = NumberMalloc(
"FactorIn");
288 while ( ( k > 1 ) && ( r3[k-1] == 0 ) ) k--;
289 for ( kGCD = 0; kGCD < k; kGCD++ ) GCDbuffer[kGCD] = r3[kGCD];
293 while ( ( k > 1 ) && ( r3[k-1] == 0 ) ) k--;
294 for ( kLCM = 0; kLCM < k; kLCM++ ) LCMbuffer[kLCM] = r3[kLCM];
305 while ( ( k > 1 ) && ( r3[k-1] == 0 ) ) k--;
306 if ( ( ( GCDbuffer[0] == 1 ) && ( kGCD == 1 ) ) ) {
311 else if ( ( ( k != 1 ) || ( r3[0] != 1 ) ) ) {
312 if ( GcdLong(BHEAD GCDbuffer,kGCD,(UWORD *)r3,k,GCDbuffer2,&kGCD2) ) {
316 for ( i = 0; i < kGCD; i++ ) GCDbuffer[i] = GCDbuffer2[i];
319 kGCD = 1; GCDbuffer[0] = 1;
324 while ( ( k > 1 ) && ( r3[k-1] == 0 ) ) k--;
325 if ( ( ( LCMbuffer[0] == 1 ) && ( kLCM == 1 ) ) ) {
326 for ( kLCM = 0; kLCM < k; kLCM++ )
327 LCMbuffer[kLCM] = r3[kLCM];
329 else if ( ( k != 1 ) || ( r3[0] != 1 ) ) {
330 if ( GcdLong(BHEAD LCMbuffer,kLCM,(UWORD *)r3,k,LCMb,&kkLCM) ) {
333 DivLong((UWORD *)r3,k,LCMb,kkLCM,LCMb,&kkLCM,LCMc,&jLCM);
334 MulLong(LCMbuffer,kLCM,LCMb,kkLCM,LCMc,&jLCM);
335 for ( kLCM = 0; kLCM < jLCM; kLCM++ )
336 LCMbuffer[kLCM] = LCMc[kLCM];
344 r3 = (WORD *)(GCDbuffer);
345 if ( kGCD == kLCM ) {
346 for ( jGCD = 0; jGCD < kGCD; jGCD++ )
347 r3[jGCD+kGCD] = LCMbuffer[jGCD];
350 else if ( kGCD > kLCM ) {
351 for ( jGCD = 0; jGCD < kLCM; jGCD++ )
352 r3[jGCD+kGCD] = LCMbuffer[jGCD];
353 for ( jGCD = kLCM; jGCD < kGCD; jGCD++ )
358 for ( jGCD = kGCD; jGCD < kLCM; jGCD++ )
360 for ( jGCD = 0; jGCD < kLCM; jGCD++ )
361 r3[jGCD+kLCM] = LCMbuffer[jGCD];
365 mm = m = oldwork + oldwork[0];
370 while ( n1 < t ) *m++ = *n1++;
373 while ( n2 < mm ) *m++ = *n2++;
374 while ( n1 < tstop ) *m++ = *n1++;
378 size = term[*term-1];
379 size = REDLENG(size);
380 if ( MulRat(BHEAD (UWORD *)tstop,size,(UWORD *)r3,k,
381 (UWORD *)m,&size) )
goto onerror;
382 size = INCLENG(size);
383 k = size < 0 ? -size: size;
386 *mm = (WORD)(m - mm);
388 if (
Generator(BHEAD mm,level) )
goto onerror;
389 AT.WorkPointer = oldwork;
390 if ( fromwhere == 0 ) {
391 if ( d->factors ) M_free(d->factors,
"Dollar factors");
392 M_free(d,
"Dollar in FactorIn");
394 NumberFree(GCDbuffer,
"FactorIn"); NumberFree(GCDbuffer2,
"FactorIn");
395 NumberFree(LCMbuffer,
"FactorIn"); NumberFree(LCMb,
"FactorIn"); NumberFree(LCMc,
"FactorIn");
398 AT.WorkPointer = oldwork;
399 MLOCK(ErrorMessageLock);
401 MUNLOCK(ErrorMessageLock);
402 NumberFree(GCDbuffer,
"FactorIn"); NumberFree(GCDbuffer2,
"FactorIn");
403 NumberFree(LCMbuffer,
"FactorIn"); NumberFree(LCMb,
"FactorIn"); NumberFree(LCMc,
"FactorIn");
421 int FactorInExpr(PHEAD WORD *term, WORD level)
424 WORD *t, *tstop, *m, *oldwork, *mstop, *n1, *n2, *n3, *n4, *n1stop, *n2stop;
425 WORD *r1, *r2, *r3, *r4, j, k, kGCD, kGCD2, kLCM, jGCD, kkLCM, jLCM, size, sign;
426 WORD *newterm, expr = 0;
427 WORD olddeferflag = AR.DeferFlag, oldgetfile = AR.GetFile, oldhold = AR.KeptInHold;
428 WORD newgetfile, newhold;
432 POSITION position, oldposition, startposition;
433 WORD *oldcpointer = AR.CompressPointer;
434 UWORD *GCDbuffer, *GCDbuffer2, *LCMbuffer, *LCMb, *LCMc;
435 GCDbuffer = NumberMalloc(
"FactorInExpr"); GCDbuffer2 = NumberMalloc(
"FactorInExpr");
436 LCMbuffer = NumberMalloc(
"FactorInExpr"); LCMb = NumberMalloc(
"FactorInExpr"); LCMc = NumberMalloc(
"FactorInExpr");
437 t = term; GETSTOP(t,tstop); t++;
438 while ( t < tstop ) {
439 if ( *t == FACTORIN && t[1] == FUNHEAD+2 && t[FUNHEAD] == -EXPRESSION ) {
446 MLOCK(ErrorMessageLock);
447 MesPrint(
"Internal error. Could not find proper factorin_ function.");
448 MUNLOCK(ErrorMessageLock);
449 NumberFree(GCDbuffer,
"FactorInExpr"); NumberFree(GCDbuffer2,
"FactorInExpr");
450 NumberFree(LCMbuffer,
"FactorInExpr"); NumberFree(LCMb,
"FactorInExpr"); NumberFree(LCMc,
"FactorInExpr");
453 oldwork = AT.WorkPointer;
454 if ( AT.previousEfactor && ( expr == AT.previousEfactor[0] ) ) {
466 e = Expressions + expr;
467 switch ( e->status ) {
468 case LOCALEXPRESSION:
469 case SKIPLEXPRESSION:
470 case DROPLEXPRESSION:
471 case GLOBALEXPRESSION:
472 case SKIPGEXPRESSION:
473 case DROPGEXPRESSION:
483 case HIDDENLEXPRESSION:
484 case HIDDENGEXPRESSION:
485 case HIDELEXPRESSION:
486 case HIDEGEXPRESSION:
487 case DROPHLEXPRESSION:
488 case DROPHGEXPRESSION:
489 case UNHIDELEXPRESSION:
490 case UNHIDEGEXPRESSION:
500 case STOREDEXPRESSION:
504 MLOCK(ErrorMessageLock);
505 MesPrint(
"Error: factorin_ cannot determine factors in stored expressions.");
506 MUNLOCK(ErrorMessageLock);
507 NumberFree(GCDbuffer,
"FactorInExpr"); NumberFree(GCDbuffer2,
"FactorInExpr");
508 NumberFree(LCMbuffer,
"FactorInExpr"); NumberFree(LCMb,
"FactorInExpr"); NumberFree(LCMc,
"FactorInExpr");
510 case DROPPEDEXPRESSION:
514 m = oldwork; n1 = term;
515 while ( n1 < t ) *m++ = *n1++;
516 n1 = t + t[1]; tstop = term + *term;
517 while ( n1 < tstop ) *m++ = *n1++;
518 *oldwork = m - oldwork;
521 NumberFree(GCDbuffer,
"FactorInExpr"); NumberFree(GCDbuffer2,
"FactorInExpr");
522 NumberFree(LCMbuffer,
"FactorInExpr"); NumberFree(LCMb,
"FactorInExpr"); NumberFree(LCMc,
"FactorInExpr");
525 AT.WorkPointer = oldwork;
526 NumberFree(GCDbuffer,
"FactorInExpr"); NumberFree(GCDbuffer2,
"FactorInExpr");
527 NumberFree(LCMbuffer,
"FactorInExpr"); NumberFree(LCMb,
"FactorInExpr"); NumberFree(LCMc,
"FactorInExpr");
530 MLOCK(ErrorMessageLock);
531 MesPrint(
"Error: Illegal expression in factorinexpr.");
532 MUNLOCK(ErrorMessageLock);
533 NumberFree(GCDbuffer,
"FactorInExpr"); NumberFree(GCDbuffer2,
"FactorInExpr");
534 NumberFree(LCMbuffer,
"FactorInExpr"); NumberFree(LCMb,
"FactorInExpr"); NumberFree(LCMc,
"FactorInExpr");
542 position = AS.OldOnFile[expr];
543 AR.DeferFlag = 0; AR.KeptInHold = newhold; AR.GetFile = newgetfile;
544 SeekScratch(file,&oldposition);
545 SetScratch(file,&position);
546 if ( GetTerm(BHEAD oldwork) <= 0 ) {
547 MLOCK(ErrorMessageLock);
548 MesPrint(
"(5) Expression %d has problems in scratchfile",expr);
549 MUNLOCK(ErrorMessageLock);
550 NumberFree(GCDbuffer,
"FactorInExpr"); NumberFree(GCDbuffer2,
"FactorInExpr");
551 NumberFree(LCMbuffer,
"FactorInExpr"); NumberFree(LCMb,
"FactorInExpr"); NumberFree(LCMc,
"FactorInExpr");
554 SeekScratch(file,&startposition);
555 SeekScratch(file,&position);
559 if ( GetTerm(BHEAD oldwork) == 0 ) {
560 SetScratch(file,&oldposition);
561 AR.DeferFlag = olddeferflag;
562 oldwork[0] = 4; oldwork[1] = 1; oldwork[2] = 1; oldwork[3] = 3;
565 SeekScratch(file,&position);
566 AR.DeferFlag = olddeferflag; AR.KeptInHold = oldhold; AR.GetFile = oldgetfile;
568 r2 = m = oldwork + *oldwork;
571 *oldwork = (WORD)(m-oldwork);
572 AT.WorkPointer = newterm = mstop = m;
578 if ( k < 0 ) { k = -k; sign = -1; }
580 while ( ( k > 1 ) && ( r3[k-1] == 0 ) ) k--;
581 for ( kGCD = 0; kGCD < k; kGCD++ ) GCDbuffer[kGCD] = r3[kGCD];
585 while ( ( k > 1 ) && ( r3[k-1] == 0 ) ) k--;
586 for ( kLCM = 0; kLCM < k; kLCM++ ) LCMbuffer[kLCM] = r3[kLCM];
591 AR.DeferFlag = 0; AR.KeptInHold = newhold; AR.GetFile = newgetfile;
592 SetScratch(file,&position);
593 size = GetTerm(BHEAD newterm);
594 SeekScratch(file,&position);
595 AR.DeferFlag = olddeferflag; AR.KeptInHold = oldhold; AR.GetFile = oldgetfile;
596 if ( size == 0 )
break;
598 r2 = newterm + *newterm;
601 while ( m < mstop ) {
604 r1 += r1[1];
continue;
610 if ( *m == SYMBOL ) {
611 n1 = m+2; n1stop = m+m[1];
613 while ( n1 < n1stop ) {
615 while ( n2 < n2stop ) {
616 if ( *n1 != *n2 ) { n2 += 2;
continue; }
618 if ( n2[1] < 0 ) { n2 += 2;
continue; }
619 if ( n2[1] < n1[1] ) n1[1] = n2[1];
622 if ( n2[1] > 0 ) { n2 += 2;
continue; }
623 if ( n2[1] > n1[1] ) n1[1] = n2[1];
627 if ( n2 >= n2stop ) {
628 if ( m[1] == 4 )
goto scratch;
631 while ( n4 < mstop ) *n3++ = *n4++;
632 *oldwork = n3 - oldwork;
633 mstop -= 2; n1stop -= 2;
644 else if ( *m == DOTPRODUCT ) {
645 n1 = m+2; n1stop = m+m[1];
647 while ( n1 < n1stop ) {
649 while ( n2 < n2stop ) {
650 if ( *n1 != *n2 || n1[1] != n2[1] ) { n2 += 3;
continue; }
652 if ( n2[2] < 0 ) { n2 += 3;
continue; }
653 if ( n2[2] < n1[2] ) n1[2] = n2[2];
656 if ( n2[2] > 0 ) { n2 += 3;
continue; }
657 if ( n2[2] > n1[2] ) n1[2] = n2[2];
661 if ( n2 >= n2stop ) {
662 if ( m[1] == 5 )
goto scratch;
665 while ( n4 < mstop ) *n3++ = *n4++;
666 *oldwork = n3 - oldwork;
667 mstop -= 3; n1stop -= 3;
678 else if ( *m == VECTOR ) {
683 n1 = m+2; n1stop = m+m[1];
684 n2 = r1+2;n2stop = r1+r1[1];
685 while ( n1 < n1stop ) {
686 while ( n2 < n2stop ) {
687 if ( *n1 == *n2 && n1[1] == n2[1] ) {
688 n2 += 2;
goto nextn1;
692 if ( n2 >= n2stop ) {
693 if ( m[1] == 4 )
goto scratch;
696 while ( n4 < mstop ) *n3++ = *n4++;
697 *oldwork = n3 - oldwork;
698 mstop -= 2; n1stop -= 2;
714 if ( m[1] != r1[1] ) { r1 += r1[1];
continue; }
715 for ( j = 2; j < m[1]; j++ ) {
716 if ( m[j] != r1[j] )
break;
718 if ( j < m[1] ) { r1 += r1[1];
continue; }
728 r3 = m + m[1]; r4 = m;
729 while ( r3 < mstop ) *r4++ = *r3++;
730 *oldwork = r4 - oldwork;
731 if ( *oldwork == 1 )
goto nofactor;
743 r2 = newterm + *newterm;
748 while ( ( k > 1 ) && ( r3[k-1] == 0 ) ) k--;
749 if ( ( ( GCDbuffer[0] == 1 ) && ( kGCD == 1 ) ) ) {
754 else if ( ( ( k != 1 ) || ( r3[0] != 1 ) ) ) {
755 if ( GcdLong(BHEAD GCDbuffer,kGCD,(UWORD *)r3,k,GCDbuffer2,&kGCD2) ) {
759 for ( i = 0; i < kGCD; i++ ) GCDbuffer[i] = GCDbuffer2[i];
762 kGCD = 1; GCDbuffer[0] = 1;
767 while ( ( k > 1 ) && ( r3[k-1] == 0 ) ) k--;
768 if ( ( ( LCMbuffer[0] == 1 ) && ( kLCM == 1 ) ) ) {
769 for ( kLCM = 0; kLCM < k; kLCM++ )
770 LCMbuffer[kLCM] = r3[kLCM];
772 else if ( ( k != 1 ) || ( r3[0] != 1 ) ) {
773 if ( GcdLong(BHEAD LCMbuffer,kLCM,(UWORD *)r3,k,LCMb,&kkLCM) ) {
776 DivLong((UWORD *)r3,k,LCMb,kkLCM,LCMb,&kkLCM,LCMc,&jLCM);
777 MulLong(LCMbuffer,kLCM,LCMb,kkLCM,LCMc,&jLCM);
778 for ( kLCM = 0; kLCM < jLCM; kLCM++ )
779 LCMbuffer[kLCM] = LCMc[kLCM];
783 SetScratch(file,&oldposition);
784 AR.DeferFlag = olddeferflag;
789 r3 = (WORD *)(GCDbuffer);
790 r4 = (WORD *)(LCMbuffer);
791 r1 = oldwork + *oldwork;
792 if ( kGCD == kLCM ) {
793 for ( jGCD = 0; jGCD < kGCD; jGCD++ ) *r1++ = *r3++;
794 for ( jGCD = 0; jGCD < kGCD; jGCD++ ) *r1++ = *r4++;
797 else if ( kGCD > kLCM ) {
798 for ( jGCD = 0; jGCD < kGCD; jGCD++ ) *r1++ = *r3++;
799 for ( jGCD = 0; jGCD < kLCM; jGCD++ ) *r1++ = *r4++;
800 for ( jGCD = kLCM; jGCD < kGCD; jGCD++ ) *r1++ = 0;
804 for ( jGCD = 0; jGCD < kGCD; jGCD++ ) *r1++ = *r3++;
805 for ( jGCD = kGCD; jGCD < kLCM; jGCD++ ) *r1++ = 0;
806 for ( jGCD = 0; jGCD < kLCM; jGCD++ ) *r1++ = *r4++;
809 if ( sign < 0 ) *r1++ = -k;
811 *oldwork = (WORD)(r1-oldwork);
816 if ( AT.previousEfactor ) M_free(AT.previousEfactor,
"Efactor cache");
817 AT.previousEfactor = (WORD *)Malloc1((*oldwork+2)*
sizeof(WORD),
"Efactor cache");
818 AT.previousEfactor[0] = expr;
819 r1 = oldwork; r2 = AT.previousEfactor + 2; k = *oldwork;
821 AT.previousEfactor[1] = 0;
826 if ( AT.WorkPointer + AT.previousEfactor[2] >= AT.WorkTop ) {
827 MLOCK(ErrorMessageLock);
829 MesPrint(
"Called from factorin_");
830 MUNLOCK(ErrorMessageLock);
831 NumberFree(GCDbuffer,
"FactorInExpr"); NumberFree(GCDbuffer2,
"FactorInExpr");
832 NumberFree(LCMbuffer,
"FactorInExpr"); NumberFree(LCMb,
"FactorInExpr"); NumberFree(LCMc,
"FactorInExpr");
835 n1 = oldwork; n2 = term;
while ( n2 < t ) *n1++ = *n2++;
836 n2 = AT.previousEfactor+2; GETSTOP(n2,n2stop); n3 = n2 + *n2;
837 n2++;
while ( n2 < n2stop ) *n1++ = *n2++;
838 n2 = t + t[1];
while ( n2 < tstop ) *n1++ = *n2++;
839 size = term[*term-1];
840 size = REDLENG(size);
841 k = n3[-1]; k = REDLENG(k);
842 if ( MulRat(BHEAD (UWORD *)tstop,size,(UWORD *)n2stop,k,
843 (UWORD *)n1,&size) )
goto onerror;
844 size = INCLENG(size);
845 k = size < 0 ? -size: size;
846 n1 += k; n1[-1] = size;
847 *oldwork = n1 - oldwork;
850 NumberFree(GCDbuffer,
"FactorInExpr"); NumberFree(GCDbuffer2,
"FactorInExpr");
851 NumberFree(LCMbuffer,
"FactorInExpr"); NumberFree(LCMb,
"FactorInExpr"); NumberFree(LCMc,
"FactorInExpr");
854 AT.WorkPointer = oldwork;
855 AR.CompressPointer = oldcpointer;
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 MLOCK(ErrorMessageLock);
863 MesCall(
"FactorInExpr");
864 MUNLOCK(ErrorMessageLock);
865 NumberFree(GCDbuffer,
"FactorInExpr"); NumberFree(GCDbuffer2,
"FactorInExpr");
866 NumberFree(LCMbuffer,
"FactorInExpr"); NumberFree(LCMb,
"FactorInExpr"); NumberFree(LCMc,
"FactorInExpr");
WORD Generator(PHEAD WORD *, WORD)