www.pudn.com > calc.rar > wrappers.c
#include#include #include "integer.h" #include "pI.h" #include "fun.h" #include "stack.h" #include "wrappers.h" #include "calc.h" /* Free MPI's. Free POLYI's. DO NOT FREE ARRAYS! or VARIABLES!*/ MPI *GCD_W(Stack s) { /* to free or not to free. That is the question. I say not! */ MPI *Aptr = stackPop(s); MPI *Bptr = stackPop(s); MPI *Result = GCD(Aptr, Bptr); FREEMPI(Aptr); FREEMPI(Bptr); return Result; } MPI *LCM_W(Stack s) { /* to free or not to free. That is the question. I say not! */ MPI *Aptr = stackPop(s); MPI *Bptr = stackPop(s); MPI *Result = LCM(Aptr, Bptr); FREEMPI(Aptr); FREEMPI(Bptr); return Result; } /* MPI *LCM_ARRAY(MPI *M[]) */ MPI *LCM_ARRAY_W(Stack s) { MPIA M = stackPop(s); MPI *Result; Result = LCM_ARRAY(M); return Result; } /*void SERRET(MPI *P, MPI **Xptr, MPI **Yptr)*/ void SERRET_W(Stack s) { MPI *P=stackPop(s); MPI **Xptr=stackPop(s); MPI **Yptr=stackPop(s); SERRET(P, Xptr, Yptr); FREEMPI(P); /* Notice I did not free Xptr or Ypr. They are variables */ } void LAGRANGE_W(Stack s) { POLYI P = stackPop(s); MPIA *AA = stackPop(s); MPI *M = stackPop(s); MPI *ZERO, *TEMP, *ONE, *G0, *G1, *GC, *H, *K, *DIFF; MPR *HH; POLYI Q,R; int d; if(DEGREEPI(P)<2){ printf("P is linear\n"); DELETEPI(P); FREEMPI(M); return; } TEMP=LEADPI(P); d=TEMP->S; FREEMPI(TEMP); if(d <0){ printf("leading coefficient is negative\n"); DELETEPI(P); FREEMPI(M); return; } ZERO=ZEROI(); TEMP=VALPI(P, ZERO); FREEMPI(ZERO); d=TEMP->S; FREEMPI(TEMP); if(d==0){ printf("P(0)=0\n"); DELETEPI(P); FREEMPI(M); return; } Q=DERIVPI(P); R=GCDPI(P,Q); DELETEPI(Q); d=DEGREEPI(R); DELETEPI(R); if(d>0){ printf("P has a repeated root\n"); DELETEPI(P); FREEMPI(M); return; } ONE=ONEI(); TEMP=VALPI(P, ONE); d=TEMP->S; FREEMPI(TEMP); FREEMPI(ONE); if(d==0){ printf("P(1)=0\n"); DELETEPI(P); FREEMPI(M); return; } /* now to check that P has but one positive root, also >1 */ ZERO=ZEROI(); ONE=ONEI(); G0=STURM_SEQUENCE(P, ZERO, ZERO); G1=STURM_SEQUENCE(P, ONE, ZERO); HH=CAUCHY(P); H=COPYI(HH->N); FREEMPR(HH); K=VALPI(P, H); d=K->S; FREEMPI(K); if(d==0){ TEMP=H; H=ADD0I(H,ONE); FREEMPI(TEMP); } GC=STURM_SEQUENCE(P, H, ZERO); FREEMPI(ZERO); FREEMPI(H); if(EQUALI(G0,G1)){ DIFF=SUB0I(G1,GC); if(RSV(DIFF,ONE)>0){ printf("P has "); PRINTI(DIFF); printf(" roots > 1\n"); FREEMPI(DIFF); FREEMPI(ONE); DELETEPI(P); FREEMPI(M); FREEMPI(G0); FREEMPI(G1); FREEMPI(GC); return; } if(DIFF->S==0){ printf("P has no roots > 1\n"); FREEMPI(DIFF); FREEMPI(ONE); DELETEPI(P); FREEMPI(M); FREEMPI(G0); FREEMPI(G1); FREEMPI(GC); return; } }else{ printf("a has a root between 0 and 1\n"); return; } FREEMPI(G0); FREEMPI(G1); FREEMPI(GC); FREEMPI(ONE); FREEMPI(DIFF); /* now P has exactly one positve root and it's > 1 */ LAGRANGE(P, AA, M); DELETEPI(P); FREEMPI(M); return; } /* void EUCLID(MPI *Aptr, MPI *Bptr, MPIA *Q, MPIA *R, MPIA *S, MPIA *T, MPI **Dptr) */ void EUCLID_W(Stack s) { MPI *Aptr = stackPop(s); MPI *Bptr = stackPop(s); MPIA *Q = stackPop(s); MPIA *R = stackPop(s); MPIA *S = stackPop(s); MPIA *T = stackPop(s); MPI **Dptr = stackPop(s); EUCLID(Aptr, Bptr, Q, R, S, T, Dptr); FREEMPI(Aptr); FREEMPI(Bptr); } /*void CONVERGENTS(MPIA A, MPIA *P, MPIA *Q) */ void CONVERGENTS_W(Stack s) { MPIA A = stackPop(s); MPIA *P = stackPop(s); MPIA *Q = stackPop(s); CONVERGENTS(A, P, Q); } /* MPI *EUCLIDI(MPI *Pptr, MPI *Qptr, MPI **Hptr, MPI **Kptr) */ MPI *EUCLIDI_W(Stack s) { MPI *P = stackPop(s); MPI *Q = stackPop(s); MPI **H = stackPop(s); MPI **K = stackPop(s); MPI *Result = EUCLIDI(P,Q,H,K); FREEMPI(P); FREEMPI(Q); return Result; } /*MPI *JACOB(MPI *M, MPI *N) */ MPI *JACOB_W(Stack s) { MPI *M = stackPop(s); MPI *N = stackPop(s); MPI *Result = JACOB(M, N); FREEMPI(M); FREEMPI(N); return Result; } /* MPI *SQRTMX(MPI *x, MPI *p) */ MPI *SQRTMX_W(Stack s) { MPI *x = stackPop(s); MPI *p = stackPop(s); MPI *Result=SQRTMX(x, p); if (Result == NULL) rettype=FUNC_FAIL; FREEMPI(x); FREEMPI(p); return Result; } /* MPI *GCD_ARRAY(MPIA M) */ MPI *GCD_ARRAY_W(Stack s) { MPIA M = stackPop(s); return GCD_ARRAY(M); } /* MPI *GCD_ARRAYVX(MPIA M, MPIA *Y) */ MPI *GCD_ARRAYVX_W(Stack s) { MPIA M = stackPop(s); MPIA* Y = stackPop(s); return GCD_ARRAYVX(M, Y); } /* MPI *CONGRX(MPI *A, MPI *B, MPI *M, MPI **N) */ MPI *CONGRX_W(Stack s) { MPI *A= stackPop(s); MPI *B= stackPop(s); MPI *M= stackPop(s); MPI **N= stackPop(s); MPI *Result=CONGRX(A, B, M, N); if (Result == NULL) rettype = FUNC_FAIL; /* do not print value. see parse.y */ FREEMPI(A); FREEMPI(B); FREEMPI(M); return Result; } /* MPI *CHINESEX(MPI *A, MPI *B, MPI *M, MPI *N, MPI **Mptr) */ MPI *CHINESEX_W(Stack s) { MPI *A = stackPop(s); MPI *B = stackPop(s); MPI *M = stackPop(s); MPI *N = stackPop(s); MPI **Mptr = stackPop(s); MPI *Result=CHINESEX(A, B, M, N, Mptr); if (Result == NULL) rettype = FUNC_FAIL; FREEMPI(A); FREEMPI(B); FREEMPI(M); FREEMPI(N); return Result; } /* MPI *CHINESE_ARRAYX(MPIA A, MPIA M, MPI **Mptr) */ MPI *CHINESE_ARRAYX_W(Stack s) { MPIA A = stackPop(s); MPIA M = stackPop(s); MPI **Mptr = stackPop(s); MPI *Result=CHINESE_ARRAYX(A, M, Mptr); return Result; } /* MPI *BIG_MTHROOTX(MPI *Aptr, MPI *M) */ MPI *BIG_MTHROOTX_W(Stack s) { MPI *Aptr = stackPop(s); MPI *M = stackPop(s); MPI *Result=BIG_MTHROOTX(Aptr, M); if (Result == NULL) rettype = FUNC_FAIL; FREEMPI(Aptr); FREEMPI(M); return Result; } /* MPI *FUND_UNITX(MPI *D, MPI **Xptr, MPI **Yptr) */ MPI *FUND_UNITX_W(Stack s) { MPI *D = stackPop(s); MPI **Xptr = stackPop(s); MPI **Yptr = stackPop(s); MPI *Result=FUND_UNITX(D, Xptr, Yptr); if (Result == NULL) rettype = FUNC_FAIL; FREEMPI(D); return Result; } /* MPI *PELX(MPI *D, MPI *E, MPI **Xptr, MPI **Yptr) */ MPI *PELX_W(Stack s) { MPI *D = stackPop(s); MPI *E = stackPop(s); MPI **Xptr = stackPop(s); MPI **Yptr = stackPop(s); MPI *Result=PELX(D, E, Xptr, Yptr); if (Result == NULL) rettype = FUNC_FAIL; FREEMPI(D); FREEMPI(E); return Result; } /* MPI *SURDX(MPI *D, MPI *T, MPI *U, MPI *V, MPIA *A_ARRAY, MPIA *U_ARRAY, MPIA *V_ARRAY, MPIA *P_ARRAY, MPIA *Q_ARRAY) */ MPI *SURDX_W(Stack s) { MPI *D = stackPop(s); MPI *T = stackPop(s); MPI *U = stackPop(s); MPI *V = stackPop(s); MPIA *A_ARRAY = stackPop(s); MPIA *U_ARRAY = stackPop(s); MPIA *V_ARRAY = stackPop(s); MPIA *P_ARRAY = stackPop(s); MPIA *Q_ARRAY = stackPop(s); MPI *Result=SURDX(D, T, U, V, A_ARRAY, U_ARRAY, V_ARRAY, P_ARRAY, Q_ARRAY); if (Result == NULL) rettype = FUNC_FAIL; FREEMPI(D); FREEMPI(T); FREEMPI(U); FREEMPI(V); return Result; } /* MPI *PATZX(MPI *D, MPI *N)*/ void PATZ_W(Stack s) { MPI *D = stackPop(s); MPI *N = stackPop(s); MPI *Result = PATZX(D, N); if (Result == NULL) rettype = FUNC_FAIL; FREEMPI(Result); FREEMPI(D); FREEMPI(N); return; } /* MPI *MPOWERX(MPI *Aptr, MPI *Bptr, MPI *Cptr) */ MPI *MPOWERX_W(Stack s) { MPI *Aptr = stackPop(s); MPI *Bptr = stackPop(s); MPI *Cptr = stackPop(s); MPI *Result=MPOWERX(Aptr, Bptr, Cptr); if (Result == NULL) rettype = FUNC_FAIL; FREEMPI(Aptr); FREEMPI(Bptr); FREEMPI(Cptr); return Result; } /* MPI *Nextprime(MPI *N) */ MPI *Nextprime_W(Stack s) { MPI *N = stackPop(s); MPI *Result=Nextprime(N); if (Result == NULL) rettype = FUNC_FAIL; FREEMPI(N); return Result; } /* MPI *INVERSEMX(MPI *A, MPI *M) */ MPI *INVERSEMX_W(Stack s) { MPI *A = stackPop(s); MPI *M = stackPop(s); MPI *Result=INVERSEMX(A, M); if (Result == NULL) rettype = FUNC_FAIL; FREEMPI(A); FREEMPI(M); return Result; } /* MPI *FACTORX(MPI *N) */ MPI *FACTORX_W(Stack s) { MPI *N = stackPop(s); MPI *Result=FACTORX(N); if (Result == NULL) rettype = FUNC_FAIL; FREEMPI(N); return Result; } /* MPI *DIVISORX(MPI *N) */ MPI *DIVISORX_W(Stack s) { MPI *N = stackPop(s); MPI *Result=DIVISORX(N); if (Result == NULL) rettype = FUNC_FAIL; FREEMPI(N); return Result; } /* MPI *MOBIUSX(MPI *N) */ MPI *MOBIUSX_W(Stack s) { MPI *N = stackPop(s); MPI *Result=MOBIUSX(N); if (Result == NULL) rettype = FUNC_FAIL; FREEMPI(N); return Result; } /* MPI *EULERX(MPI *N) */ MPI *EULERX_W(Stack s) { MPI *N = stackPop(s); MPI *Result=EULERX(N); if (Result == NULL) rettype = FUNC_FAIL; FREEMPI(N); return Result; } /* MPI *SIGMAX(MPI *N) */ MPI *SIGMAX_W(Stack s) { MPI *N = stackPop(s); MPI *Result=SIGMAX(N); if (Result == NULL) rettype = FUNC_FAIL; FREEMPI(N); return Result; } /* MPI *LPRIMROOTX(MPI *P) */ MPI *LPRIMROOTX_W(Stack s) { MPI *N = stackPop(s); MPI *Result=LPRIMROOTX(N); if (Result == NULL) rettype = FUNC_FAIL; FREEMPI(N); return Result; } /* MPI *ORDERMX(MPI *A, MPI *M*/ MPI *ORDERMX_W(Stack s) { MPI *A = stackPop(s); MPI *M = stackPop(s); MPI *Result=ORDERMX(A,M); if (Result == NULL) rettype = FUNC_FAIL; FREEMPI(A); FREEMPI(M); return Result; } /* MPI *LUCASX(MPI *N) */ MPI *LUCASX_W(Stack s) { MPI *N = stackPop(s); MPI *Result=LUCASX(N); if (Result == NULL) rettype = FUNC_FAIL; FREEMPI(N); return Result; } /* MPI *LENGTHX(MPI *N) */ MPI *LENGTHX_W(Stack s) { MPI *N = stackPop(s); MPI *Result=LENGTHX(N); FREEMPI(N); return Result; } /* MPI *RSAE(MPI *Pptr, MPI *Qptr) */ MPI *RSAE_W(Stack s) { MPI *P = stackPop(s); MPI *Q = stackPop(s); MPI *Result=RSAEX(P, Q); if (Result == NULL) printf("either p or q is not a prime <= 355142\n"); rettype = FUNC_FAIL; FREEMPI(P); FREEMPI(Q); return Result; } /* MPI *NEXTPRIMEAPX(MPI *A, MPI *B, MPI *M) */ MPI *NEXTPRIMEAPX_W(Stack s) { MPI *A = stackPop(s); MPI *B = stackPop(s); MPI *M = stackPop(s); MPI *Result=NEXTPRIMEAPX(A, B, M); if (Result == NULL) rettype = FUNC_FAIL; FREEMPI(A); FREEMPI(B); FREEMPI(M); return Result; } /* MPI *POLLARD(MPI *Nptr) */ MPI *POLLARD_W(Stack s) { MPI *N = stackPop(s); MPI *Result=POLLARD(N); FREEMPI(N); return Result; } /* MPI *EFACTORX(MPI *N, MPI *M, MPI *P) */ MPI *EFACTORX_W(Stack s) { MPI *N = stackPop(s); MPI *M = stackPop(s); MPI *P = stackPop(s); MPI *Result=EFACTORX(N, M, P); if (Result == NULL) rettype = FUNC_FAIL; FREEMPI(N); FREEMPI(M); FREEMPI(P); return Result; } /* MPI *PERFECT_POWER(MPI *N) */ MPI *PERFECT_POWER_W(Stack s) { MPI *N = stackPop(s); MPI *Result=PERFECT_POWER(N); FREEMPI(N); return Result; } /*MPI *LEASTQNRX(MPI *P) */ MPI *LEASTQNRX_W(Stack s) { MPI *P = stackPop(s); MPI *Result=LEASTQNRX(P); FREEMPI(P); if (Result == NULL) rettype = FUNC_FAIL; return Result; } MPI* CONTENTPI2_W(Stack s) { POLYI P = stackPop(s); MPI *Result = CONTENTPI2(P); DELETEPI(P); return Result; } /* void COLLATZ(MPI *Dptr, MPI *Eptr) */ void COLLATZ_W(Stack s) { MPI *D = stackPop(s); MPI *E = stackPop(s); COLLATZ(D, E); FREEMPI(D); FREEMPI(E); } /* void MTHROOTX(MPI *Aptr, MPI *Bptr, MPI *M, MPI *R) */ void MTHROOTX_W(Stack s) { MPI *A = stackPop(s); MPI *B = stackPop(s); MPI *M = stackPop(s); MPI *R = stackPop(s); MTHROOTX(A, B, M, R); FREEMPI(A); FREEMPI(B); FREEMPI(M); FREEMPI(R); } /* void MILLERX(MPI *N, MPI *B) */ void MILLERX_W(Stack s) { MPI *N = stackPop(s); MPI *B = stackPop(s); MILLERX(N, B); FREEMPI(N); FREEMPI(B); } /* void JUGGLER(MPI *Dptr, MPI *Iptr) */ void JUGGLER_W(Stack s) { MPI *D = stackPop(s); MPI *I = stackPop(s); JUGGLER(D, I); FREEMPI(D); FREEMPI(I); } /* void ENCODE(MPI *Eptr, MPI *Rptr) */ void ENCODE_W(Stack s) { MPI *E = stackPop(s); MPI *R = stackPop(s); ENCODE(E, R); FREEMPI(E); FREEMPI(R); } /* void DECODEX(MPI *Eptr, MPI *Pptr, MPI *Qptr) */ void DECODEX_W(Stack s) { MPI *E = stackPop(s); MPI *P = stackPop(s); MPI *Q = stackPop(s); DECODEX(E, P, Q); FREEMPI(E); FREEMPI(P); FREEMPI(Q); } /* void SCHNORRGCD(MPI *N) */ void SCHNORRGCD_W(Stack s) { MPI *N = stackPop(s); SCHNORRGCD(N); FREEMPI(N); } /* void SCHNORRHERMITE(MPI *N) */ void SCHNORRHERMITE_W(Stack s) { MPI *N = stackPop(s); SCHNORRHERMITE(N); FREEMPI(N); } POLYI PRIMITIVEPI_W(Stack s) { POLYI P = stackPop(s); POLYI Result=PRIMITIVEPI(P); DELETEPI(P); return Result; } /* MPI *CORNACCHIAX(MPI *A, MPI *B, MPI *M) */ void CORNACCHIA_W(Stack S) { MPI *A = stackPop(S); MPI *B = stackPop(S); MPI *M = stackPop(S); MPI *Result = CORNACCHIAX(A, B, M); if (Result == NULL) rettype = FUNC_FAIL; FREEMPI(Result); FREEMPI(A); FREEMPI(B); FREEMPI(M); return; } MPI *SQROOT_W(Stack S) { MPI *Tmp; USI ll; MPI *A = stackPop(S); MPI *N = stackPop(S); MPIA *Y = stackPop(S); MPI **M = stackPop(S); MPI **L = stackPop(S); MPI *R = SQROOTX(A, N, Y, M, &ll); FREEMPI(A); FREEMPI(N); if (R == NULL) rettype = FUNC_FAIL; else{ *L = CHANGE((USL)ll); if(EQMINUSONEI(R)){ Tmp = R; R = ZEROI(); FREEMPI(Tmp); } } return (R); } MPI *QUADRATIC_W(Stack S) { MPI *A, *B, *C, *N, *R; MPIA *Y; A = stackPop(S); B = stackPop(S); C = stackPop(S); N = stackPop(S); Y = stackPop(S); R = QUADRATICX(A, B, C, N, Y); FREEMPI(A); FREEMPI(B); FREEMPI(C); FREEMPI(N); if (R == NULL){ R = ZEROI(); rettype = FUNC_FAIL; } return (R); } /* void BINARYFORM_W(Stack S) { MPI *A, *B, *C, *N; A = stackPop(S); B = stackPop(S); C = stackPop(S); N = stackPop(S); BINARYFORM(A, B, C, N); FREEMPI(A); FREEMPI(B); FREEMPI(C); FREEMPI(N); return; } */ void GAUSS_W(Stack S) { MPI *A, *B, *C, *N, **alpha, **gamma, **M; A = stackPop(S); B = stackPop(S); C = stackPop(S); N = stackPop(S); alpha = stackPop(S); gamma = stackPop(S); M = stackPop(S); GAUSS(A, B, C, N, alpha, gamma, M); FREEMPI(A); FREEMPI(B); FREEMPI(C); FREEMPI(N); return; } void BINFORM_W(Stack S) { MPI *A, *B, *C, *N, *V; A = stackPop(S); B = stackPop(S); C = stackPop(S); N = stackPop(S); V = stackPop(S); BINARYFORM1(A, B, C, N, V); FREEMPI(A); FREEMPI(B); FREEMPI(C); FREEMPI(N); FREEMPI(V); return; } MPI *HALFMOD_W(Stack S) { MPI *A, *B, *R; A = stackPop(S); B = stackPop(S); R = HALFMODX(A, B); FREEMPI(A); FREEMPI(B); if (R == NULL){ rettype = FUNC_FAIL; } return (R); } /* MPI *LOGX(MPI *A, MPI *B, MPI *D, MPI *R, MPIA *M, MPI **L) */ void LOG_W(Stack s) { MPI *A = stackPop(s); MPI *B = stackPop(s); MPI *D = stackPop(s); MPI *R = stackPop(s); MPIA *M = stackPop(s); MPI **L = stackPop(s); MPI *Z; Z = LOGX(A, B, D, R, M, L); if (Z == NULL) rettype = FUNC_FAIL; else FREEMPI(Z); FREEMPI(A); FREEMPI(B); FREEMPI(D); FREEMPI(R); } /* MPI *CEILINGIX(MPI *A, MPI *B) */ MPI *CEILINGI_W(Stack s) { MPI *A = stackPop(s); MPI *B = stackPop(s); MPI *Z = CEILINGIX(A,B); if (Z == NULL) rettype = FUNC_FAIL; FREEMPI(A); FREEMPI(B); return(Z); } /*void TESTLOG1(MPI *A, MPI *B, MPI *D, MPI *R)*/ void TESTLOG1_W(Stack s) { MPI *A = stackPop(s); MPI *B = stackPop(s); MPI *D = stackPop(s); MPI *R = stackPop(s); TESTLOG1(A, B, D, R); FREEMPI(A); FREEMPI(B); FREEMPI(D); FREEMPI(R); } /*void TESTLOGX(MPI *A, MPI *B, MPI *D, MPI *M, MPI *N)*/ void TESTLOG_W(Stack s) { MPI *A = stackPop(s); MPI *B = stackPop(s); MPI *D = stackPop(s); MPI *M = stackPop(s); MPI *N = stackPop(s); MPI *Z; Z = TESTLOGX(A, B, D, M, N); if (Z == NULL) rettype = FUNC_FAIL; else FREEMPI(Z); FREEMPI(A); FREEMPI(B); FREEMPI(D); FREEMPI(M); FREEMPI(N); } /* MPI *SUBRESULTANT(POLYI P, POLY Q) */ MPI *SUBRESULTANT_W(Stack s) { MPI *Result; POLYI P = stackPop(s); POLYI Q = stackPop(s); if(DEGREEPI(P)<=0){ printf("First argument is a constant\n"); rettype = FUNC_FAIL; } if(DEGREEPI(Q)<=0){ printf("Second argument is a constant\n"); rettype = FUNC_FAIL; } Result=SUBRESULTANT(P, Q); DELETEPI(P); DELETEPI(Q); return Result; } /* MPI *DISCRIMINANTPI(POLYI Pptr)*/ MPI *DISCRIMINANTPI_W(Stack s){ MPI *Result; POLYI P = stackPop(s); if(DEGREEPI(P)<=1){ printf("argument has form aX+b\n"); rettype = FUNC_FAIL; } Result=DISCRIMINANTPI(P); DELETEPI(P); return Result; } /* POLYI DERIVPI(POLYI Pptr) */ POLYI DERIVPI_W(Stack s){ POLYI Result; POLYI P = stackPop(s); Result = DERIVPI(P); DELETEPI(P); return Result; } /* MPI *PRIME_GENERATORX(MPI *M, MPI *N) */ MPI *PRIME_GENERATOR_W(Stack s){ MPI *Result; MPI *M = stackPop(s); MPI *N = stackPop(s); Result = PRIME_GENERATORX(M, N); if (Result == NULL){ FREEMPI(M); FREEMPI(N); rettype = FUNC_FAIL; } FREEMPI(M); FREEMPI(N); return(Result); } /* POLYI GCDPI(POLYI Pptr, POLYI Qptr) */ POLYI GCDPI_W(Stack s){ POLYI Result; POLYI P = stackPop(s); POLYI Q = stackPop(s); Result = GCDPI(P, Q); DELETEPI(P); DELETEPI(Q); return Result; } /* MPI *STURM_SEQUENCE(POLYI P, MPI *B, MPI *E)*/ MPI *STURM_SEQUENCE_W(Stack s){ MPI *Result, *TEMP; POLYI R, Q; int d; POLYI P = stackPop(s); MPI *B = stackPop(s); MPI *E = stackPop(s); Q = DERIVPI(P); R = GCDPI(P,Q); d = DEGREEPI(R); DELETEPI(Q); DELETEPI(R); if(d){ printf("P has a multiple root\n"); rettype = FUNC_FAIL; DELETEPI(P); FREEMPI(B); FREEMPI(E); return NULL; }else if(DEGREEPI(P) <2){ printf("P is linear\n"); rettype = FUNC_FAIL; DELETEPI(P); FREEMPI(B); FREEMPI(E); return NULL; }else{ TEMP=VALPI(P, B); d = TEMP->S; FREEMPI(TEMP); if(d==0){ printf("P(b)=0\n"); rettype = FUNC_FAIL; DELETEPI(P); FREEMPI(B); FREEMPI(E); return NULL; }else{ Result = STURM_SEQUENCE(P, B, E); DELETEPI(P); FREEMPI(B); FREEMPI(E); return Result; } } } POLYI CYCLOTOMIC_W(Stack s){ POLYI P; MPI *N = stackPop(s); P = CYCLOTOMIC(N); if(P==NULL){ rettype=FUNC_FAIL; } FREEMPI(N); return(P); } MPI *POS_W(Stack s){ MPI *P; MPI *D = stackPop(s); P = POSX(D); if(P==NULL) rettype=FUNC_FAIL; FREEMPI(D); return(P); } MPI *NEG_W(Stack s){ MPI *H; MPI *D = stackPop(s); MPI *FLAG = stackPop(s); H = NEGX(D, FLAG); if(H==NULL) rettype=FUNC_FAIL; FREEMPI(D); FREEMPI(FLAG); return(H); } MPI *NEARINT_W(Stack s){ MPI *A, *B, *R; A = stackPop(s); B = stackPop(s); R = NEARINTX(A, B); FREEMPI(A); FREEMPI(B); if (R == NULL){ rettype = FUNC_FAIL; } return (R); } MPI *REDUCE_NEG_W(Stack s){ MPI *A, *B, *C, *I; A = stackPop(s); B = stackPop(s); C = stackPop(s); I = REDUCE_NEGX(A, B, C); FREEMPI(A); FREEMPI(B); FREEMPI(C); if (I == NULL){ rettype = FUNC_FAIL; } return(I); } MPI *REDUCE_POS_W(Stack s){ MPI *I; MPI *A = stackPop(s); MPI *B = stackPop(s); MPI *C = stackPop(s); I = REDUCE_POSX(A, B, C); FREEMPI(A); FREEMPI(B); FREEMPI(C); if (I == NULL){ rettype = FUNC_FAIL; } return(I); } MPI *POS0_W(Stack s){ MPI *P; MPI *D = stackPop(s); P = POS0X(D); if(P==NULL) rettype=FUNC_FAIL; FREEMPI(D); return(P); } MPI *TABLENEG_W(Stack s){ MPI *P; MPI *M = stackPop(s); MPI *N = stackPop(s); P = TABLENEGX(M, N); if (P == NULL) rettype=FUNC_FAIL; FREEMPI(M); FREEMPI(N); return(P); } MPI *TABLEPOS_W(Stack s){ MPI *P; MPI *M = stackPop(s); MPI *N = stackPop(s); P = TABLEPOSX(M, N); if (P == NULL) rettype=FUNC_FAIL; FREEMPI(M); FREEMPI(N); return(P); } MPI *DAVISON_W(Stack s){ MPI *T; MPI *L = stackPop(s); MPI *M = stackPop(s); MPI *N = stackPop(s); T = DAVISONX(L, M, N); if (T == NULL) rettype=FUNC_FAIL; FREEMPI(L); FREEMPI(M); FREEMPI(N); return(T); } MPI *RANEY1_W(Stack s){ MPI *T; MPI *P = stackPop(s); MPI *Q = stackPop(s); MPI *R = stackPop(s); MPI *S = stackPop(s); T = RANEY1X(P, Q, R, S); if (T == NULL) rettype=FUNC_FAIL; FREEMPI(P); FREEMPI(Q); FREEMPI(R); FREEMPI(S); return(T); } MPI *UNIMODULAR_W(Stack s){ MPI *T; MPI *P = stackPop(s); MPI *Q = stackPop(s); MPI *R = stackPop(s); MPI *S = stackPop(s); T = UNIMODULARX(P, Q, R, S); if (T == NULL) rettype=FUNC_FAIL; FREEMPI(P); FREEMPI(Q); FREEMPI(R); FREEMPI(S); return(T); } void TWOADICSQRT_W(Stack s){ MPI *T; MPI *A = stackPop(s); MPI *N = stackPop(s); MPIA *DIGITS = stackPop(s); T = TWOADICSQRTX(A, N, DIGITS); if (T == NULL) rettype=FUNC_FAIL; FREEMPI(A); FREEMPI(N); FREEMPI(T); } void PADICSQRT_W(Stack s){ MPI *T; MPI *A = stackPop(s); MPI *N = stackPop(s); MPI *P = stackPop(s); MPIA *DIGITS = stackPop(s); T = PADICSQRTX(A, N, P, DIGITS); if (T == NULL) rettype=FUNC_FAIL; FREEMPI(A); FREEMPI(N); FREEMPI(P); FREEMPI(T); } MPI *SIGMAK_W(Stack s){ MPI *T; MPI *K = stackPop(s); MPI *N = stackPop(s); T = SIGMAKX(K, N); if (T == NULL) rettype=FUNC_FAIL; FREEMPI(K); FREEMPI(N); return(T); } MPI *TAU_W(Stack s){ MPI *T; MPI *N = stackPop(s); T = TAUX(N); if (T == NULL) rettype=FUNC_FAIL; FREEMPI(N); return(T); } MPI *TAU_PRIMEPOWER_W(Stack s){ MPI *T; MPI *N = stackPop(s); MPI *P = stackPop(s); T = TAU_PRIMEPOWERX(N, P); if (T == NULL) rettype=FUNC_FAIL; FREEMPI(N); FREEMPI(P); return(T); } MPI *TAU_COMPOSITE_W(Stack s){ MPI *T; MPI *N = stackPop(s); T = TAU_COMPOSITEX(N); if (T == NULL) rettype=FUNC_FAIL; FREEMPI(N); return(T); } MPI *REP_DEFINITE_W(Stack s){ MPI *A, *B, *C, *M, *PRINT_FLAG, *I; A = stackPop(s); B = stackPop(s); C = stackPop(s); M = stackPop(s); PRINT_FLAG = stackPop(s); I = REP_DEFINITEX(A, B, C, M, PRINT_FLAG); FREEMPI(A); FREEMPI(B); FREEMPI(C); FREEMPI(M); FREEMPI(PRINT_FLAG); if (I == NULL){ rettype = FUNC_FAIL; } return(I); } void POWERD_W(Stack s) { MPI *A=stackPop(s); MPI *B=stackPop(s); MPI *D=stackPop(s); MPI *N=stackPop(s); MPI **AA=stackPop(s); MPI **BB=stackPop(s); POWERD(A, B, D, N, AA, BB); FREEMPI(A); FREEMPI(B); FREEMPI(D); FREEMPI(N); } MPI *EUCLIDI1_W(Stack s) { MPI *Aptr = stackPop(s); MPI *Bptr = stackPop(s); MPI *Result; if(Aptr->S <= 0){ Result = ZEROI(); printf("A <= 0\n"); }else if(Bptr->S <= 0){ Result = ZEROI(); printf("B <= 0\n"); }else{ Result = EUCLIDI1(Aptr, Bptr); } FREEMPI(Aptr); FREEMPI(Bptr); return Result; } MPI *CFRACN_W(Stack s) { MPI *TEMP1, *TEMP2; MPI *N=stackPop(s); if(N->S<0){ printf("n < 0\n"); FREEMPI(N); return(ZEROI()); }else{ MPI *M = CFRACN(N); printf ("the continued fraction expansion of sqrt(2^"); TEMP1 = MULT_I(N, 2); TEMP2 = ADD0_I(TEMP1, 1); PRINTI(TEMP2); FREEMPI(TEMP1); FREEMPI(TEMP2); printf(") has period-length "); PRINTI(M); FREEMPI(N); printf("\n"); return(M); } } MPI *CFRAC_PERIOD_W(Stack s) { USI t; MPI *P, *X, *Y; MPI *D=stackPop(s); X= BIG_MTHROOT(D, 2); Y = MULTI(X, X); t = EQUALI(D, Y); FREEMPI(X); FREEMPI(Y); if(t){ printf("D is a square\n"); FREEMPI(D); return(ZEROI()); } P = CFRAC_PERIOD(D); FREEMPI(D); return(P); }